Create Release Proposal #16
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Create 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 (major, minor, patch) or specify custom version' | |
| required: true | |
| default: 'patch' | |
| type: choice | |
| options: | |
| - patch | |
| - minor | |
| - major | |
| - custom | |
| custom_version: | |
| description: 'Custom version string (e.g., v0.1.1). Only used if version_type is "custom". MUST start with "v"' | |
| 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 }} | |
| 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 for processing | |
| current_version=${LATEST_TAG#v} | |
| 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 into parts | |
| IFS='.' read -r major minor patch <<< "$current_version" | |
| # 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 | |
| update-version: | |
| name: 📝 Update Version | |
| 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: Create version bump branch and PR | |
| env: | |
| NEW_VERSION: ${{ needs.calculate-next-version.outputs.new_version }} | |
| GITHUB_TOKEN: ${{ secrets.ADMIN_PAT }} | |
| SOURCE_BRANCH: ${{ needs.calculate-next-version.outputs.source_branch }} | |
| TARGET_BRANCH: ${{ github.event.inputs.target_branch }} | |
| run: | | |
| set -ex | |
| # Extract version without v prefix | |
| 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 Cargo.toml | |
| echo "Updating Cargo.toml to version: $new_cargo_version" | |
| sed -i -E "s/^version\s*=\s*\"[0-9a-zA-Z.-]+\"/version = \"$new_cargo_version\"/" Cargo.toml | |
| # Update Cargo.lock | |
| cargo update --package quantus-cli | |
| # 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 "ci: Automate version bump to $NEW_VERSION" | |
| git push origin "$branch_name" | |
| PR_TITLE="ci: Automate version bump to $NEW_VERSION" | |
| # Prepare labels | |
| PR_LABELS="automated,release-proposal" | |
| if [[ "${{ github.event.inputs.is_draft }}" == "true" ]]; then | |
| PR_LABELS="$PR_LABELS,draft-release" | |
| fi | |
| gh pr create \ | |
| --title "$PR_TITLE" \ | |
| --body "$(printf "Automated version bump for release %s.\\n\\n%s\\n\\nTriggered by workflow run: %s\\n\\nType: %s" "$NEW_VERSION" "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" "${{ github.event.inputs.version_type }}")" \ | |
| --base "$TARGET_BRANCH" \ | |
| --head "$branch_name" \ | |
| --label "$PR_LABELS" |