Skip to content

fix(ci): release-please 三处静默失效——它其实从没发过版(merge 需等 v2.2.2 tag 落地) - #114

Merged
ReSerendipity merged 1 commit into
mainfrom
fix/release-please-noop
Sep 22, 2026
Merged

ReSerendipity merged 1 commit into
mainfrom
fix/release-please-noop

Conversation

@ReSerendipity

Copy link
Copy Markdown
Owner

现象与定位

三次「绿色」的 main push 之后既没 tag 迁移也没 Release(v2.2.2 就是这么拖出来的)。读日志后确认是三处互相独立的静默失效,而不是"上游偶发失败":

# 失效点 证据
1 skip-github-pull-request: true 让 RP 只从"已合并的 release PR"发版,而本仓从没有过一个 run 35620031352 输出 found 0 possible releases 后 success
2 传了 5 个 v4 不认的入参,配置整段被忽略 同一 run 的 ##[warning]Unexpected input(s) 'package-name','changelog-path','draft','label','prerelease', valid inputs are [...](已与 action.yml 的 inputs 表逐条比对)
3 release-please job 没有 outputs: 块,而 build-release 把门写在 needs.release-please.outputs.release_created == 'true' 上、还引用 ...outputs.tag_name 两个引用恒为空 → 即便 RP 正常发版,sdist/wheel + twine check + SHA256SUMS 也永远不出产物

仓库里也没有 release-please-config.json / .release-please-manifest.json,所以"配置写在 with 里"这件事从未成立。

改法

  • 删无效入参与 skip-github-pull-request,配置落到那两个文件(release-type: python +
    changelog-path: CHANGELOG.md + manifest 登记 2.2.2);
  • 补 outputs: 映射(输出名按官方文档为下划线式:release_created / tag_name / version / pr);
  • 新增一步把结果写进 job summary,两者皆空时明确区分"确实没有约定式提交"与"失同步";
  • 新增硬自证:配置文件存在且为合法 JSON、必须有 v* tag、manifest 落后于最新 tag 直接失败
    (那会让 RP 重算已发布版本),领先(发版进行中)只 WARN。
    比较用 sort -V,5 个情形本机逐条验过,含 2.10 vs 2.9、10.0 vs 1.0 这种字典序会判错的两例。

已知代价(写明,不藏)

extra-files: [] —— RP 只会自动改 pyproject.toml + CHANGELOG,另外 8 处版本位
(version.json / config.yaml / 桌面壳 3 处 / 安装器 / k8s 镜像 tag)仍靠人工。
所以下一条真正的 release PR 会被 test_all_version_sites_agree(#113 加的)判红。
这是有意的闸:红 = 有人来同步,而不是静默发出一堆版本互相矛盾的产物。要交给 RP 就逐条填
extra-files,并且必须在一次真实 release PR 上验 —— 我没法在这里验证 RP 对每个文件的改写行为。

合并顺序

等 v2.2.2 的 tag 落地之后再合,否则 manifest(2.2.2) 领先最新 tag(v2.2.1) 会让自证步骤长期挂 WARN。
(当前 v2.2.2 尚未发布:gh release list 最新是 v2.2.1,2026-08-22。)

本地验证

python -c yaml.safe_load 通过(4 步、outputs 两项、RP 只剩 2 个合法入参);
scripts/verify_cloud_native.py 全绿;scripts/check_spec_refs.py → new=0;pre-commit 通过。

现象:三次「绿色」的 main push 之后既没有 tag 也没有 Release(v2.2.2 就是这么拖出来的)。
逐条读 CI 日志后定位到**三处各自独立**的静默失效:

1. `skip-github-pull-request: true` —— 这种模式下 RP 只从"已合并的 release PR"发版,
   而本仓**从没产生过任何一个** release PR,于是每次 run 都是
   `found 0 possible releases` + success。日志里同时能看到
   `Unexpected input(s) 'package-name','changelog-path','draft','label','prerelease'`
   —— 那 5 个入参 v4 根本不认,被整段忽略(`action.yml` 的 inputs 表已逐条比对),
   而且仓库里没有 `release-please-config.json` / `.release-please-manifest.json`,
   所以 `changelog-path` 之类的配置实际从未生效。
   改法:删掉无效入参与 skip-github-pull-request,配置写进那两个文件(`release-type: python`
   + `changelog-path: CHANGELOG.md` + manifest 登记 `2.2.2`)。
2. `release-please` job **从未声明 `outputs:`**,而 `build-release` 把门写在
   `needs.release-please.outputs.release_created == 'true'` 上、还引用 `...outputs.tag_name`
   —— 两个引用恒为空。也就是说**即便 RP 正常发了版**,sdist/wheel + twine check + SHA256SUMS
   那一步也永远不会有产物。现按官方文档的输出名(下划线式)补上 outputs 映射。
3. 缺"什么都没发生"的可见性:新增一步把 release_created / pr / tag_name / version 写进
   job summary,两者皆空时明确提示"这是失同步还是确实没有约定式提交"。

另加一道硬自证(不再靠人记得去配):配置文件必须存在且是合法 JSON;必须存在 `v*` tag;
`.release-please-manifest.json` **落后于**最新 tag 时直接失败(那会让 RP 重算已发布版本),
领先于最新 tag(发版进行中的状态)只 WARN。比较逻辑用 `sort -V`,5 个情形本机逐条验过
(含 2.10 vs 2.9、10.0 vs 1.0 这种字典序会判错的两例)。

已知代价,写明不藏:`extra-files: []` —— RP 只会自动改 `pyproject.toml` + CHANGELOG,
另外 8 处版本位(`version.json`/`config.yaml`/桌面壳 3 处/安装器/k8s tag)仍靠人工,
所以**下一条真正的 release PR 会被 `test_all_version_sites_agree` 判红**。那是有意的闸
(红 = 有人来同步,而不是发出一堆版本互相矛盾的产物);要交给 RP 就逐条填 `extra-files`,
并且必须在一次真实 release PR 上验,不是照抄文档。

合并顺序:等 v2.2.2 的 tag 落地之后再合,避免上面那个 WARN 长期挂着。

Signed-off-by: ReSerendipity <zengyangc@outlook.com>
@ReSerendipity
ReSerendipity merged commit a174a2e into main Sep 22, 2026
30 checks passed
@ReSerendipity
ReSerendipity deleted the fix/release-please-noop branch September 23, 2026 07:15
ReSerendipity added a commit that referenced this pull request Sep 23, 2026
重扫确认(run 35901422189 / headSha=d875c9c / success):
- py/path-injection 36 → 0(35 判 fixed + #14 按 mitigated 交差);
- py/stack-trace-exposure 7 判 fixed,但同位置重生 16 条新号 #114–#129
  —— 其中 9 条就是 §7.1 那批已 dismiss 的 model.py 调用点,被我删函数的
  行号推移顶了出来。逐条读过落点后全部按 mitigated 绑定 d875c9c 交差。

结论写进 §8.6:dismiss 绑的是告警号而不是代码事实,所以动这两族文件的重扫
成本是"再读一遍、再逐条交差一遍"。另记一次统计口径的坑:
state=fixed 的 --paginate 在结果集变动时会重复返回记录,去重后是
total 128 = dismissed 76 + fixed 52 + open 0。

新增 tests/test_security_surface_http.py(10 条)经真实 ASGI 栈复验 #155
三处行为收紧。第一版漏了先 GET / 取 csrf_token,写请求全以 CSRF 403 结束、
5 条断言"全绿"却没打到业务分支 —— 加正向对照才暴露,这个反例一并写进注释。

本地:pytest 2124 passed / 12 skipped;ruff check/format 全绿。

Signed-off-by: ReSerendipity <ReSerendipity@users.noreply.github.com>
Co-authored-by: ReSerendipity <ReSerendipity@users.noreply.github.com>
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