Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Add a new release workflow #578

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 26, 2025
Merged
Show file tree
Hide file tree
Changes from all 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
4 changes: 3 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@ These are one time installations required to be able to test your changes locall

## Submitting a pull request

> **Important**: Please open your pull request against the `next` branch, not `main`. The `next` branch is where we integrate new features and changes before they are merged to `main`.
1. [Fork][fork] and clone the repository
1. Make sure the tests pass on your machine: `go test -v ./...`
1. Make sure linter passes on your machine: `golangci-lint run`
1. Create a new branch: `git checkout -b my-branch-name`
1. Make your change, add tests, and make sure the tests and linter still pass
1. Push to your fork and [submit a pull request][pr]
1. Push to your fork and [submit a pull request][pr] targeting the `next` branch
1. Pat yourself on the back and wait for your pull request to be reviewed and merged.

Here are a few things you can do that will increase the likelihood of your pull request being accepted:
Expand Down