- U1.4: dev synced fast-forward (fabd85a6..1bb48030, 337 commits), 11 tags pushed - D5: 25 merged stale remote branches deleted, 10 remain - U1.5 drill: branch protection N1-N5 all pass; self-approval forbidden by Gitea -> D2' amendment: agent-bot account created (author/reviewer separation) - CI root cause found+fixed: docker network pool exhaustion (24 stale job networks pruned) - D7: new migration workspace directive (no in-place Agent-System breakage)
4.1 KiB
title, date, task_id, drill_repo, basis
| title | date | task_id | drill_repo | basis |
|---|---|---|---|---|
| U1 治理演练记录:Gitea 原生门禁与 CI 可用性验证 | 2026-09-29 | multi-repo-design-2026-09-28 | weichen/governance-drill-2026-09 (private, 验证后保留至 U2b 收口再删) | 2026-09-29-multi-repo-implementation-plan.md Phase 0 / U1.5 |
U1.5 演练结论(全部通过)
环境:Gitea 1.27.3(本机 docker:gitea-server/gitea-db/gitea-runner),runner home-runner,
标签映射:ubuntu-latest→docker://gitea/runner-images:ubuntu-latest、docker→docker://docker:dind(不可用)、nightly→host。
分支保护与 PR 门禁(负例 + 正例)
保护配置(drill main):enable_push=false、required_approvals=1、dismiss_stale_approvals=true、 block_on_outdated_branch=true、apply_to_admins=true、status_check_contexts=[pr-verify / verify (pull_request)]。
| 编号 | 场景 | 结果 |
|---|---|---|
| N1 | admin 身份 HTTP 直推保护分支 | 拒绝(pre-receive hook declined;apply_to_admins=true 生效) |
| N2 | API PUT /contents 写保护分支 | 拒绝(user cannot commit to repo) |
| N3 | 无批准合并 PR | 拒绝(Does not have enough approvals) |
| N4 | 批准后 head 新提交再合并 | 拒绝(陈旧批准被撤销);重新批准后可合并 |
| N5 | required status check 未完成时合并 | 拒绝(405 Please try again later);CI success 后合并成功 |
| 自批准 | 作者批准自己的 PR | Gitea 1.27.3 硬禁止(approve your own pull is not allowed),admin 亦不可 |
合并语义:merge 后 base.sha=merge_commit_sha(0540e27c),merged_by=审核者(weichen)而非作者。 PR #2/#3 全流程:agent-bot(作者)→ weichen(批准+合并),作者/审核者分离经 Gitea 原生强制。
D2' 决策修正:agent-bot 机器账号
单账号下 required_approvals=1 永远无法满足(自批准被硬禁止)。
已创建机器账号 agent-bot(凭据存 ~/.secrets/agent-bot,token scope:write:repository, read:user):
编码 Agent 以 agent-bot 提交/建 PR;用户以 weichen 批准并合并。原方案 D2"不建机器人账号"据此作废。
CI 可用性与根因修复
发现并修复 Agent-System CI 自 2026-09-24 起全红的根因:
- docker 网络地址池耗尽:历史 CI 任务遗留 24 个
GITEA-ACTIONS-TASK-*桥接网络未清理, 默认地址池(~16 个 /16 池)占满,此后所有 docker 模式任务创建 job 网络时报all predefined address pools have been fully subnetted秒败。已清理全部 24 个陈旧网络(10 个网络保留), 清理后 ubuntu-latest docker 模式任务验证成功。 - nightly host 模式失败为当时环境问题:09-24~28 日志显示 runner 容器内 github.com DNS(fake-ip 198.18.0.1)拒绝;
当前 DNS(192.168.3.1)下 runner 容器可访问 github.com,
actions/checkout@v4克隆探针成功。 docker:dind标签的镜像拉取在本机挂死,该标签不可用;工作流避免使用。
Workflow 路径行为(实例特性)
- 新仓库只有
.gitea/workflows/路径触发(树级检测:文件未被本次提交修改也会触发); drill 仓.github/workflows/从未触发(含文件被修改的推送)。 - 存量 Agent-System 仓
.github/workflows/正常触发(run 74 = 本日 dev 推送,179 个历史任务均来自该路径)。 - 结论:现有 Agent-System 维持
.github/workflows/不迁移;新建仓库一律用.gitea/workflows/。 实例对不同仓库的路径检测差异根因未深究,已记录为已知行为。
遗留状态
- drill 仓任务 183/185(docker:dind 拉取挂死)在 UI 呈 running 僵尸态,无实际执行,仓库删除时一并消失。
- 演练仓保留至 U2b 完成(作为保护配置参照),之后删除。
对 U2b 的直接输入
- dev/test/main 保护字段组合与白名单保底方案(weichen 进 push whitelist 以不破坏现有直推流程)。
- required checks 的 context 命名格式:
<workflow> / <job> (<event>)。 - 新流程红线:作者≠批准者由 Gitea 强制;Agent 不得以 weichen 身份批准自己的 PR。