name: Release on: workflow_dispatch: inputs: tag: description: 'Release tag (e.g., v0.0.0)' required: true default: 'v0.0.0' type: string confirm: description: 'Type "CONFIRM" to proceed with the release' required: true type: string permissions: contents: write pull-requests: write jobs: validate: runs-on: ubuntu-latest steps: - name: Validate confirmation if: ${{ github.event.inputs.confirm != 'CONFIRM' }} run: | echo "::error::You must type 'CONFIRM' to proceed with the release" exit 1 - name: Validate tag format run: | TAG="${{ github.event.inputs.tag }}" if [[ ! $TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-.*)?$ ]]; then echo "::error::Tag must be in format vX.Y.Z or vX.Y.Z-suffix (e.g., v1.0.0 or v1.0.0-rc1)" exit 1 fi release: needs: validate runs-on: ubuntu-latest outputs: tag: ${{ steps.tag-release.outputs.tag }} steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - name: Configure Git run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - name: Switch to next branch run: | git checkout next git pull origin next - name: Check next branch is up-to-date with main id: branch-check run: | echo "Checking if next branch is up-to-date with main..." # Fetch latest main branch git fetch origin main # Check if next is behind main BEHIND_COUNT=$(git rev-list --count next..origin/main) AHEAD_COUNT=$(git rev-list --count origin/main..next) echo "Next branch is ${AHEAD_COUNT} commits ahead of main" echo "Next branch is ${BEHIND_COUNT} commits behind main" if [ "$BEHIND_COUNT" -gt 0 ]; then echo "::error::❌ Next branch is ${BEHIND_COUNT} commits behind main. Please update next branch with the latest changes from main before creating a release." echo "To fix this, run: git checkout next && git merge main" exit 1 fi if [ "$AHEAD_COUNT" -eq 0 ]; then echo "::warning::⚠️ Next branch has no new commits compared to main. Are you sure you want to create a release?" fi echo "✅ Next branch is up-to-date with main (${AHEAD_COUNT} commits ahead)" echo "branch-check-success=true" >> $GITHUB_OUTPUT - name: Check if tag already exists run: | TAG="${{ github.event.inputs.tag }}" if git tag -l | grep -q "^${TAG}$"; then echo "::error::Tag ${TAG} already exists" exit 1 fi if git ls-remote --tags origin | grep -q "refs/tags/${TAG}$"; then echo "::error::Tag ${TAG} already exists on remote" exit 1 fi - name: Tag the release id: tag-release run: | TAG="${{ github.event.inputs.tag }}" git tag -a "${TAG}" -m "Release ${TAG}" echo "✅ Created tag ${TAG}" echo "tag=${TAG}" >> $GITHUB_OUTPUT - name: Push tag run: | TAG="${{ github.event.inputs.tag }}" git push origin "${TAG}" echo "✅ Pushed tag ${TAG}" - name: Wait for release to be created run: | TAG="${{ github.event.inputs.tag }}" echo "Waiting for GitHub to create the draft release..." # Wait up to 2 minutes for the release to appear for i in {1..24}; do if gh release view "${TAG}" >/dev/null 2>&1; then echo "✅ Draft release created" break fi echo "Waiting for release to be created... (${i}/24)" sleep 5 done env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} summary: needs: [validate, release] runs-on: ubuntu-latest if: always() && needs.release.result == 'success' steps: - name: Release Summary run: | TAG="${{ needs.release.outputs.tag }}" echo "## 🎉 Release $TAG has been initiated!" echo "" echo "### Next steps:" echo "1. 📋 Check https://github.com/${{ github.repository }}/releases for the draft release to show up" echo "2. ✏️ Edit the new release, delete the existing notes and click the auto-generate button GitHub provides" echo "3. ✨ Add a section at the top calling out the main features" echo "4. 🚀 Publish the release" echo "5. � Create a Pull Request from 'next' to 'main' branch with title 'Release $TAG'" echo "6. �🔀 Merge the pull request into main" echo "7. 📢 Post message in #gh-mcp-releases channel in Slack and then share to the other mcp channels" echo "" echo "### Resources:" echo "- 📦 Draft Release: https://github.com/${{ github.repository }}/releases/tag/$TAG" echo "- 🔄 Create PR: https://github.com/${{ github.repository }}/compare/main...next" echo "" echo "The release process is now ready for your review and completion!" # Also output as job summary cat << EOF >> $GITHUB_STEP_SUMMARY ## 🎉 Release $TAG has been initiated! ### Next steps: 1. 📋 Check [releases page](https://github.com/${{ github.repository }}/releases) for the draft release to show up 2. ✏️ Edit the new release, delete the existing notes and click the auto-generate button GitHub provides 3. ✨ Add a section at the top calling out the main features 4. 🚀 Publish the release 5. � [Create a Pull Request](https://github.com/${{ github.repository }}/compare/main...next) from 'next' to 'main' branch with title 'Release $TAG' 6. �🔀 Merge the pull request into main 7. 📢 Post message in #gh-mcp-releases channel in Slack and then share to the other mcp channels ### Resources: - 📦 [Draft Release](https://github.com/${{ github.repository }}/releases/tag/$TAG) - 🔄 [Create PR](https://github.com/${{ github.repository }}/compare/main...next) The release process is now ready for your review and completion! EOF