go-ci-workflow skill 解析¶
go-ci-workflow 是一套面向 Go 仓库 GitHub Actions CI 的设计与重构框架。它的核心设计思想是:CI 设计应先判断仓库是什么形状、本地怎么跑、哪些任务值得进 PR gate、哪些任务必须降级或延后,然后再把这些事实翻译成诚实、可维护、可复现的 CI 结构。 因此它把 仓库形态、本地一致性、安全与权限、执行真实性、降级输出 和结构化报告串成一条明确流程。
1. 定义¶
go-ci-workflow 用于:
- 创建或重构
.github/workflows/*.yml - 将仓库结构映射到 CI job 设计
- 让 GitHub Actions 尽量复用 Makefile 或其他已提交的本地任务入口
- 设计 core gate、integration、e2e、docker-build、vuln scan 等 job 的拆分策略
- 在仓库缺少 Makefile / task runner 时输出诚实的 fallback workflow
- 审查已有 CI 工作流的触发、权限、安全与本地等价性
它输出的不只是 YAML,还包括:
- 仓库形状分类
- 每个 job 的 execution path
- trigger 配置
- permissions 与 secret 假设
- 工具版本来源
- 缺失的本地入口或任务 target
- 实际验证情况
- 在 parity 不完整时的后续建议
从设计上看,它更像一个“Go 仓库 CI 架构决策器”,而不是一个单纯的 GitHub Actions 模板生成器。
2. 背景与问题¶
这个 skill 要解决的,不是“大家不会写 GitHub Actions YAML”,而是 Go 仓库里的 CI 经常存在三类更本质的问题:
- CI 和本地运行方式脱节
- 仓库结构判断错误,workflow 架构跟仓库真实形态不匹配
- 缺少显式降级,仓库明明没有稳定入口,却仍被写成“完整本地等价”
如果没有清晰框架,常见失真通常集中在 8 类:
| 问题 | 典型后果 |
|---|---|
| 不先判断仓库形状 | monorepo、多模块、service、library 被一套模板硬套 |
| 不优先复用 Makefile / 本地入口 | 本地和 CI 跑法分叉,排障成本上升 |
| 任务拆分不合理 | 所有步骤塞进单个 job,或者把高成本 job 强行放进 PR |
| Go 版本、工具版本写死 | go.mod 和 CI 不一致,工具升级不可控 |
| 缺少 concurrency、timeout、cache 等工程细节 | 构建成本高,重复运行浪费资源 |
| 权限和 secret 边界不清 | fork PR 安全性被忽略,workflow 信任模型模糊 |
| 仓库没有稳定入口却假装有 local parity | CI 看似完整,实际上没有本地复现路径 |
| 输出不结构化 | 团队不知道为什么这么设计,也不知道缺什么才能补齐 |
go-ci-workflow 的设计逻辑,就是先把“仓库怎么跑”查清楚,再把“CI 应该怎么对应”系统化。
3. 与常见替代方案的对比¶
先看它与几种常见做法的区别:
| 维度 | go-ci-workflow skill | 直接让模型“写个 Go CI” | 手工复制通用 GitHub Actions 模板 |
|---|---|---|---|
| 仓库形状识别 | 强 | 弱 | 弱 |
| Make / 本地入口复用 | 强 | 中 | 弱 |
| 本地一致性 意识 | 强 | 弱 | 弱 |
| 降级处理 | 强 | 弱 | 弱 |
| Job 架构拆分 | 强 | 中 | 中 |
| Trigger 成本控制 | 强 | 中 | 弱 |
| 权限与 secret 边界 | 强 | 中 | 弱 |
| 输出可审计性 | 强 | 弱 | 弱 |
它的价值,不只是能写 workflow,而是把 CI 设计从模板复制,提升成仓库驱动的工程决策过程。
4. 核心设计逻辑¶
4.1 仓库形态门禁必须先于 workflow 设计¶
go-ci-workflow 的第一道强制门禁是仓库形态门禁。它要求先判断仓库到底是:
- single-module application
- single-module library
- multi-module repository
- monorepo with multiple apps/packages
- Docker-heavy repository
- reusable-workflow candidate
这一步特别关键,因为 CI 架构不是脱离仓库形状存在的。service 和 library 的触发、matrix、docker、integration、release 诉求完全不同;单模块和多模块仓库在 go.mod、cache、路径、job ownership 上也完全不同。
如果这一步做错,后面的 job 拆分、触发策略和路径过滤都会建立在错误前提上。
4.2 先用 discovery 脚本拿仓库事实¶
skill 明确要求先运行 scripts/discover_ci_needs.sh,用它收集:
- Makefile target
- 其他 repo task 入口
- Dockerfile
integration/e2e目录形态- Go module 结构
- workflow 现状
- 被 Makefile 和
scripts/下 shell 脚本显式引用的工具线索
这层设计的价值在于,它把“仓库现状”从模型猜测变成可复现证据。这样做能避免两个典型问题:
- 模型以为某个
make ci存在,实际上并不存在 - 模型以为仓库是单模块,实际上有 nested
go.mod
这也是为什么 go-ci-workflow 比“熟悉 GitHub Actions 语法”的普通提示词更可靠。它先查仓库事实,再做架构决策。
4.3 本地一致性门禁 是这个 skill 的核心¶
go-ci-workflow 最重要的设计之一,是 本地一致性门禁。它要求每个 job 都明确标记执行路径属于:
make targetrepo taskinline fallback
这个设计的价值非常大,因为很多 CI 方案在表面上能跑,但它们并不具备“本地怎么跑,CI 就怎么跑”的可维护性。本地一致性门禁 实际上解决的是:
- 排障时开发者能否直接复现
- CI 行为是否能被本地入口约束
- 仓库演进时 CI 是否会和本地脚本逐渐分叉
评估报告里最明显的增量,也来自这一层:with-skill 能显式记录 parity 与 fallback;without-skill 即使产出 YAML,也很少把这件事说清楚。
4.4 优先 Make-driven delegation vs 优先 inline commands¶
执行优先级 明确规定:
- 优先 Makefile target
- 其次 committed task runner / scripts
- 最后才是 controlled inline fallback
这是一种非常成熟的工程选择。inline command 的问题不是不能用,而是:
- 本地和 CI 行为容易漂移
- 参数、版本、环境变量更容易分散
- 仓库维护者很难知道“正确入口”到底在哪
因此,skill 的默认目标不是“把命令写进 workflow”,而是“让 workflow 复用仓库已经承诺的入口”。只有当仓库本身缺少稳定入口时,才允许降级到 inline fallback,并要求显式记录这种不完整性。
4.5 降级输出门禁¶
当仓库没有 Makefile、repo task、稳定脚本或完整本地入口时,go-ci-workflow 明确要求:
- 不要假装 full parity 存在
- 输出 scaffold 或 inline fallback
- 明确写出缺失 targets / scripts / recommended follow-ups
这层设计非常关键,因为很多 CI 生成类方案最大的问题,不是功能不全,而是把“临时能跑”包装成“结构完整”。评估中的场景 3 就是最好的例子:with-skill 明确标注 inline fallback 和 Local parity: PARTIAL,而 without-skill 则直接写出一份看起来正常的 workflow,却没有告诉读者它缺少 repo-native entrypoint。
这也是为什么 go-ci-workflow 的降级处理在评估里拉开了最大差距。
4.6 触发规则 会强调“按成本和信任边界分层”¶
go-ci-workflow 并不主张“所有 job 在每个 PR 上都跑一遍”。它明确区分:
pull_request:核心 gate、低风险验证、避免 fork secret 风险push:更广泛的验证schedule:昂贵或全面 sweepworkflow_call:真正存在复用价值时才抽 reusable workflow
这个设计体现了一个很成熟的原则:触发策略是成本模型和信任模型的交汇点。
PR gate 太重,会拖慢反馈;secret-dependent job 暴露到 fork PR,又会造成安全风险。trigger 设计因此不是语法问题,而是运行成本与信任边界的设计问题。
4.7 安全与权限 Gate 不只是“加一个 contents: read”¶
这个 skill 不把安全理解成“默认写一行 permissions 就行了”,而是要求先判断:
- 触发事件是什么
- fork PR 能不能碰到 secrets
- 最小权限是什么
- reusable workflow / self-hosted runner 有没有改变 trust boundary
这层设计很重要,因为 GitHub Actions 的风险不只在 job 里运行了什么,还在于谁触发、在哪个边界内触发、是否拿到 secrets 或 write 权限。
它也解释了为什么 skill 在简单场景下仍会强调 permissions: contents: read,而在更复杂场景下要求按需加载 advanced patterns:核心不是“写得更安全一点”,而是让安全边界在 workflow 设计阶段就被显式处理。
4.8 Go Setup 和 Tool Pinning 要成为统一规则¶
go-ci-workflow 对 Go 与工具版本的默认规则是:
- application 场景默认使用
go-version-file: go.mod - 不要随意硬编码单一 Go 版本;如果是需要覆盖多版本兼容性的 library,才考虑显式 matrix
go install的工具版本必须精确锁定- 版本尽量与 Makefile 或 repo-native install script 保持一致
这层设计解决的是两个非常真实的问题:
- 仓库升级 Go 版本后,CI 还停留在旧版本或私自先跑新版本
- CI 和本地工具版本不一致,导致 lint / vulncheck / codegen 结果漂移
从维护角度看,Go 版本和工具版本都应该尽量有清晰可信来源;CI 不应该在没有仓库依据时再创造一套随意的版本事实。
4.9 作业架构规则 要把 core gate 和慢任务拆开¶
skill 明确要求:
- core gate 保持快
- 慢任务、环境敏感任务、昂贵任务拆出去
needs:只在真正有顺序依赖时才使用- 每个 job 都有 timeout
- 用 concurrency 避免冗余运行
这层设计非常工程化。很多 CI 反模式的问题,不在于缺某个工具,而在于 job 颗粒度错误:
- 单 job 过大,失败定位慢
- 慢任务阻塞核心反馈
- 高成本任务在每次 PR 上都运行
把 job architecture 规则显式化,就是在把“反馈速度”“成本控制”“可定位性”同时纳入 workflow 设计。
4.10 references 要按场景选择性加载¶
go-ci-workflow 的 references 分层很清晰。按当前 SKILL.md 约定:
workflow-quality-guide.md和golden-examples.md是基础参考资料repository-shapes.md只在 monorepo / 多模块时加载github-actions-advanced-patterns.md只在复杂信任边界或高级行为时加载fallback-and-scaffolding.md只在缺少本地入口时加载- monorepo / service containers / PR review 也各有单独资料
这说明 skill 的设计非常重视上下文成本控制。标准仓库不需要一上来就加载 monorepo、service containers、fork security 的全部细则;只有场景触发时才展开。这种“基础规则常驻 + 重场景按需加载”的结构,是生产级 skill 可扩展性的关键。
4.11 诚实报告输出契约¶
go-ci-workflow 的 输出契约 要求返回:
- changed files
- repository shape classification
- 每个 job 的 execution path
- trigger configuration
- permissions and secret assumptions
- tool versions used
- missing targets or entrypoints
- validation performed
- parity 不完整时的 follow-up work
这层设计的价值在于,它把 workflow 变更从“只看 YAML diff”升级成“看清设计前提、运行入口和已知缺口”。这对于:
- 团队 review
- 后续维护
- 诊断“为什么 CI 跑法和本地不一致”
都非常重要。评估也表明,baseline 模型在生成 YAML 上并不差,但缺少这种结构化说明,因此很难形成长期可维护的工作流设计记录。
5. 这个设计解决了哪些具体问题¶
结合当前 SKILL.md、references、脚本和评估报告,可以把它解决的问题归纳为:
| 问题类型 | skill 中的对应设计 | 实际效果 |
|---|---|---|
| 仓库形状判断错误 | 仓库形态 Gate + discovery 脚本 | 先识别 repo 类型,再决定 workflow 架构 |
| CI 与本地运行脱节 | 执行优先级 + 本地一致性门禁 | 优先复用 Makefile / repo-native 入口 |
| 没有本地入口却假装完整 | 降级输出 Gate | 显式标记 fallback 和 parity 缺口 |
| PR 上跑了太多高成本 job | 触发规则 + 作业架构规则 | 按成本与风险拆分 job |
| 权限和 secret 假设不清 | 安全与权限 Gate | 把 trust boundary 明确写出来 |
| Go / 工具版本不一致 | Go Setup and Tooling Rules | 保持 go.mod、Makefile、CI 的版本一致性 |
| 冗余运行浪费资源 | concurrency + timeout + intentional needs: | 控制成本并提升反馈效率 |
| workflow 改动难以审计 | 输出契约 | 团队能看到 shape、path、trigger、缺口和验证状态 |
6. 主要亮点¶
6.1 它把“仓库怎么跑”放在“CI 怎么写”前面¶
这是整个 skill 最重要的设计点。CI 不是独立模板,而是仓库运行模型的映射。
6.2 Make-driven delegation 做得非常坚决¶
很多 workflow 方案会在仓库明明有 Makefile 时,仍直接写 inline 命令。go-ci-workflow 明确把这种情况当成次优路径处理。
6.3 对降级处理非常诚实¶
这也是它在评估里差距最大的一项。它不会因为能拼出 inline command,就假装仓库已经具备完整 local parity。
6.4 对 GitHub Actions 的安全边界有真实工程意识¶
permissions、fork PR、secret exposure、workflow trigger、reusable workflow trust boundary,这些都被当成 workflow 设计的一部分,而不是附加备注。
6.5 输出契约 很适合长期维护¶
workflow 改动在团队里最怕“改完只剩 YAML,为什么这么改没人记得”。结构化输出正好补了这一层。
6.6 当前版本的核心价值,比评估快照更像“CI 设计方法论”¶
评估报告最强地验证了它在 Make-driven delegation、降级处理、输出契约 和 local-equivalence markers 上的价值。与此同时,当前 skill 已经通过 references 和 discovery 脚本,把 repo shape、advanced trust boundary、fallback scaffolding 等内容进一步工程化。因此当前版本不只是“会写更好 YAML”,而是在提供一套更完整的 Go CI 设计方法论。
7. 什么时候适合用,什么时候不该硬用¶
| 场景 | 是否适合 | 原因 |
|---|---|---|
| 新建 Go 仓库 GitHub Actions CI | 适合 | 这是它的核心场景 |
| 重构已有劣质 CI workflow | 适合 | 能系统识别反模式和本地脱节问题 |
| Makefile 驱动的 Go service | 非常适合 | 它最擅长这种仓库 |
| 没有 Makefile / 任务入口的 Go 仓库 | 适合 | 但会进入诚实降级路径 |
| monorepo / 多模块 Go 仓库 | 适合 | 需要额外加载 repo shape 参考资料 |
| 非 GitHub CI 系统 | 不适合 | skill 范围不覆盖 |
| release / deploy pipeline | 不默认适合 | 除非用户明确要求 |
8. 结论¶
go-ci-workflow 的真正亮点,不是它会写 GitHub Actions 语法,而是它把 Go 仓库 CI 设计里最容易被忽略的工程判断系统化了:先识别仓库形状,再确认本地入口和 trust boundary,然后决定 job 架构、trigger 分层、工具版本来源和降级路径,最后用结构化输出把整个设计前提和缺口记录下来。
从设计上看,这个 skill 非常清楚地体现了一条原则:好的 CI 不是“看起来规范”,而是“与仓库真实运行方式一致,在做不到完全一致时也能诚实地标出来”。 这也是它特别适合 Go 仓库 workflow 设计与重构的原因。
9. 文档维护¶
当以下内容发生变化时,这份文档应该同步更新:
skills/go-ci-workflow/SKILL.md中的 执行优先级、强制门禁、触发规则、输出契约 或 作业架构规则 发生变化。skills/go-ci-workflow/references/workflow-quality-guide.md、golden-examples.md、repository-shapes.md、github-actions-advanced-patterns.md或fallback-and-scaffolding.md中的关键规则发生变化。skills/go-ci-workflow/scripts/discover_ci_needs.sh的输出字段、分类逻辑或工具检测方式发生变化。evaluate/go-ci-workflow-skill-eval-report.zh-CN.md中支撑本文判断的核心结果发生变化。- skill 在 local parity、fallback 或 advanced GitHub Actions 安全策略上有明显重构。
建议按季度复查一次;如果 go-ci-workflow 的 gate、fallback 机制或 discovery 脚本有明显重构,则应立即复查。
10. 相关阅读¶
skills/go-ci-workflow/SKILL.mdskills/go-ci-workflow/references/workflow-quality-guide.mdskills/go-ci-workflow/references/golden-examples.mdskills/go-ci-workflow/references/repository-shapes.mdskills/go-ci-workflow/references/github-actions-advanced-patterns.mdskills/go-ci-workflow/references/fallback-and-scaffolding.mdskills/go-ci-workflow/scripts/discover_ci_needs.shevaluate/go-ci-workflow-skill-eval-report.zh-CN.md