release.yaml•5.65 kB
# .github/workflows/release.yml
name: Release on Version Change
on:
pull_request:
types:
- closed
branches:
- main
push:
branches:
- 'release-**'
permissions:
contents: write
packages: write
jobs:
tag-and-release:
if: github.event_name == 'pull_request' && github.event.pull_request.merged == true
runs-on: ubuntu-latest
outputs:
version_changed: ${{ steps.version_change.outputs.changed }}
new_version: ${{ steps.version_change.outputs.new_version }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get PR merge commit
run: |
git fetch origin main
git checkout ${{ github.event.pull_request.merge_commit_sha }}
- name: Get previous commit on main
id: prev_commit
run: |
PREV_COMMIT=$(git rev-parse ${{ github.event.pull_request.merge_commit_sha }}^)
echo "prev_commit=$PREV_COMMIT" >> $GITHUB_OUTPUT
- name: Check if version changed in package.json
id: version_change
run: |
OLD_VERSION=$(git show ${{ steps.prev_commit.outputs.prev_commit }}:package.json | jq -r .version)
NEW_VERSION=$(jq -r .version package.json)
echo "old_version=$OLD_VERSION" >> $GITHUB_OUTPUT
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
if [ "$OLD_VERSION" != "$NEW_VERSION" ]; then
echo "changed=true" >> $GITHUB_OUTPUT
else
echo "changed=false" >> $GITHUB_OUTPUT
fi
- name: Create tag if version changed
if: steps.version_change.outputs.changed == 'true'
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git tag v${{ steps.version_change.outputs.new_version }}
git push origin v${{ steps.version_change.outputs.new_version }}
- name: Run GoReleaser
if: steps.version_change.outputs.changed == 'true'
uses: goreleaser/goreleaser-action@v5
with:
distribution: goreleaser
version: latest
args: release --clean --skip-validate
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Trigger homebrew-tap update workflow
if: steps.version_change.outputs.changed == 'true'
run: |
curl -X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.HOMEBREW_TAP_TOKEN }}" \
https://api.github.com/repos/last9/homebrew-tap/dispatches \
-d '{"event_type":"update-last9-mcp","client_payload":{"tag":"v${{ steps.version_change.outputs.new_version }}"}}'
publish-docker:
needs: tag-and-release
if: |
always() &&
(needs.tag-and-release.outputs.version_changed == 'true' ||
(github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-')))
runs-on: ubuntu-latest
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Get version from package.json
id: get_version
run: |
VERSION=$(jq -r .version package.json)
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Extract branch name
id: extract_branch
run: |
BRANCH_NAME=${GITHUB_REF#refs/heads/}
echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Check Docker secrets
id: check_secrets
run: |
if [[ -n "$DOCKER_USERNAME" && -n "$DOCKER_PASSWORD" ]]; then
echo "has_docker_secrets=true" >> $GITHUB_OUTPUT
else
echo "has_docker_secrets=false" >> $GITHUB_OUTPUT
fi
- name: Login to Docker Registry
if: steps.check_secrets.outputs.has_docker_secrets == 'true'
uses: docker/login-action@v3
with:
registry: docker-registry.last9.io
username: ${{ env.DOCKER_USERNAME }}
password: ${{ env.DOCKER_PASSWORD }}
- name: Build and Push Docker Image (Release Branch)
if: |
steps.check_secrets.outputs.has_docker_secrets == 'true' &&
github.event_name == 'push' &&
startsWith(github.ref, 'refs/heads/release-')
uses: docker/build-push-action@v5
with:
context: .
file: Dockerfile
push: true
tags: |
docker-registry.last9.io/last9/last9-mcp-server:${{ steps.extract_branch.outputs.branch_name }}
docker-registry.last9.io/last9/last9-mcp-server:${{ steps.extract_branch.outputs.branch_name }}-v${{ steps.get_version.outputs.version }}
cache-from: type=gha
cache-to: type=gha,mode=max
platforms: linux/amd64
- name: Build and Push Docker Image (Main Branch)
if: |
steps.check_secrets.outputs.has_docker_secrets == 'true' &&
needs.tag-and-release.outputs.version_changed == 'true'
uses: docker/build-push-action@v5
with:
context: .
file: Dockerfile
push: true
tags: |
docker-registry.last9.io/last9/last9-mcp-server:v${{ needs.tag-and-release.outputs.new_version }}
docker-registry.last9.io/last9/last9-mcp-server:latest
cache-from: type=gha
cache-to: type=gha,mode=max
platforms: linux/amd64