Skip to content

fix(ci): DCO 按提交作者豁免自动化 —— 否则自动发版路径结构上不可用 - #135

Merged
ReSerendipity merged 1 commit into
mainfrom
fix/dco-bot-exemption
Sep 22, 2026
Merged

ReSerendipity merged 1 commit into
mainfrom
fix/dco-bot-exemption

Conversation

@ReSerendipity

Copy link
Copy Markdown
Owner

一句话

release-please 的提交作者固定是 github-actions[bot](它用 GitHub API 建提交,工作流里设
GIT_AUTHOR_* 对它无效),所以那条提交永远不可能Signed-off-by。而分支保护要求 DCO 通过
RP 开的 release PR 一律合不进去#115 / #120 / #132 都撞在这;#132 正是本轮要发的 2.2.5。

也就是说:过去这几天我们把 RP 的"能不能开 PR、会不会整份重写文件"都修好了,
但自动发版路径其实一直卡在最后这一步 —— DCO 让它结构性不可用

改法:豁免按"提交作者"给,不按"PR 作者"整条放过

之前 现在
判定对象 if: github.actor != 'dependabot[bot]'(整条 PR 级) 逐提交看作者邮箱
自动化提交 dependabot 整条 PR 跳过;RP 的 PR 全红 只豁免我们那两个 noreply 身份(github-actions[bot] / dependabot[bot]
人的提交缺签名 照样红
可审计性 每次打印「人类提交 N 条 / 机器提交豁免 M 条 / 失败=?」

顺手把 base/head SHA 从 ${{ }} 内插改成 envBASE_SHA / HEAD_SHA)—— 不然这段 shell
抽出来没法注入仓库,也就没法测。

测试:证明这是豁免不是后门

新增 tests/test_dco_bot_exemption.py:把那段脚本从 YAML 里抽出来,在一次性 git 仓库上跑 4 种形状 ——

形状 期望
人写的提交,无签名
人写的提交,有签名 绿
bot 提交,无签名(= RP 的形状) 绿,且输出里记着"豁免 1"
bot 提交 + 人的无签名提交混合 仍红(这条是关键:有人混在里面时不许搭车放行)

4 passed

之后

合这条 → 在 #132 上重跑 DCO → 绿了就合 #132,让 RP 自己打 v2.2.5 tag、建 Release、
build-release 挂资产 —— 那是这条自动路径的第一次完整实跑

release-please 用 GitHub API 建提交:作者固定是 github-actions[bot],工作流里设的
GIT_AUTHOR_* 对它无效,所以那条提交**永远不可能**有 Signed-off-by。而分支保护要求 DCO 通过
→ RP 开的 release PR 一律合不进去(#115 / #120 / #132 都撞在这,其中 #132 是本轮要发的 2.2.5)。

改法是把豁免按"提交作者"给,而不是按"PR 作者"整条放过:
- 豁免名单只有我们自己那两个自动化身份(github-actions[bot] / dependabot[bot] 的 noreply 邮箱)
- 人的提交缺签名照样红;**混合 PR 里有 bot 提交也不影响这条**(这是豁免不是后门的关键)
- 每次跑都打印"人类提交 N 条 / 机器提交豁免 M 条",放过了谁要看得见
- 顺手把 SHA 从 ${{ }} 内插改成 env(BASE_SHA/HEAD_SHA),这样测试才能把仓库注进去跑

新增 tests/test_dco_bot_exemption.py:把这段 shell 从 YAML 里抽出来,在一次性 git 仓库上
跑 4 种形状(人无签名→红 / 人有签名→绿 / bot 无签名→绿且记出"豁免 1" / bot+人无签名→仍红)。
4 passed。

Signed-off-by: ReSerendipity <zengyangc@outlook.com>
@ReSerendipity
ReSerendipity merged commit 9eec594 into main Sep 22, 2026
30 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant