From 80fb69203454560eefb326e4cc657472d317035b Mon Sep 17 00:00:00 2001 From: philz3906 Date: Thu, 11 Jun 2026 02:14:37 +0800 Subject: [PATCH] fix(ci): stop semantic-release silently swallowing '!' commits; cap them at minor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The commit-analyzer was configured with the angular preset, whose header parser does not accept the conventional-commits "!" marker — feat!:/feat(scope)!: commits failed to parse and were analyzed as "no release" (e.g. the 4 such commits since v4.0.0-rc.1 cut nothing). Switch the analyzer to the conventionalcommits preset (already used by release-notes-generator, dep already present) in all three release configs, and add { breaking: true, release: 'minor' } so '!'/BREAKING CHANGE commits cut at most a minor: major releases remain exclusively under manual control via release(major) commits, per project policy. Also fix the RC cleanup path: - The "Clean Github Release for RC" step ran on no-release pushes because contains('', '-') is false; gate it on new_release_published. - clean-rc-releases.sh crashed on empty input (xargs ran `gh release delete` with no args, exit 123) and relied on fragile table output; use --json/--jq, xargs -r, and --yes for non-interactive deletion. Tags are kept, as before. Co-Authored-By: Claude Fable 5 --- .github/workflows/publish-sdk.yaml | 2 +- packages/action/release.config.cjs | 5 ++++- packages/cli/release.config.cjs | 5 ++++- release.config.js | 5 ++++- scripts/clean-rc-releases.sh | 8 +++++++- 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/.github/workflows/publish-sdk.yaml b/.github/workflows/publish-sdk.yaml index ee3d0bfdf..957eca52b 100644 --- a/.github/workflows/publish-sdk.yaml +++ b/.github/workflows/publish-sdk.yaml @@ -128,7 +128,7 @@ jobs: ./scripts/update-version.sh @sentio/action ${{ steps.semantic.outputs.new_release_version }} pnpm publish --filter "@sentio/action" --no-git-checks --tag ${{ steps.npm.outputs.dist_tag }} - name: Clean Github Release for RC - if: ${{ contains(steps.semantic.outputs.new_release_version, '-') == false }} + if: ${{ steps.semantic.outputs.new_release_published == 'true' && contains(steps.semantic.outputs.new_release_version, '-') == false }} run: ./scripts/clean-rc-releases.sh env: GH_TOKEN: ${{ secrets.ACCESS_TOKEN }} diff --git a/packages/action/release.config.cjs b/packages/action/release.config.cjs index 845636e51..6ff299ffb 100644 --- a/packages/action/release.config.cjs +++ b/packages/action/release.config.cjs @@ -5,11 +5,14 @@ module.exports = { [ '@semantic-release/commit-analyzer', { - preset: 'angular', + preset: 'conventionalcommits', releaseRules: [ { type: 'release', "scope": 'major', release: 'major' }, { type: 'release', "scope": 'minor', release: 'minor' }, { type: 'release', "scope": 'patch', release: 'patch' }, + // '!'/BREAKING CHANGE markers are capped at minor: major releases are + // only ever cut explicitly via a release(major) commit. + { breaking: true, release: 'minor' }, { type: 'chore', release: 'patch' }, { type: 'refactor', release: 'patch' }, ], diff --git a/packages/cli/release.config.cjs b/packages/cli/release.config.cjs index 845636e51..6ff299ffb 100644 --- a/packages/cli/release.config.cjs +++ b/packages/cli/release.config.cjs @@ -5,11 +5,14 @@ module.exports = { [ '@semantic-release/commit-analyzer', { - preset: 'angular', + preset: 'conventionalcommits', releaseRules: [ { type: 'release', "scope": 'major', release: 'major' }, { type: 'release', "scope": 'minor', release: 'minor' }, { type: 'release', "scope": 'patch', release: 'patch' }, + // '!'/BREAKING CHANGE markers are capped at minor: major releases are + // only ever cut explicitly via a release(major) commit. + { breaking: true, release: 'minor' }, { type: 'chore', release: 'patch' }, { type: 'refactor', release: 'patch' }, ], diff --git a/release.config.js b/release.config.js index 32128f525..597969f6e 100644 --- a/release.config.js +++ b/release.config.js @@ -5,11 +5,14 @@ export default { [ '@semantic-release/commit-analyzer', { - preset: 'angular', + preset: 'conventionalcommits', releaseRules: [ { type: 'release', "scope": 'major', release: 'major' }, { type: 'release', "scope": 'minor', release: 'minor' }, { type: 'release', "scope": 'patch', release: 'patch' }, + // '!'/BREAKING CHANGE markers are capped at minor: major releases are + // only ever cut explicitly via a release(major) commit. + { breaking: true, release: 'minor' }, { type: 'chore', release: 'patch' }, { type: 'refactor', release: 'patch' }, ], diff --git a/scripts/clean-rc-releases.sh b/scripts/clean-rc-releases.sh index 4749cc821..6b75b44b5 100755 --- a/scripts/clean-rc-releases.sh +++ b/scripts/clean-rc-releases.sh @@ -1 +1,7 @@ -gh release list | grep Pre-release | awk '{print $1;}' | xargs -L1 gh release delete +#!/bin/bash +set -euo pipefail + +# Delete pre-release GitHub releases (keeps their git tags, which semantic-release relies on). +gh release list --limit 1000 --json tagName,isPrerelease \ + --jq '.[] | select(.isPrerelease) | .tagName' | + xargs -r -L1 gh release delete --yes