From 608b3282ddfea3ed1b0f98c0539f7e32110bb287 Mon Sep 17 00:00:00 2001 From: Chris Coutinho Date: Fri, 19 Dec 2025 21:34:49 +0100 Subject: [PATCH] fix(ci): make MCP server default bump target for all non-scoped commits MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BREAKING CHANGE: MCP server now bumps for ANY conventional commit except those explicitly scoped to helm or astrolabe. Previous behavior: - MCP bumped only for unscoped or scope=mcp commits - fix(ci): commits were ignored → no version bump New behavior: - MCP bumps for ALL commits except scope=helm or scope=astrolabe - fix(ci): commits now trigger MCP version bump ✓ - feat(api): commits now trigger MCP version bump ✓ - Any custom scope triggers MCP version bump ✓ This treats the MCP server as the default/primary component in the monorepo, with Helm chart and Astrolabe as opt-in specialized components. Changes: 1. Updated bump-version.yml workflow logic to exclude helm/astrolabe instead of only including mcp/unscoped 2. Updated pyproject.toml commitizen patterns to use negative lookahead: (?!\((?:helm|astrolabe)\)) 3. Fixed docker-build-publish.yml to only trigger on v* tags (MCP only) 4. Fixed appstore-build-publish.yml action version (v1.0.4) 5. Updated test script to use grep -P for PCRE support 6. Added test cases for ci, api, and custom scopes All 19 scope filtering tests now pass. --- .github/workflows/bump-version.yml | 21 +++++++++++++++++++-- pyproject.toml | 6 +++--- scripts/test-commitizen-scopes.sh | 18 +++++++++++------- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml index bc1fc23..aae8bf0 100644 --- a/.github/workflows/bump-version.yml +++ b/.github/workflows/bump-version.yml @@ -71,12 +71,29 @@ jobs: fi } - # Bump MCP server (scope: mcp or unscoped) + # Bump MCP server (default - all commits except helm/astrolabe scopes) echo "Checking MCP server for version bump..." - if has_commits_since_tag "v[0-9]" "(feat|fix|docs|refactor|perf|test|build|ci|chore)(\(mcp\))?(!)?:"; then + + # Get the most recent MCP tag + last_mcp_tag=$(git tag --sort=-creatordate | grep -E "^v[0-9]" | head -n 1 || echo "") + + if [ -z "$last_mcp_tag" ]; then + commit_range="master" + else + commit_range="${last_mcp_tag}..HEAD" + fi + + # Count conventional commits that are NOT scoped to helm or astrolabe + mcp_commit_count=$(git log "$commit_range" --oneline --grep="^(feat|fix|docs|refactor|perf|test|build|ci|chore)" -E | \ + grep -v "(helm)" | grep -v "(astrolabe)" | wc -l) + + if [ "$mcp_commit_count" -gt 0 ]; then + echo "Found $mcp_commit_count commits for MCP server since $last_mcp_tag" echo "Bumping MCP server version..." ./scripts/bump-mcp.sh BUMPED_COMPONENTS="$BUMPED_COMPONENTS mcp" + else + echo "No commits found for MCP server since $last_mcp_tag" fi # Bump Helm chart (scope: helm) diff --git a/pyproject.toml b/pyproject.toml index 54c10f2..f08cfab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,10 +101,10 @@ ignored_tag_formats = [ "astrolabe-v*", # Astrolabe tags ] -# Filter commits by scope (mcp or unscoped) +# Filter commits by scope (all scopes except helm and astrolabe) [tool.commitizen.customize] -changelog_pattern = "^(feat|fix|docs|refactor|perf|test|build|ci|chore)(\\(mcp\\))?(!)?:" -schema_pattern = "^(feat|fix|docs|refactor|perf|test|build|ci|chore)(\\(mcp\\))?(!)?:\\s.+" +changelog_pattern = "^(feat|fix|docs|refactor|perf|test|build|ci|chore)(?!\\((?:helm|astrolabe)\\))(\\([^)]+\\))?(!)?:" +schema_pattern = "^(feat|fix|docs|refactor|perf|test|build|ci|chore)(?!\\((?:helm|astrolabe)\\))(\\([^)]+\\))?(!)?:\\s.+" [tool.ruff.lint] extend-select = ["I"] diff --git a/scripts/test-commitizen-scopes.sh b/scripts/test-commitizen-scopes.sh index 9f2c072..6eb3b87 100755 --- a/scripts/test-commitizen-scopes.sh +++ b/scripts/test-commitizen-scopes.sh @@ -6,7 +6,7 @@ echo "Testing commitizen scope filtering patterns..." echo # Regex patterns from configs -MCP_PATTERN='^(feat|fix|docs|refactor|perf|test|build|ci|chore)(\(mcp\))?(!)?:' +MCP_PATTERN='^(feat|fix|docs|refactor|perf|test|build|ci|chore)(?!\((?:helm|astrolabe)\))(\([^)]+\))?(!)?:' HELM_PATTERN='^(feat|fix|docs|refactor|perf|test|build|ci|chore)\(helm\)(!)?:' ASTROLABE_PATTERN='^(feat|fix|docs|refactor|perf|test|build|ci|chore)\(astrolabe\)(!)?:' @@ -14,7 +14,8 @@ test_pattern() { local message="$1" local pattern="$2" - if echo "$message" | grep -qE "$pattern"; then + # Use grep -P for Perl-compatible regex (supports negative lookahead) + if echo "$message" | grep -qP "$pattern"; then return 0 else return 1 @@ -61,11 +62,14 @@ run_test() { failed=0 passed=0 -# MCP server commits (scope=mcp or unscoped) +# MCP server commits (any scope except helm/astrolabe) run_test "feat: add new feature" "mcp" && passed=$((passed+1)) || failed=$((failed+1)) run_test "feat(mcp): add API endpoint" "mcp" && passed=$((passed+1)) || failed=$((failed+1)) run_test "fix(mcp): resolve authentication bug" "mcp" && passed=$((passed+1)) || failed=$((failed+1)) run_test "docs: update README" "mcp" && passed=$((passed+1)) || failed=$((failed+1)) +run_test "fix(ci): update workflow" "mcp" && passed=$((passed+1)) || failed=$((failed+1)) +run_test "feat(api): add endpoint" "mcp" && passed=$((passed+1)) || failed=$((failed+1)) +run_test "ci: configure GitHub Actions" "mcp" && passed=$((passed+1)) || failed=$((failed+1)) # Helm chart commits run_test "feat(helm): add resource limits" "helm" && passed=$((passed+1)) || failed=$((failed+1)) @@ -82,10 +86,10 @@ run_test "feat(mcp)!: breaking API change" "mcp" && passed=$((passed+1)) || fail run_test "feat(helm)!: rename values" "helm" && passed=$((passed+1)) || failed=$((failed+1)) run_test "feat(astrolabe)!: remove deprecated feature" "astrolabe" && passed=$((passed+1)) || failed=$((failed+1)) -# Invalid commits (should not match any) -run_test "feat(invalid): test" "none" && passed=$((passed+1)) || failed=$((failed+1)) -run_test "random commit message" "none" && passed=$((passed+1)) || failed=$((failed+1)) -run_test "feat (mcp): space before scope" "none" && passed=$((passed+1)) || failed=$((failed+1)) +# Edge cases +run_test "feat(invalid): test" "mcp" && passed=$((passed+1)) || failed=$((failed+1)) # Any scope except helm/astrolabe → MCP +run_test "random commit message" "none" && passed=$((passed+1)) || failed=$((failed+1)) # Not conventional commit +run_test "feat (mcp): space before scope" "none" && passed=$((passed+1)) || failed=$((failed+1)) # Invalid format # Summary echo