name: Auto Version on: pull_request: types: [closed] branches: [main] jobs: version: # Only run if PR was merged (not just closed) if: github.event.pull_request.merged == true runs-on: ubuntu-latest permissions: contents: write pull-requests: read steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Python uses: actions/setup-python@v4 with: python-version: '3.9' - name: Configure git run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - name: Determine version bump type id: bump_type run: | PR_TITLE="${{ github.event.pull_request.title }}" echo "PR Title: $PR_TITLE" # Convert to lowercase for case-insensitive matching PR_TITLE_LOWER=$(echo "$PR_TITLE" | tr '[:upper:]' '[:lower:]') # Determine bump type based on PR title prefix if [[ "$PR_TITLE_LOWER" =~ ^(breaking|breaking[[:space:]]change): ]]; then echo "Detected BREAKING CHANGE - major version bump" echo "bump_type=major" >> $GITHUB_OUTPUT echo "should_bump=true" >> $GITHUB_OUTPUT elif [[ "$PR_TITLE_LOWER" =~ ^feat: ]]; then echo "Detected new feature - minor version bump" echo "bump_type=minor" >> $GITHUB_OUTPUT echo "should_bump=true" >> $GITHUB_OUTPUT elif [[ "$PR_TITLE_LOWER" =~ ^(fix|perf|refactor): ]]; then echo "Detected fix/perf/refactor - patch version bump" echo "bump_type=patch" >> $GITHUB_OUTPUT echo "should_bump=true" >> $GITHUB_OUTPUT elif [[ "$PR_TITLE_LOWER" =~ ^(docs|chore|test|ci|style): ]]; then echo "Detected non-versioned change - no version bump" echo "bump_type=none" >> $GITHUB_OUTPUT echo "should_bump=false" >> $GITHUB_OUTPUT else: echo "No recognized prefix - no version bump" echo "bump_type=none" >> $GITHUB_OUTPUT echo "should_bump=false" >> $GITHUB_OUTPUT fi - name: Get current version if: steps.bump_type.outputs.should_bump == 'true' id: current_version run: | CURRENT_VERSION=$(python -c "from config import __version__; print(__version__)") echo "Current version: $CURRENT_VERSION" echo "version=$CURRENT_VERSION" >> $GITHUB_OUTPUT - name: Bump version if: steps.bump_type.outputs.should_bump == 'true' id: new_version run: | python scripts/bump_version.py ${{ steps.bump_type.outputs.bump_type }} NEW_VERSION=$(python -c "from config import __version__; print(__version__)") echo "New version: $NEW_VERSION" echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT - name: Commit version change if: steps.bump_type.outputs.should_bump == 'true' run: | git add config.py git commit -m "chore: bump version to ${{ steps.new_version.outputs.version }} Automated version bump from PR #${{ github.event.pull_request.number }} ${{ github.event.pull_request.title }} Co-authored-by: ${{ github.event.pull_request.user.login }} <${{ github.event.pull_request.user.id }}+${{ github.event.pull_request.user.login }}@users.noreply.github.com>" git push - name: Create git tag if: steps.bump_type.outputs.should_bump == 'true' run: | git tag -a "v${{ steps.new_version.outputs.version }}" -m "Release v${{ steps.new_version.outputs.version }} Changes in this release: - ${{ github.event.pull_request.title }} PR: #${{ github.event.pull_request.number }} Author: @${{ github.event.pull_request.user.login }}" git push origin "v${{ steps.new_version.outputs.version }}" - name: Generate release notes if: steps.bump_type.outputs.should_bump == 'true' id: release_notes run: | # Extract PR body for release notes PR_BODY=$(cat << 'EOF' ${{ github.event.pull_request.body }} EOF ) # Create release notes RELEASE_NOTES=$(cat << EOF ## What's Changed ${{ github.event.pull_request.title }} by @${{ github.event.pull_request.user.login }} in #${{ github.event.pull_request.number }} ### Details $PR_BODY ### Version Info - Previous version: ${{ steps.current_version.outputs.version }} - New version: ${{ steps.new_version.outputs.version }} - Bump type: ${{ steps.bump_type.outputs.bump_type }} **Full Changelog**: https://github.com/${{ github.repository }}/compare/v${{ steps.current_version.outputs.version }}...v${{ steps.new_version.outputs.version }} EOF ) # Save to file for GitHub release echo "$RELEASE_NOTES" > release_notes.md - name: Create GitHub release if: steps.bump_type.outputs.should_bump == 'true' uses: softprops/action-gh-release@v1 with: tag_name: v${{ steps.new_version.outputs.version }} name: Release v${{ steps.new_version.outputs.version }} body_path: release_notes.md draft: false prerelease: false generate_release_notes: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Summary run: | if [ "${{ steps.bump_type.outputs.should_bump }}" == "true" ]; then echo "### ✅ Version Bumped Successfully" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "- **Previous version**: ${{ steps.current_version.outputs.version }}" >> $GITHUB_STEP_SUMMARY echo "- **New version**: ${{ steps.new_version.outputs.version }}" >> $GITHUB_STEP_SUMMARY echo "- **Bump type**: ${{ steps.bump_type.outputs.bump_type }}" >> $GITHUB_STEP_SUMMARY echo "- **Tag**: v${{ steps.new_version.outputs.version }}" >> $GITHUB_STEP_SUMMARY echo "- **PR**: #${{ github.event.pull_request.number }}" >> $GITHUB_STEP_SUMMARY else echo "### ℹ️ No Version Bump Required" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "PR title prefix did not require a version bump." >> $GITHUB_STEP_SUMMARY echo "- **PR**: #${{ github.event.pull_request.number }}" >> $GITHUB_STEP_SUMMARY echo "- **Title**: ${{ github.event.pull_request.title }}" >> $GITHUB_STEP_SUMMARY fi