From 018bad4ea8a2c2f98fd89e9133364b612634eae5 Mon Sep 17 00:00:00 2001 From: ykiko Date: Mon, 6 Apr 2026 15:35:30 +0800 Subject: [PATCH] ci: add conventional commit format check (#399) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Add `conventional-commit` CI job that validates PR titles and push commit messages follow the `type(scope)?: description` format - Valid types: `feat`, `fix`, `refactor`, `chore`, `build`, `ci`, `docs`, `test`, `perf`, `style`, `revert` - Runs on both PR and push events, skips tag pushes - Zero dependencies, pure bash regex check ## Test plan - [x] PR title of this PR itself passes the check - [ ] CI runs and passes 🤖 Generated with [Claude Code](https://claude.com/claude-code) ## Summary by CodeRabbit * **Chores** * Enhanced continuous integration pipeline to validate commit message formatting standards on all pull requests and commits. Co-authored-by: Claude Opus 4.6 (1M context) --- .github/workflows/main.yml | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a0848f80..cdf5a78d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -47,6 +47,31 @@ jobs: - 'config/**' - '.github/workflows/test-cmake.yml' + conventional-commit: + if: ${{ !startsWith(github.ref, 'refs/tags/') }} + runs-on: ubuntu-latest + steps: + - name: Check conventional commit format + env: + IS_PR: ${{ github.event_name == 'pull_request' }} + PR_TITLE: ${{ github.event.pull_request.title }} + COMMIT_MSG: ${{ github.event.head_commit.message }} + run: | + pattern='^(feat|fix|refactor|chore|build|ci|docs|test|perf|style|revert)(\(.+\))?: .+' + if [[ "$IS_PR" == "true" ]]; then + subject="$PR_TITLE" + label="PR title" + else + subject=$(echo "$COMMIT_MSG" | head -n1) + label="Commit message" + fi + if [[ ! "$subject" =~ $pattern ]]; then + echo "::error::$label must follow conventional commit format: type(scope)?: description" + echo " Valid types: feat, fix, refactor, chore, build, ci, docs, test, perf, style, revert" + echo " Got: '$subject'" + exit 1 + fi + format: needs: changes if: ${{ needs.changes.outputs.format == 'true' }} @@ -92,6 +117,7 @@ jobs: checks-passed: if: ${{ always() && !startsWith(github.ref, 'refs/tags/') }} needs: + - conventional-commit - format - deploy # - clice @@ -103,5 +129,5 @@ jobs: - name: Check results uses: re-actors/alls-green@release/v1 with: - allowed-skips: format,deploy,clice,vscode,cmake + allowed-skips: conventional-commit,format,deploy,clice,vscode,cmake jobs: ${{ toJSON(needs) }}