mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-08-10 08:27:25 +00:00
ci: fix a latent false negative and cut Identity Guard runtime 50s to 1s
两处都是本地实测发现的,不是推测。 1) 漏判(正确性):尾注预筛写成 `git log --format=%B "$RANGE" | grep -qiE`, 在 `set -o pipefail` 下 grep -q 命中即退出,左侧 git log 收到 SIGPIPE, 整条管道返回非 0,if 判定为"没命中"从而跳过整个尾注检查。 实测:沙箱里 8 条应报错误只报出 6 条,两个带 AI 尾注的提交被静默放过。 改为 here-string(不再有管道),身份预筛同样改掉以杜绝这一类问题。 2) 性能:全量审计路径(新建分支推送、workflow_dispatch)原先为每个提交 各起一个 git 子进程,docker_practice 1,592 个提交实测 50 秒。 现在先用一次 git log 流式预筛,只有命中时才逐个提交定位; 同一仓库实测降到 1 秒,且不改变任何判定结果。 回归验证:被删分支的真实 4 个提交在 push / pull_request / 新建分支三种 形态下仍全部拦下;专门构造的 2,502 提交仓库(身份流 258KB,远超管道缓冲区) 中埋在末尾的 AI 提交能被检出;14 个仓库完整历史仍然零误报; 范围解析失败仍 fail closed,删除分支仍正确放行。
This commit is contained in:
@@ -78,12 +78,19 @@ jobs:
|
|||||||
BAD_EMAIL='@([a-z0-9.-]+\.)?(anthropic|openai)\.com$'
|
BAD_EMAIL='@([a-z0-9.-]+\.)?(anthropic|openai)\.com$'
|
||||||
BAD_NAME='^(claude([ ._-]?code)?|codex|chatgpt|copilot|anthropic|openai)(\[bot\])?$'
|
BAD_NAME='^(claude([ ._-]?code)?|codex|chatgpt|copilot|anthropic|openai)(\[bot\])?$'
|
||||||
BAD_TRAILER='^[[:space:]]*co-authored-by:.*(claude|anthropic|codex|copilot|openai)'
|
BAD_TRAILER='^[[:space:]]*co-authored-by:.*(claude|anthropic|codex|copilot|openai)'
|
||||||
|
# 粗筛:BAD_EMAIL 与 BAD_NAME 命中的行必然含下列词之一,
|
||||||
|
# 因此它是二者的超集,用来跳过绝大多数干净提交,不会漏判。
|
||||||
|
BAD_ANY='(claude|anthropic|codex|chatgpt|copilot|openai)'
|
||||||
|
|
||||||
failed=0
|
failed=0
|
||||||
|
|
||||||
# 身份检查。命令替换先落地,set -e 才能捕获 git 失败;
|
# 身份检查。命令替换先落地,set -e 才能捕获 git 失败;
|
||||||
# while 循环用 here-string 喂数据,避免管道子 shell 吞掉 failed 赋值。
|
# while 循环用 here-string 喂数据,避免管道子 shell 吞掉 failed 赋值。
|
||||||
IDENTS="$(git log --format="%H${US}%an${US}%ae${US}%cn${US}%ce" "$RANGE")"
|
IDENTS="$(git log --format="%H${US}%an${US}%ae${US}%cn${US}%ce" "$RANGE")"
|
||||||
|
# 用 here-string 而不是管道:set -o pipefail 下 grep -q 命中即退出会让
|
||||||
|
# 左侧进程收到 SIGPIPE,整条管道返回非 0,if 就会跳过检查——
|
||||||
|
# 而且只在输入大到写不进管道缓冲区时才发生,是典型的隐性漏判。
|
||||||
|
if grep -qiE "$BAD_ANY" <<< "$IDENTS"; then
|
||||||
while IFS="$US" read -r sha an ae cn ce; do
|
while IFS="$US" read -r sha an ae cn ce; do
|
||||||
[ -n "$sha" ] || continue
|
[ -n "$sha" ] || continue
|
||||||
for role in author committer; do
|
for role in author committer; do
|
||||||
@@ -97,17 +104,23 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
done <<< "$IDENTS"
|
done <<< "$IDENTS"
|
||||||
|
fi
|
||||||
|
|
||||||
# Co-authored-by 尾注检查(行首锚定并要求冒号,避免匹配正文叙述)
|
# Co-authored-by 尾注检查(行首锚定并要求冒号,避免匹配正文叙述)。
|
||||||
while read -r sha; do
|
# 先用一次 git log 流式扫全部正文;只有确实命中时才逐个提交定位,
|
||||||
[ -n "$sha" ] || continue
|
# 否则全量审计要为每个提交起一个 git 子进程(1500+ 提交约 50 秒)。
|
||||||
body="$(git log -1 --format='%B' "$sha")"
|
BODIES="$(git log --format='%B' "$RANGE")"
|
||||||
if printf '%s' "$body" | grep -qiE "$BAD_TRAILER"; then
|
if grep -qiE "$BAD_TRAILER" <<< "$BODIES"; then
|
||||||
echo "::error::${sha} has a Co-authored-by trailer referencing an AI assistant"
|
while read -r sha; do
|
||||||
printf '%s' "$body" | grep -iE "$BAD_TRAILER" | sed 's/^/ /'
|
[ -n "$sha" ] || continue
|
||||||
failed=1
|
body="$(git log -1 --format='%B' "$sha")"
|
||||||
fi
|
if printf '%s' "$body" | grep -qiE "$BAD_TRAILER"; then
|
||||||
done <<< "$COMMITS"
|
echo "::error::${sha} has a Co-authored-by trailer referencing an AI assistant"
|
||||||
|
printf '%s' "$body" | grep -iE "$BAD_TRAILER" | sed 's/^/ /'
|
||||||
|
failed=1
|
||||||
|
fi
|
||||||
|
done <<< "$COMMITS"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$failed" -ne 0 ]; then
|
if [ "$failed" -ne 0 ]; then
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
Reference in New Issue
Block a user