Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ on:
schedule:
- cron: "27 0 * * *"
push:
branches: ["main"]
branches: ["main", "next"]
# Publish semver tags as releases.
tags: ["v*.*.*"]
pull_request:
branches: ["main"]
branches: ["main", "next"]

env:
# Use docker.io for Docker Hub if empty
Expand Down
55 changes: 55 additions & 0 deletions .github/workflows/pr-base-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: PR Base Branch Check

on:
pull_request:
types: [opened, edited, synchronize]
branches:
- main

permissions:
pull-requests: write
contents: read

jobs:
check-base-branch:
runs-on: ubuntu-latest
if: github.event.pull_request.base.ref == 'main'

steps:
- name: Comment on PR
uses: actions/github-script@v7
with:
script: |
const message = `👋 Hi there!

It looks like this PR is targeting the \`main\` branch. To help maintain our development workflow, please change the base reference to \`next\` instead.

__If this is a bug fix that requires a patch release __ (e.g., a critical bug that needs to be fixed before the next release)__, please leave the base branch as \`main\`.__

You can change this by:
1. Clicking the "Edit" button next to the PR title
2. Changing the base branch from \`main\` to \`next\`
3. Clicking "Update pull request"

Thanks for your contribution! 🚀`;

// Check if we've already commented
const comments = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});

const botComment = comments.data.find(comment =>
comment.user.type === 'Bot' &&
comment.body.includes('please change the base reference to')
);

if (!botComment) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: message
});
}
204 changes: 204 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
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:
pr-number: ${{ steps.create-pr.outputs.pr-number }}
pr-url: ${{ steps.create-pr.outputs.pr-url }}

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
run: |
TAG="${{ github.event.inputs.tag }}"
git tag -a "${TAG}" -m "Release ${TAG}"
echo "✅ Created tag ${TAG}"

- name: Create Pull Request
id: create-pr
run: |
TAG="${{ github.event.inputs.tag }}"

# Create PR from next to main
PR_RESPONSE=$(gh pr create \
--base main \
--head next \
--title "Release ${TAG}" \
--body "This PR contains the changes for release ${TAG}.

**Release checklist:**
- [ ] Review the changes
- [ ] Ensure all tests pass
- [ ] Verify the release notes in the draft release
- [ ] Merge this PR after the release is published

Created by the automated release workflow." \
--json number,url)

PR_NUMBER=$(echo "$PR_RESPONSE" | jq -r '.number')
PR_URL=$(echo "$PR_RESPONSE" | jq -r '.url')

echo "pr-number=${PR_NUMBER}" >> $GITHUB_OUTPUT
echo "pr-url=${PR_URL}" >> $GITHUB_OUTPUT
echo "✅ Created PR #${PR_NUMBER}: ${PR_URL}"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- 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="${{ github.event.inputs.tag }}"
PR_URL="${{ needs.release.outputs.pr-url }}"

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. 🔀 Merge the pull request into main: ${PR_URL}"
echo "6. 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 "- 🔄 Pull Request: ${PR_URL}"
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. 🔀 Merge the pull request into main: [PR #${{ needs.release.outputs.pr-number }}](${PR_URL})

### Resources:
- 📦 [Draft Release](https://github.com/${{ github.repository }}/releases/tag/$TAG)
- 🔄 [Pull Request](${PR_URL})

The release process is now ready for your review and completion!
EOF
Loading
Loading