From f05b2868aece4ce89708f575a1239420796d4ac0 Mon Sep 17 00:00:00 2001 From: Ventsislav Kostadinov Date: Tue, 17 Mar 2026 18:21:54 +0200 Subject: [PATCH 1/2] ci: redesign CI/CD pipeline with test, release-please, and version stamping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace ci.yaml with test.yaml: PR-only pipeline with conventional commit title enforcement, test → build sequence, and Gazelle drift check - Redesign release.yaml: post-merge test → build → release-please → publish; release-please handles automatic version bumps and changelog via conventional commits - Add .release-please-config.json and .release-please-manifest.json seeded at v0.1.0; uses simple release type with extra-files to keep MODULE.bazel version in sync - Add build/status.sh workspace status script for Bazel stamping - Add build:release --stamp to .bazelrc; release binaries now have version injected - Add x_defs to go_binary in BUILD.bazel wiring version/commit/date from stamp vars --- .bazelrc | 4 ++ .github/workflows/release.yaml | 74 ++++++++++++++++-------- .github/workflows/{ci.yaml => test.yaml} | 24 +++++--- .release-please-config.json | 15 +++++ .release-please-manifest.json | 3 + build/status.sh | 7 +++ cmd/zuul-mcp/BUILD.bazel | 5 ++ 7 files changed, 102 insertions(+), 30 deletions(-) rename .github/workflows/{ci.yaml => test.yaml} (74%) create mode 100644 .release-please-config.json create mode 100644 .release-please-manifest.json create mode 100755 build/status.sh diff --git a/.bazelrc b/.bazelrc index 7207878..cafc327 100644 --- a/.bazelrc +++ b/.bazelrc @@ -2,6 +2,7 @@ # Build settings build --enable_bzlmod +build --workspace_status_command=build/status.sh # Test settings test --test_output=errors @@ -31,3 +32,6 @@ build:windows_amd64 --@rules_go//go/config:static=false build:ci --noshow_progress build:ci --noshow_loading_progress test:ci --test_output=all + +# Release configuration: enable workspace stamping for version injection +build:release --stamp diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index f30767b..7e15ada 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -2,20 +2,18 @@ name: Release on: push: - tags: - - "v*" + branches: [main] permissions: contents: write + pull-requests: write jobs: test: name: Test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 - with: - fetch-depth: 0 + - uses: actions/checkout@v4 - name: Setup Bazel uses: bazel-contrib/setup-bazel@0.18.0 @@ -27,12 +25,44 @@ jobs: - name: Run tests run: bazel test //... --config=ci - release: - name: Release + build: + name: Build runs-on: ubuntu-latest needs: [test] steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v4 + + - name: Setup Bazel + uses: bazel-contrib/setup-bazel@0.18.0 + with: + bazelisk-cache: true + disk-cache: ${{ github.workflow }} + repository-cache: true + + - name: Build + run: bazel build //cmd/zuul-mcp --config=ci + + release-please: + name: Release Please + runs-on: ubuntu-latest + needs: [build] + outputs: + release_created: ${{ steps.release.outputs.release_created }} + tag_name: ${{ steps.release.outputs.tag_name }} + steps: + - uses: googleapis/release-please-action@v4 + id: release + with: + config-file: .release-please-config.json + manifest-file: .release-please-manifest.json + + publish: + name: Publish Binaries + runs-on: ubuntu-latest + needs: [release-please] + if: needs.release-please.outputs.release_created == 'true' + steps: + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -46,37 +76,35 @@ jobs: - name: Build binaries run: | mkdir -p dist - + # Linux amd64 (static binary) - bazel build //cmd/zuul-mcp --config=linux_amd64 --config=ci + bazel build //cmd/zuul-mcp --config=linux_amd64 --config=ci --config=release cp bazel-bin/cmd/zuul-mcp/zuul-mcp_/zuul-mcp dist/zuul-mcp-linux-amd64 - + # Linux arm64 (static binary) - bazel build //cmd/zuul-mcp --config=linux_arm64 --config=ci + bazel build //cmd/zuul-mcp --config=linux_arm64 --config=ci --config=release cp bazel-bin/cmd/zuul-mcp/zuul-mcp_/zuul-mcp dist/zuul-mcp-linux-arm64 - + # macOS amd64 - bazel build //cmd/zuul-mcp --config=darwin_amd64 --config=ci + bazel build //cmd/zuul-mcp --config=darwin_amd64 --config=ci --config=release cp bazel-bin/cmd/zuul-mcp/zuul-mcp_/zuul-mcp dist/zuul-mcp-darwin-amd64 - + # macOS arm64 (Apple Silicon) - bazel build //cmd/zuul-mcp --config=darwin_arm64 --config=ci + bazel build //cmd/zuul-mcp --config=darwin_arm64 --config=ci --config=release cp bazel-bin/cmd/zuul-mcp/zuul-mcp_/zuul-mcp dist/zuul-mcp-darwin-arm64 - + # Windows amd64 - bazel build //cmd/zuul-mcp --config=windows_amd64 --config=ci + bazel build //cmd/zuul-mcp --config=windows_amd64 --config=ci --config=release cp bazel-bin/cmd/zuul-mcp/zuul-mcp_/zuul-mcp.exe dist/zuul-mcp-windows-amd64.exe - + # Create checksums cd dist sha256sum * > checksums.txt - - name: Create Release + - name: Upload binaries to release uses: softprops/action-gh-release@v2 with: - draft: false - prerelease: false - generate_release_notes: true + tag_name: ${{ needs.release-please.outputs.tag_name }} files: | dist/zuul-mcp-linux-amd64 dist/zuul-mcp-linux-arm64 diff --git a/.github/workflows/ci.yaml b/.github/workflows/test.yaml similarity index 74% rename from .github/workflows/ci.yaml rename to .github/workflows/test.yaml index 6553dea..c7f9e4a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/test.yaml @@ -1,17 +1,27 @@ -name: CI +name: Test on: - push: - branches: [main] pull_request: - branches: [main] + +concurrency: + group: test-${{ github.ref }} + cancel-in-progress: true jobs: + pr-title: + name: PR Title (Conventional Commits) + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + steps: + - uses: amannn/action-semantic-pull-request@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + test: name: Test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v4 - name: Setup Bazel uses: bazel-contrib/setup-bazel@0.18.0 @@ -28,7 +38,7 @@ jobs: runs-on: ubuntu-latest needs: [test] steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v4 - name: Setup Bazel uses: bazel-contrib/setup-bazel@0.18.0 @@ -44,7 +54,7 @@ jobs: name: Gazelle runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v4 - name: Setup Bazel uses: bazel-contrib/setup-bazel@0.18.0 diff --git a/.release-please-config.json b/.release-please-config.json new file mode 100644 index 0000000..412d71a --- /dev/null +++ b/.release-please-config.json @@ -0,0 +1,15 @@ +{ + "packages": { + ".": { + "release-type": "simple", + "changelog-path": "CHANGELOG.md", + "extra-files": [ + { + "type": "generic", + "path": "MODULE.bazel", + "search": "version = \"[0-9]+\\.[0-9]+\\.[0-9]+\"" + } + ] + } + } +} diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..466df71 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.1.0" +} diff --git a/build/status.sh b/build/status.sh new file mode 100755 index 0000000..ad98e7f --- /dev/null +++ b/build/status.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Workspace status script for Bazel stamping. +# Outputs stable keys used by x_defs in go_binary rules. + +echo "STABLE_GIT_TAG $(git describe --tags --always --dirty 2>/dev/null || echo 'dev')" +echo "STABLE_GIT_COMMIT $(git rev-parse --short HEAD 2>/dev/null || echo 'unknown')" +echo "BUILD_DATE $(date -u +%Y-%m-%dT%H:%M:%SZ)" diff --git a/cmd/zuul-mcp/BUILD.bazel b/cmd/zuul-mcp/BUILD.bazel index ef6d118..df61d57 100644 --- a/cmd/zuul-mcp/BUILD.bazel +++ b/cmd/zuul-mcp/BUILD.bazel @@ -16,4 +16,9 @@ go_binary( name = "zuul-mcp", embed = [":zuul-mcp_lib"], visibility = ["//visibility:public"], + x_defs = { + "main.version": "{STABLE_GIT_TAG}", + "main.commit": "{STABLE_GIT_COMMIT}", + "main.date": "{BUILD_DATE}", + }, ) From e504a111034af302f01b06e216267241da2bb52a Mon Sep 17 00:00:00 2001 From: Ventsislav Kostadinov Date: Tue, 17 Mar 2026 18:27:08 +0200 Subject: [PATCH 2/2] ci: use actions/checkout@v6 across all workflows --- .github/workflows/release.yaml | 6 +++--- .github/workflows/test.yaml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 7e15ada..932cdf3 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -13,7 +13,7 @@ jobs: name: Test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup Bazel uses: bazel-contrib/setup-bazel@0.18.0 @@ -30,7 +30,7 @@ jobs: runs-on: ubuntu-latest needs: [test] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup Bazel uses: bazel-contrib/setup-bazel@0.18.0 @@ -62,7 +62,7 @@ jobs: needs: [release-please] if: needs.release-please.outputs.release_created == 'true' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c7f9e4a..d4bb2fe 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -21,7 +21,7 @@ jobs: name: Test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup Bazel uses: bazel-contrib/setup-bazel@0.18.0 @@ -38,7 +38,7 @@ jobs: runs-on: ubuntu-latest needs: [test] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup Bazel uses: bazel-contrib/setup-bazel@0.18.0 @@ -54,7 +54,7 @@ jobs: name: Gazelle runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup Bazel uses: bazel-contrib/setup-bazel@0.18.0