From be1e27d957a015338d5e24c78e24ce49ea0dfd14 Mon Sep 17 00:00:00 2001 From: chaodu-agent Date: Fri, 1 May 2026 13:16:38 +0000 Subject: [PATCH 1/3] feat: add docs-required-check workflow for fix/feat PRs --- .github/workflows/docs-required-check.yml | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/docs-required-check.yml diff --git a/.github/workflows/docs-required-check.yml b/.github/workflows/docs-required-check.yml new file mode 100644 index 00000000..c001803b --- /dev/null +++ b/.github/workflows/docs-required-check.yml @@ -0,0 +1,30 @@ +name: Docs Required Check + +on: + pull_request: + types: [opened, synchronize, reopened, edited] + +jobs: + docs-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Check if docs update is required + env: + PR_TITLE: ${{ github.event.pull_request.title }} + run: | + if echo "$PR_TITLE" | grep -qiE '^(fix|feat)(\(.+\))?:'; then + echo "This is a fix/feat PR, checking docs/ changes..." + DOCS_CHANGED=$(git diff --name-only origin/${{ github.event.pull_request.base.ref }}...HEAD -- docs/ | wc -l) + if [ "$DOCS_CHANGED" -eq 0 ]; then + echo "::error::fix/feat PR 必須包含 docs/ 下的文件更新!" + exit 1 + else + echo "✅ docs/ has $DOCS_CHANGED file(s) changed." + fi + else + echo "⏭️ Not a fix/feat PR, skipping docs check." + fi From 0d9645eb0ae24b0abcad536b7ecd2b225c98a7f2 Mon Sep 17 00:00:00 2001 From: chaodu-agent Date: Fri, 1 May 2026 13:19:45 +0000 Subject: [PATCH 2/3] feat: combine conventional commits check and docs-required check into one workflow --- .github/workflows/docs-required-check.yml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docs-required-check.yml b/.github/workflows/docs-required-check.yml index c001803b..35962c20 100644 --- a/.github/workflows/docs-required-check.yml +++ b/.github/workflows/docs-required-check.yml @@ -1,22 +1,33 @@ -name: Docs Required Check +name: PR Title & Docs Check on: pull_request: types: [opened, synchronize, reopened, edited] jobs: - docs-check: + pr-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Check if docs update is required + - name: Validate Conventional Commits title env: PR_TITLE: ${{ github.event.pull_request.title }} run: | - if echo "$PR_TITLE" | grep -qiE '^(fix|feat)(\(.+\))?:'; then + if echo "$PR_TITLE" | grep -qE '^(feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\(.+\))?!?:'; then + echo "✅ PR title follows Conventional Commits format." + else + echo "::error::PR title must follow Conventional Commits format: (): " + exit 1 + fi + + - name: Check docs update for fix/feat PRs + env: + PR_TITLE: ${{ github.event.pull_request.title }} + run: | + if echo "$PR_TITLE" | grep -qiE '^(fix|feat)(\(.+\))?!?:'; then echo "This is a fix/feat PR, checking docs/ changes..." DOCS_CHANGED=$(git diff --name-only origin/${{ github.event.pull_request.base.ref }}...HEAD -- docs/ | wc -l) if [ "$DOCS_CHANGED" -eq 0 ]; then From 13ac00d956dc0d88a0a70ae73e97feb519d5a13f Mon Sep 17 00:00:00 2001 From: chaodu-agent Date: Fri, 1 May 2026 13:26:22 +0000 Subject: [PATCH 3/3] fix: improve docs-required-check workflow - Fix git diff to use base.sha...head.sha instead of origin/base.ref...HEAD - Add skip-docs-check escape hatch via PR body keyword - Require space after colon in Conventional Commits regex - Unify error messages to English --- .github/workflows/docs-required-check.yml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docs-required-check.yml b/.github/workflows/docs-required-check.yml index 35962c20..80b0caad 100644 --- a/.github/workflows/docs-required-check.yml +++ b/.github/workflows/docs-required-check.yml @@ -16,7 +16,7 @@ jobs: env: PR_TITLE: ${{ github.event.pull_request.title }} run: | - if echo "$PR_TITLE" | grep -qE '^(feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\(.+\))?!?:'; then + if echo "$PR_TITLE" | grep -qE '^(feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\(.+\))?!?: .+'; then echo "✅ PR title follows Conventional Commits format." else echo "::error::PR title must follow Conventional Commits format: (): " @@ -26,12 +26,19 @@ jobs: - name: Check docs update for fix/feat PRs env: PR_TITLE: ${{ github.event.pull_request.title }} + PR_BODY: ${{ github.event.pull_request.body }} run: | - if echo "$PR_TITLE" | grep -qiE '^(fix|feat)(\(.+\))?!?:'; then + # Escape hatch: skip docs check if PR body contains "skip-docs-check" + if echo "$PR_BODY" | grep -qi 'skip-docs-check'; then + echo "⏭️ skip-docs-check found in PR body, skipping docs check." + exit 0 + fi + + if echo "$PR_TITLE" | grep -qE '^(fix|feat)(\(.+\))?!?: '; then echo "This is a fix/feat PR, checking docs/ changes..." - DOCS_CHANGED=$(git diff --name-only origin/${{ github.event.pull_request.base.ref }}...HEAD -- docs/ | wc -l) + DOCS_CHANGED=$(git diff --name-only ${{ github.event.pull_request.base.sha }}...${{ github.event.pull_request.head.sha }} -- docs/ | wc -l) if [ "$DOCS_CHANGED" -eq 0 ]; then - echo "::error::fix/feat PR 必須包含 docs/ 下的文件更新!" + echo "::error::fix/feat PRs must include at least one docs/ update. Add skip-docs-check to the PR body to bypass." exit 1 else echo "✅ docs/ has $DOCS_CHANGED file(s) changed."