200 lines
6.9 KiB
YAML
200 lines
6.9 KiB
YAML
---
|
|
name: Release Proposal
|
|
|
|
env:
|
|
CARGO_TERM_COLOR: always
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
target_branch:
|
|
description: "Target branch for the PR (default: main)"
|
|
required: false
|
|
type: string
|
|
default: "main"
|
|
version_type:
|
|
description: "Type of version bump"
|
|
required: true
|
|
default: "patch"
|
|
type: choice
|
|
options:
|
|
- patch
|
|
- minor
|
|
- major
|
|
- custom
|
|
custom_version:
|
|
description: 'Custom version string (e.g., 1.2.3). Only used if version_type is "custom".'
|
|
required: false
|
|
is_draft:
|
|
description: "Is this a draft release?"
|
|
required: true
|
|
type: boolean
|
|
default: false
|
|
|
|
jobs:
|
|
calculate-next-version:
|
|
name: 🧮 Calculate Next Version
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
new_version: ${{ steps.versioner.outputs.new_version }}
|
|
new_tag: ${{ steps.versioner.outputs.new_tag }}
|
|
commit_sha_short: ${{ steps.vars.outputs.commit_sha_short }}
|
|
source_branch: ${{ steps.vars.outputs.source_branch }}
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
fetch-tags: true
|
|
|
|
- name: Get current branch and commit SHA
|
|
id: vars
|
|
run: |
|
|
echo "commit_sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
|
|
echo "source_branch=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_OUTPUT
|
|
|
|
- name: Get latest tag
|
|
id: latest_tag
|
|
run: |
|
|
# Get all version tags and sort them by version
|
|
latest_semver_tag=$(git tag -l "v[0-9]*.[0-9]*.[0-9]*" | sort -V | tail -n 1)
|
|
|
|
# If no tags found, use default
|
|
if [ -z "$latest_semver_tag" ]; then
|
|
latest_semver_tag="v0.0.0"
|
|
fi
|
|
|
|
echo "latest_tag_found=$latest_semver_tag" >> $GITHUB_OUTPUT
|
|
echo "Latest semantic version tag found: $latest_semver_tag"
|
|
|
|
- name: Calculate new version
|
|
id: versioner
|
|
env:
|
|
LATEST_TAG: ${{ steps.latest_tag.outputs.latest_tag_found }}
|
|
VERSION_TYPE: ${{ github.event.inputs.version_type }}
|
|
CUSTOM_VERSION: ${{ github.event.inputs.custom_version }}
|
|
run: |
|
|
# Remove 'v' prefix and any suffix for processing
|
|
current_version=${LATEST_TAG#v}
|
|
# Remove any suffix after the version number
|
|
current_version=$(echo "$current_version" | sed -E 's/-[^-]+$//')
|
|
|
|
if [[ "$VERSION_TYPE" == "custom" ]]; then
|
|
if [[ -z "$CUSTOM_VERSION" ]]; then
|
|
echo "Error: Custom version is selected but no custom_version string provided."
|
|
exit 1
|
|
fi
|
|
if [[ ! "$CUSTOM_VERSION" =~ ^v ]]; then
|
|
echo "Error: Custom version string MUST start with 'v' (e.g., v1.2.3)."
|
|
exit 1
|
|
fi
|
|
new_version="$CUSTOM_VERSION"
|
|
else
|
|
# Split version and pre-release part
|
|
IFS='-' read -r version_core prerelease_part <<< "$current_version"
|
|
IFS='.' read -r major minor patch <<< "$version_core"
|
|
|
|
# Increment based on type
|
|
if [[ "$VERSION_TYPE" == "major" ]]; then
|
|
major=$((major + 1))
|
|
minor=0
|
|
patch=0
|
|
elif [[ "$VERSION_TYPE" == "minor" ]]; then
|
|
minor=$((minor + 1))
|
|
patch=0
|
|
elif [[ "$VERSION_TYPE" == "patch" ]]; then
|
|
patch=$((patch + 1))
|
|
else
|
|
echo "Error: Invalid version_type: $VERSION_TYPE"
|
|
exit 1
|
|
fi
|
|
new_version="v$major.$minor.$patch"
|
|
fi
|
|
|
|
echo "New version: $new_version"
|
|
echo "new_version=$new_version" >> $GITHUB_OUTPUT
|
|
echo "new_tag=$new_version" >> $GITHUB_OUTPUT
|
|
|
|
update-cargo-toml:
|
|
name: 📝 Update version files
|
|
needs: calculate-next-version
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: write
|
|
pull-requests: write
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Setup rust
|
|
uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
|
|
- name: Create version bump branch and PR
|
|
env:
|
|
NEW_VERSION: ${{ needs.calculate-next-version.outputs.new_version }}
|
|
NEW_TAG: ${{ needs.calculate-next-version.outputs.new_tag }}
|
|
GITHUB_TOKEN: ${{ secrets.ADMIN_PAT }}
|
|
SOURCE_BRANCH: ${{ needs.calculate-next-version.outputs.source_branch }}
|
|
TARGET_BRANCH: ${{ github.event.inputs.target_branch }}
|
|
run: |
|
|
set -ex
|
|
new_cargo_version=${NEW_VERSION#v}
|
|
branch_name="release/${NEW_VERSION}"
|
|
|
|
# Create new branch from source branch
|
|
git checkout "$SOURCE_BRANCH"
|
|
git checkout -b "$branch_name"
|
|
|
|
# Update version in workspace Cargo.toml (safer than cargo set-version)
|
|
echo "Updating workspace Cargo.toml to version: $new_cargo_version"
|
|
sed -i -E "s/^version\s*=\s*\"[0-9a-zA-Z.-]+\"/version = \"$new_cargo_version\"/" Cargo.toml
|
|
|
|
# Regenerate Cargo.lock with precise updates for our packages only
|
|
cargo update -p miner-cli --precise "$new_cargo_version"
|
|
cargo update -p miner-service --precise "$new_cargo_version"
|
|
cargo update -p pow-core --precise "$new_cargo_version"
|
|
cargo update -p metrics --precise "$new_cargo_version"
|
|
cargo update -p miner-telemetry --precise "$new_cargo_version"
|
|
cargo update -p engine-cpu --precise "$new_cargo_version"
|
|
cargo update -p engine-gpu --precise "$new_cargo_version"
|
|
|
|
# Verify everything compiles correctly
|
|
cargo check --workspace
|
|
|
|
# Commit changes
|
|
git config user.name "${{ github.actor }}"
|
|
git config user.email "${{ github.actor }}@users.noreply.github.com"
|
|
|
|
git add Cargo.toml Cargo.lock
|
|
git commit -m "bump version to $NEW_VERSION"
|
|
git push origin "$branch_name"
|
|
|
|
# Prepare PR title and body
|
|
PR_TITLE="Release $NEW_VERSION"
|
|
PR_BODY="Automated version bump for release $NEW_VERSION.
|
|
|
|
## Overview
|
|
- Version bump: ${{ github.event.inputs.version_type }}
|
|
- Type: ${{ github.event.inputs.version_type }}
|
|
- Draft: ${{ github.event.inputs.is_draft }}
|
|
|
|
## What changed
|
|
- Updated version in Cargo.toml and Cargo.lock
|
|
|
|
Triggered by workflow run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
|
|
|
# Prepare labels
|
|
PR_LABELS="release-proposal"
|
|
if [[ "${{ github.event.inputs.is_draft }}" == "true" ]]; then
|
|
PR_LABELS="$PR_LABELS,draft-release"
|
|
fi
|
|
|
|
gh pr create \
|
|
--title "$PR_TITLE" \
|
|
--body "$PR_BODY" \
|
|
--base "$TARGET_BRANCH" \
|
|
--head "$branch_name" \
|
|
--label "$PR_LABELS"
|