From a87421d0a8f32f81e1d2ca8cf6b574d239a7249f Mon Sep 17 00:00:00 2001 From: randypanding Date: Wed, 19 Aug 2026 04:03:25 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20gate=20=E6=96=87=E4=BB=B6=E6=B8=85?= =?UTF-8?q?=E5=8D=95=E4=B8=89=E9=98=B2=E7=BA=BF=E2=80=94=E2=80=94edited=20?= =?UTF-8?q?=E9=87=8D=E8=A7=A6=E5=8F=91/rename=20=E6=BA=AF=E6=BA=90/3000=20?= =?UTF-8?q?=E4=B8=8A=E9=99=90=20fail-closed=EF=BC=88ADR-0016=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI-Workflows #8 qodo review 发现的同款缺陷在本仓 gate.yml 同样存在: 1. on.pull_request.types 增 edited:PR title/body 是可变输入,check 通过后 编辑掉 ADR 引用必须触发重验(反向:补引用救活 check 同理) 2. previous_filename 纳入 C1 判定:governance/standards/CODEOWNERS 等 C1 资产改名移出受管路径同样是 C1 变更 3. files API 3000 文件硬上限:返回数 < changed_files 即 fail-closed --- .github/workflows/gate.yml | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gate.yml b/.github/workflows/gate.yml index ebe5407..a8a708a 100644 --- a/.github/workflows/gate.yml +++ b/.github/workflows/gate.yml @@ -1,6 +1,10 @@ name: gate on: pull_request: + # edited(qodo review #1,CI-Workflows #8 同款加固):adr-required 消费 + # 可变的 PR title/body——不订阅 edited 则作者可在 check 通过后编辑掉 + # ADR 引用而不触发重验;补引用救活 fail 的 check 同样依赖 edited 重触发 + types: [opened, synchronize, reopened, edited] push: branches: [main] @@ -65,8 +69,23 @@ jobs: PR_TITLE: ${{ github.event.pull_request.title }} PR_BODY: ${{ github.event.pull_request.body }} run: | - # --paginate(评审项):>100 文件的 PR 首页截断会把 C1 变更漏检成非 C1 - FILES=$(gh api --paginate "repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files?per_page=100" --jq '.[].filename') + # 文件清单三防线(qodo review #2 #3,CI-Workflows #8 同款加固): + # --paginate:>100 文件的 PR 首页截断会把 C1 变更漏检成非 C1; + # rename 的 previous_filename 一并纳入——governance/standards/CODEOWNERS + # 等 C1 资产改名移出受管路径同样是 C1 变更(files API 只在 + # previous_filename 暴露原路径); + # files API 3000 文件硬上限:返回数 < changed_files = 清单不完整, + # fail-closed(清单不全时 C1 判定不可信,宁误杀不放过)。 + PR_API="repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}" + FILES_API="$PR_API/files?per_page=100" + CHANGED=$(gh api "$PR_API" --jq '.changed_files') + FILES_CUR=$(gh api --paginate "$FILES_API" --jq '.[].filename') + GOT=$(grep -c . <<<"$FILES_CUR" || true) + if [ "$GOT" -lt "$CHANGED" ]; then + echo "::error::PR 声明变更 $CHANGED 个文件但 files API 只返回 $GOT 个(3000 上限截断)——C1 判定完整性无法保证,fail-closed" + exit 1 + fi + FILES=$( { echo "$FILES_CUR"; gh api --paginate "$FILES_API" --jq '[.[].previous_filename // empty][]'; } ) if ! echo "$FILES" | grep -qE '^(governance/|standards/|scripts/|\.github/|CODEOWNERS|profile/)'; then echo "非 C1 路径变更,跳过 adr-required" exit 0