feat: add automated promotion workflow for stable releases

- Add GitHub Actions workflow for one-click promotion to stable
- Supports patch/minor/major version bumps
- Automatically merges main to stable and handles version updates
- Eliminates manual git operations for stable releases
This commit is contained in:
Brian Madison
2025-08-15 20:17:49 -05:00
parent e0dcbcf527
commit fb02234b59

116
.github/workflows/promote-to-stable.yml vendored Normal file
View File

@@ -0,0 +1,116 @@
name: Promote to Stable
on:
workflow_dispatch:
inputs:
version_bump:
description: 'Version bump type'
required: true
default: 'minor'
type: choice
options:
- patch
- minor
- major
jobs:
promote:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
- name: Configure Git
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
- name: Switch to stable branch
run: |
git checkout stable
git pull origin stable
- name: Merge main into stable
run: |
git merge origin/main --no-edit
- name: Install dependencies
run: npm ci
- name: Get current version and calculate new version
id: version
run: |
# Get current version from package.json
CURRENT_VERSION=$(node -p "require('./package.json').version")
echo "current_version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
# Remove beta suffix if present
BASE_VERSION=$(echo $CURRENT_VERSION | sed 's/-beta\.[0-9]\+//')
echo "base_version=$BASE_VERSION" >> $GITHUB_OUTPUT
# Calculate new version based on bump type
IFS='.' read -ra VERSION_PARTS <<< "$BASE_VERSION"
MAJOR=${VERSION_PARTS[0]}
MINOR=${VERSION_PARTS[1]}
PATCH=${VERSION_PARTS[2]}
case "${{ github.event.inputs.version_bump }}" in
"major")
NEW_VERSION="$((MAJOR + 1)).0.0"
;;
"minor")
NEW_VERSION="$MAJOR.$((MINOR + 1)).0"
;;
"patch")
NEW_VERSION="$MAJOR.$MINOR.$((PATCH + 1))"
;;
*)
NEW_VERSION="$BASE_VERSION"
;;
esac
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
echo "Promoting from $CURRENT_VERSION to $NEW_VERSION"
- name: Update package.json versions
run: |
# Update main package.json
npm version ${{ steps.version.outputs.new_version }} --no-git-tag-version
# Update installer package.json
sed -i 's/"version": ".*"/"version": "${{ steps.version.outputs.new_version }}"/' tools/installer/package.json
- name: Update package-lock.json
run: npm install --package-lock-only
- name: Commit stable release
run: |
git add .
git commit -m "release: promote to stable ${{ steps.version.outputs.new_version }}
- Promote beta features to stable release
- Update version from ${{ steps.version.outputs.current_version }} to ${{ steps.version.outputs.new_version }}
- Automated promotion via GitHub Actions"
- name: Push stable release
run: git push origin stable
- name: Switch back to main
run: git checkout main
- name: Summary
run: |
echo "🎉 Successfully promoted to stable!"
echo "📦 Version: ${{ steps.version.outputs.new_version }}"
echo "🚀 The stable release will be automatically published to NPM via semantic-release"
echo "✅ Users running 'npx bmad-method install' will now get version ${{ steps.version.outputs.new_version }}"