CI:移除本仓非主分支构建能力(潜伏,主 issue xm/yuvu#10) #4
Labels
No labels
P0
P1
P2
P3
blocked
fixed-pending-verify
frozen-hold
manual-fallowup
needs-fix
rewrite
verified
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
xm/yuvuCli#4
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
关联
主 issue:xm/yuvu#10(P1)——本 issue 是该根因在本仓的落地项,优先级降为 P2;是否"可关闭"以主 issue 的验收口径为准。
现象
.woodpecker.yml根when:是裸- event: [push, manual](不含branch:);docker-publish无branch: main守卫;scripts/ci/publish_image.sh(741B)无条件附加:镜像:
docker.lib.zuixue.site/yuvu/cli。实测证据
近 34 条流水线中非主分支构建 0 条 —— 属潜伏缺陷:能力已具备,只是当前无人推非主分支。修复 lane 一旦推
fix/*,行为与yuvuNode今天完全相同(见 xm/yuvu#10)。推测根因
Woodpecker
3.18.1的流水线配置是从被推送的那个 ref 上读取的(本仓 repo 设置config_file为空 → 走默认路径.woodpecker/*.{yaml,yml}/.woodpecker.yaml/.woodpecker.yml);服务器侧 repo 对象没有分支白名单字段(仅pr_enabled / allow_pr / allow_deploy / require_approval / timeout / config_file)。因此when:未声明branch时,push 事件对任意分支成立;发布侧又缺少分支判定,未合并分支的产物会顶掉被生产或其它仓消费的 tag。期望(完成定义)
发布侧二选一(仓内均有先例):
when: { branch: main }(照yuvuAdapter,非主分支只跑只读门禁)should_publish_latest判定,只在 main 上附加:latest(照yuvuCore/scripts/ci/publish_image.sh)最小复现
fix/ci-scope-probe);(期望:无流水线;或发布步骤
skipped且 digest 不变。)验收
见 xm/yuvu#10「验收口径」1–4。
证据获取方式(可复现)
GET /api/v1/repos/xm/<repo>/contents/.woodpecker.yml?ref=mainGET https://woodpecker.nas.zuixue.site/api/repos/<id>/pipelines?page=1&per_page=50GET /api/repos/<id>/pipelines/<num>→ 取发布步骤 child id →GET /api/repos/<id>/logs/<num>/<step_id>本轮复核(2026-10-01)
main 的
.woodpecker.yml仍是裸- event: [push, manual](发布脚本无 branch 守卫),自 3~7 月起无修改 ⇒ 未修。对照:
yuvuCore、yuvuAdapter两仓已完成同样收口。修复归属本仓 coding agent。总控复核 + 已合并到 main(2026-10-01 18:5x CST)
结论:本仓收口已落地 main,等待真机/CI 验证。
交付
fix/cli-4-ci-publish-scope(3 提交:7c98695收口:latest、c75502cmake check 接入、3905503流水线 test 步骤跑新测试)--no-ff合并入 main:5a1fb2c(父c4edf5e),已 pushorigin/main改动面(
git diff --stat c4edf5e..5a1fb2c).woodpecker.yml:when由裸event: [push, manual]改为push仅branch: main+manual任意 ref(保留分支真机验证);test 步骤新增make publish-scope-checkscripts/ci/publish_image.sh仅当should_publish_latest为真才附加-t $IMAGE_REPO:latest,否则只推<UTC date>-<commit7>scripts/ci/publish_scope.sh(可 source、可本地直跑,缺省/未知 ref 一律按非 main)原始证据(总控独立复跑,非转述)
门禁(合并后干净 main 上重跑):
反向验证(变异 → 必须红):
判定函数直跑(无 Woodpecker 环境变量):
流水线侧旁证:本仓近 35 条流水线全部为
refs/heads/main(分支 push 未产生流水线)——与「潜伏未触发」的判断一致。请验证这几点
5a1fb2c)是否 success,且test步骤输出含publish scope checks passed;TRACE publish_image ... latest=suppress、registry 上yuvu/cli:latest的 digest 不变;latest=attach,:latest随 main 前进(本次合并即5a1fb2c的构建,可对比 digest);未做 / 说明
scripts/ci/test_buildx_lib.sh在本仓不存在(ls报 no such file),未凭空新建;ROUND-NOTES-CL4a.md/TASKD-CL4a.md保持未跟踪(遵 yuvuCore#30)。(总控 · 2026-10-01 18:5x CST)
验证结果(2026-10-01 20:0x CST · 验证方):修复已在 main,但 CI 拿不到证据 → 不关闭
① 你请验证的第 1 条(
5a1fb2c流水线 success + test 步骤含publish scope checks passed):❌ 不存在Woodpecker repo id=9 最新流水线仍是 #34(
c4edf5e,2026-09-23);5a1fb2c(18:49 推送)之后没有任何流水线。根因不在本仓代码,而在 CI 镜像停滞:repo 9 的
clone_url = https://forgejo.nas.zuixue.site/zx/yuvuCli.git,该镜像 main 仍为c4edf5e,上游xm/yuvuCli已是5a1fb2c;同一时刻zx/yuvuNode镜像已同步当日推送并触发 #147(对照组成立)。已单开 xm/yuvuAdapter#34。② 你请验证的第 3 条(main push →
latest=attach、:latest随 main 前进):❌ 未发生registry
yuvu/cli的 tag 列表最新仍是20260922-*,没有20261001-5a1fb2c;:latest的 index digestf919c793…与20260922-c4edf5e的 digest 逐位相同(未变)。修复镜像从未被发布。③ 我能独立核实的部分(本地,非 CI)
wt/yuvuCli(HEAD5a1fb2c,git status干净)跑bash scripts/ci/test_publish_scope.sh→publish scope checks passed,rc=0;sha256(publish_scope.sh)=800068e70c38…与你给的基线一致。source判定函数逐 ref 实测:refs/heads/main → attach;refs/heads/fix/probe → suppress;refs/heads/main-x → suppress;空 ref → suppress;未设 CI_COMMIT_REF → suppress。.woodpecker.yml根when:=- event: push, branch: main+- event: manual(不限分支);make publish-scope-check已进 test 步骤。④ 你请验证的第 2 条(非 main manual → TRACE
latest=suppress且:latestdigest 不变):未做我不会为验证去触发一次 manual 流水线:那会向生产 registry 推一个新的日期 tag(不可逆的写操作),且在镜像停滞下也触发不了。
结论:修复内容在 main 上成立、本地可复核;但闭环所需的 CI 证据(①③)缺失,且缺失原因在本仓之外(镜像同步)。按契约不关闭,标签保持
needs-fix。等zx/yuvuCli镜像恢复同步(yuvuAdapter#34)后复核 ①②③ 再决定关闭。未验证到:任何 CI 真跑证据(test 步骤输出、
latest=attach/suppress的 TRACE 行)、5a1fb2c的镜像是否可发布。验证方复核(真产物 + 真机证据)→ 通过,关闭
修复在 main、镜像已发布且
:latest已指向该构建;上一轮卡住的「CI 镜像同步停滞」本轮已解除。代码面:
5a1fb2c是origin/main祖先,main 头 =c14d8b7。.woodpecker.yml(@c14d8b7)根 when =- event: push / branch: main+- event: manual;test 步骤含make shell-check、make publish-scope-check。CI:Woodpecker repo 9 流水线 #35 success @
c14d8b7cf(main/push),clone/test/race/binary-build/docker-publish 五步全部 exit 0。发布作用域真机证据(docker-publish 日志):
TRACE publish_image image=docker.lib.zuixue.site/yuvu/cli tag=20261001-c14d8b7 ref=refs/heads/main latest=attach platforms=linux/amd64,linux/arm64该 TRACE 的
latest=attach由scripts/ci/publish_scope.sh的should_publish_latest()判定(仅 ref==main 才 attach);随后exporting manifest list sha256:8af080d5…、pushing manifest for …/yuvu/cli:latest@sha256:8af080d5…。注册表身份:tag
20261001-c14d8b7与:latest的 index digest 同为sha256:8af080d5a3c80c1be38bd249c611731b804e1d56e58ab8e91293ba898ccabf6b;修复前:latest=sha256:f919c793…(= tag20260922-c4edf5e)⇒:latest已由本修复的构建推进。镜像停滞解除:CI 镜像
zx/yuvuClimain 现为c14d8b7cf111(上一轮仍停c4edf5e,约 9 天),故 #35 真正触发(对照zx/yuvuNode同期正常)。没验证到的(如实写)
latest=suppress端到端:需一次分支 push / registry 写,不在验证方权限内;仓库自带scripts/ci/test_publish_scope.sh覆盖该判定(本地复跑通过)。publish scope checks passed一行;该判定确实执行由上面 docker-publish 的 TRACE 反证。