CI/CD 与发布:从流水线到灰度与回滚
0. 元信息
- 主题路径:
docs/topics/ci-cd-and-release/README.md - 主分类:工程技术
- 辅助分类:安全与可靠性
- 适合对象:写过 Dockerfile、能用 Git 协作、想把代码从 push 到生产全链路打通的后端/SRE/DevOps 工程师
- 建议周期:4~6 周,每周 8~12 小时(含至少一半时间搭真实流水线、做一次完整 canary + 回滚演练)
- 前置知识:
git-and-collaboration、docker-basics、rest-api-design;会读 YAML、写 shell、看 kubectl 输出 - 最终目标:能独立设计 CI 流水线(构建/测试/扫描/产物上传),选择 CD 策略(蓝绿/金丝雀/滚动/灰度),用 IaC + GitOps 把多环境管起来,用 DORA Four Keys 度量团队交付能力,事故出现时按预案回滚
1. 学习路线
流水线核心(GitHub Actions / GitLab CI / CircleCI)
→ 制品、缓存、矩阵、self-hosted runner
→ semver、tag、release branch、changelog
→ CD 策略:蓝绿 / 滚动 / 金丝雀 / 灰度
→ feature flag、Argo Rollouts、Flagger、Spinnaker
→ IaC:Terraform / Pulumi / Ansible
→ GitOps:Argo CD / Flux、drift 检测、多环境
→ DORA Four Keys、SBOM、SLSA、签名、审计
→ 回滚预案、incident response、综合项目
按代码从 commit 到生产这条链学。每一步都跑真实流水线或部署真实环境,先证据后结论。
2. 阶段周数分配
| 阶段 | 4 周方案 | 6 周方案 | 备注 |
|---|---|---|---|
| 1. CI 流水线核心 | 0.6 | 0.75 | workflow 语法、jobs/steps、runner |
| 2. 制品、缓存、矩阵 | 0.5 | 0.6 | artifact、cache、matrix、并发 |
| 3. Release 与版本化 | 0.4 | 0.5 | semver、tag、release branch、changelog |
| 4. CD 策略与发布 | 0.6 | 0.8 | blue-green / canary / rolling |
| 5. Argo Rollouts / Flagger | 0.5 | 0.75 | trafficSplit、abort、metric gating |
| 6. IaC 与 GitOps | 0.5 | 0.75 | Terraform/Pulumi + Argo CD/Flux |
| 7. 可观测、合规、DORA | 0.5 | 0.75 | SBOM、SLSA、DORA Four Keys、签名 |
| 8. 回滚与事故响应 | 0.2 | 0.5 | 演练 + retrospective |
| 9. 综合项目 | 0.2 | 0.6 | GitHub Actions → GHCR → k8s canary |
4 周方案对应每天满负荷;6 周方案多出的时间用来重做实验和制造故障,不用来囤课。
3. 九阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1 | workflow 语法、trigger、jobs、steps、context、env、action、runner | 一条可跑通的 build+test pipeline | 能解释每个 step 的作用,不混淆 ${{ }} 表达式与 shell 变量 |
| 2 | artifact、cache、matrix、concurrency、self-hosted runner、OIDC | 多平台、多版本、多 OS 的 buildx 流水线 | 解释 cache key 设计,矩阵规模 ≤ 256,OIDC 配云权限 |
| 3 | semver、conventional commits、release branch、changelog、git tag | 语义化版本脚本 + 自动 changelog | v1.2.3-rc.1 能稳定 bump,旧 patch 不污染历史 |
| 4 | blue-green、rolling、canary、feature flag、kill switch | 把一份 deploy manifest 跑成三种策略 | 能说出每种策略的回滚代价、回滚时长、爆炸半径 |
| 5 | Argo Rollouts AnalysisTemplate、Flagger metric provider、Spinnaker pipeline | canary 步骤 + 指标门控 | 写一段 canary YAML 并解释 trafficSplit、abort 触发条件 |
| 6 | Terraform state、provider、module、Argo CD Application、Flux GitRepository | 一份可漂移检测的多环境 repo | terraform plan 与 argocd app diff 能分别指出差异 |
| 7 | SBOM、SLSA provenance、cosign 签名、audit log、DORA Four Keys | 制品带 SBOM + 签名 + 四指标采集 | 能用 cosign verify 拒签伪造制品;用 DORA 模板出季度报告 |
| 8 | revert、blue-green switch、canary abort、incident doc、retro | 一次完整回滚演练 + 复盘文档 | 5 分钟内定位上一稳定版本,10 分钟内回滚完成并写 IR |
| 9 | GitHub Actions → GHCR → k8s Argo Rollouts 金丝雀全链路 | 一个 Web 应用的端到端发布 demo | 在 demo 环境完成 5 次发布、2 次金丝雀、1 次回滚并截图留证 |
关键陷阱有四个:流水线只跑 happy path;用 latest tag 部署;CD 策略选错爆炸半径太大;只看部署成功,不看 DORA 数据。
4. 第一周任务
Day 1 运行约定:使用 GitHub Actions(免费额度 2000 分钟/月,公开仓库无限);记录
gh --version、act --version(本地 runner)、kubectl version、docker version、terraform version。所有命令记录 commit SHA、runner label、时间戳。回滚演练前先在 staging 跑一次。
| 日 | 任务 | 当天交付 |
|---|---|---|
| Day 1 | 在 GitHub 创建一个空 repo,写 .github/workflows/ci.yml,on: push 跑 echo "Hello CI" + actions/checkout@v4 | 第一次绿勾 workflow run 截图 |
| Day 2 | 加 jobs:build 跑 docker buildx build,test 跑 go test ./...(或同等语言测试);用 needs 控制顺序 | 两 jobs 的依赖图与日志 |
| Day 3 | 加 actions/upload-artifact@v4 上传构建产物;加 actions/cache@v4 缓存 go module / npm cache | artifact 下载链接 + cache 命中日志 |
| Day 4 | 加 matrix: { os: [ubuntu-latest, macos-latest], node: [18, 20] };看并发数变化 | 4 个 job 矩阵截图 |
| Day 5 | 用 docker/login-action@v3 推到 GHCR(ghcr.io/<owner>/<repo>);配 OIDC | 镜像可见、tag 正确 |
| Day 6 | 在 k8s 上部署 GHCR 镜像;用 kubectl rollout status 观察;触发一个新 commit 验证更新 | deployment 状态变化截图 |
| Day 7 | 步骤 A:把上面六天的产出拼成一条能 build → test → scan → push → deploy 的流水线;步骤 B:制造 4 类失败——单元测试失败、scan 报 critical CVE、镜像 push 401、deploy 找不到 image,并记录如何回滚 | 流水线截图 + 4 类失败的处理记录 |
5. 阶段通用验收
- 不看答案独立写一条 GitHub Actions workflow;
- 用自己的话解释 CI/CD 关键概念(jobs/steps、artifact、cache、matrix、runner、OIDC);
- 画一张图:commit → CI → registry → CD → 环境 → 监控;
- 测试正常、测试失败、scan 失败、push 失败、deploy 失败、回滚六类路径;
- 至少准备 3 个真实仓库并贴出实际 workflow run 链接;
- 记录 DORA Four Keys(部署频率、变更前置时间、变更失败率、失败恢复时间);
- 能修改既有流水线(加 stage、修 cache、加 secret 旋转),而不是只能照抄。
6. 最终验收
- 独立设计 CI 流水线(构建/测试/扫描/产物上传)并落地;
- 至少完成 18 个真实 workflow run(4 类失败 + 14 类成功);
- 制造并定位至少 8 类事故:cache miss 导致 build 慢、并发超过 256、OIDC 配错、canary 指标不达标、drift 检测报警、签名验证失败、tag 冲突、镜像被覆盖;
- 完成 1 个综合项目:GitHub Actions → GHCR → k8s Argo Rollouts 金丝雀全链路,交付 workflow、Rollout manifest、Dashboard 截图、回滚记录与
notes/retrospective.md; - 能用 15 分钟讲清从 commit 到生产的全链路,以及 DORA Four Keys 怎么采。
7. 综合项目
首选:为一个真实 Web 应用搭建 GitHub Actions → GHCR → k8s Argo Rollouts 金丝雀发布全链路。
必须包含:workflow(on push / on tag / merge queue)、multi-stage build、image 扫描(trivy / cosign)、SBOM 输出、GHCR 推送(OIDC)、k8s manifest、Argo Rollouts Canary 步骤(含 AnalysisTemplate 用 Prometheus 指标门控)、自动回滚、merge queue、Dashboard(Grafana)四指标。
备选:把现有手动发布流程重构为 GitOps(Argo CD + IaC)。
把现有应用从 kubectl apply / 脚本部署改成 Application + GitRepository 模式,配 Terraform 管云资源、Helm 管 k8s 资源,实现 push-to-deploy 与 drift 检测。
任何项目都需包含:
- 需求与成功标准(DORA 指标目标);
- 流水线拓扑、Runner 与 cache 选择理由;
- 关键 YAML(workflow、Rollout、Application);
- 模块化源码或 manifest;
- 正常/失败/回滚测试;
- 环境、权限、清理和脱敏说明;
- README + Dashboard + 原始证据索引;
- retrospective(用时、难点、收获、下一步)。
8. 推荐开源资料
| 角色 | 资料 | 许可证 / 可访问性 | 用法 |
|---|---|---|---|
| CI 文档 | GitHub Actions 官方文档 | 公开文档 | workflow 语法、OIDC、artifact 全部查这 |
| CI 文档 | GitLab CI/CD 文档 | 公开文档 | 对照 .gitlab-ci.yml 与 GitHub Actions 差异 |
| CI 文档 | CircleCI 文档 | 公开文档 | orbs、context、matrix 设计参考 |
| CD 文档 | Argo Rollouts 文档 | Apache-2.0,公开 | canary / blue-green / AnalysisTemplate 主线 |
| CD 文档 | Flagger 文档 | Apache-2.0,公开 | 对照 Argo Rollouts 的轻量选择 |
| CD 文档 | Spinnaker 文档 | Apache-2.0,公开 | 多云 pipeline、stage 模型 |
| 经典书 | Humble & Farley, Continuous Delivery | 商业书籍 | 「部署流水线」原始定义 |
| 经典书 | Kim, Behrens, Spafford, The Phoenix Project | 商业书籍 | DevOps 文化入门小说 |
| 经典书 | Forsgren, Humble, Kim, Accelerate | 商业书籍 | DORA Four Keys 的统计基础 |
| IaC | Terraform 官方文档 | MPL-2.0,公开 | state、module、provider 主线 |
| IaC | Pulumi 官方文档 | Apache-2.0,公开 | 用通用语言写 IaC |
| GitOps | Argo CD 文档 | Apache-2.0,公开 | Application、Sync、Drift 主线 |
| GitOps | Flux 文档 | Apache-2.0,公开 | GitRepository、Kustomize、Helm 主线 |
| 安全 | SLSA 框架 | 公开规范 | 供应链等级模型 |
| 安全 | Sigstore Cosign | Apache-2.0,公开 | 无密钥签名、verify-blob |
| 可观测 | DORA Four Keys | 公开指南 | 四指标采集与解读 |
默认顺序:先跑通一条 happy path → 加失败注入 → 加 cache/matrix → 拆 CD 策略 → 上 GitOps → 上签名/SBOM → 出 DORA 卡。
9. 学习资料汇聚(v0.3 自包含)
本节由本计划生成。链接指向原始材料或作者公开内容。标准会更新,实验记录必须写明版本和日期。
9.1 背景与动机
CI/CD 不是工具集,是工程纪律。它回答一个老问题:怎么让代码变更以可预测、低风险、可回滚的方式持续流到生产。
1990 年代之前,软件以季度/年度发布。Jez Humble 和 David Farley 在《Continuous Delivery》一书中提出「部署流水线」概念:build → test → deploy 是一条单一路径,每一步都有自动验证和回滚手段。Eric Ries 的《The Lean Startup》同期把 build-measure-learn 循环搬到软件交付上,强调 MVPS(小可行发布)。
2010 年代后,DORA(Dora DevOps Research and Assessment)开始量化交付能力:DORA Four Keys(部署频率、变更前置时间、变更失败率、失败恢复时间)。Forsgren、Humble、Kim 在 Accelerate 中用四年统计把 DORA 与组织绩效绑死,今天几乎所有工程效能报告都会引这四个数字。
今天这条链上的工具组合通常是:GitHub Actions / GitLab CI 做 CI;Argo CD / Flux 做 GitOps;Argo Rollouts / Flagger / Spinnaker 做渐进式发布;Terraform / Pulumi 做云资源 IaC;Sigstore / SLSA 做供应链签名;Prometheus / Grafana 做 DORA 看板。学习 CI/CD 的价值不在于记住某个工具的 YAML,而在理解「让变更持续安全地流向生产」这件事的全链路权衡。
9.2 概念地图
flowchart LR
Commit[commit / merge queue] --> CI[CI runner]
CI --> Build[build / multi-stage]
Build --> Test[unit / integration]
Test --> Scan[scan / SBOM]
Scan --> Sign[cosign sign]
Sign --> Registry[OCI registry]
Registry --> CD[CD controller]
CD --> Strategy{release strategy}
Strategy --> BlueGreen[blue-green]
Strategy --> Rolling[rolling]
Strategy --> Canary[canary / Argo Rollouts]
CD --> IaC[Terraform / Pulumi]
CD --> GitOps[Argo CD / Flux]
Canary --> Metrics[Prometheus gate]
Canary --> Flag[feature flag]
Metrics --> Decision{abort?}
Decision -- yes --> Rollback[rollback]
Decision -- no --> Promote[promote]
Promote --> Observability[DORA / audit log]
Observability -.反馈.-> CI
核心关系:commit 触发 CI;CI 产出可签名、可扫描的 OCI 制品;CD controller(Argo CD / Rollouts)按策略分发到目标环境;策略选择决定回滚代价;指标、feature flag、审计日志形成反馈环,反过来影响下次发布的策略与质量门。
9.3 基础知识讲解
9.3.1 经典论文 / 规范
| 资料 | 影响 | 建议读法 |
|---|---|---|
| Humble & Farley, Continuous Delivery (2010) | 「部署流水线」原始定义;把自动化测试、版本控制、持续集成、可重复部署串成一条线 | 看第二章「配置管理」与第八章「部署流水线」 |
| Forsgren, Humble, Kim, Accelerate (2018) | DORA Four Keys 的统计基础;把交付能力与组织绩效绑死 | 看第三章「技术实践」与第四章「DORA 模型」 |
| DORA, Accelerate State of DevOps Report(年度更新) | 行业基线与高/中/低绩效切分 | 当下报告查 dora.dev/reports |
| Beck et al., The Agile Manifesto (2001) | 早于 CD 几年,但个体/协作/可工作软件/响应变化四个价值观直接喂给 CI/CD 文化 | 原文很短,对照反思现状 |
| Reis, The Lean Startup (2011) | build-measure-learn;CDP(Continuous Deployment Pipeline)是 MVP 工程化 | 看第 6、9 章 |
| NIST SP 800-204C | DevSecOps 流水线安全实践 | 查 supply chain 章节 |
| SLSA v1.0 | 供应链完整性等级模型(L1-L4) | slsa.dev 读 L3 要求 |
9.3.2 经典书籍
| 书 | 影响 | 用法 |
|---|---|---|
| Humble & Farley, Continuous Delivery | 上面已说 | 入门主线 |
| Forsgren, Humble, Kim, Accelerate | 上面已说 | 配合 DORA 看数据 |
| Kim, Behrens, Spafford, The Phoenix Project | DevOps 文化入门小说 | 帮推动组织变革时引用 |
| Brikman, Terraform: Up & Running(3rd ed., 2022) | Terraform 实战与模块化 | IaC 主线 |
| Burns, Designing Distributed Systems | sidecar / ambassador / adapter 模式 | 流水线 service mesh 用法 |
| Majors, Observability Engineering | OTel/Prometheus/SLI/SLO 实操 | DORA 卡的可观测底层 |
| Kim, The Site Reliability Workbook | SRE 实践 | 配合事故响应章节看 |
| Humble, Continuous Delivery in the Wild | 大规模组织的真实数据 | 进阶 |
| Skelton, Pais, Team Topologies | 团队拓扑与交付节奏 | 配合文化章节 |
| Ford, Building Evolutionary Architectures | 架构适应度函数 | 与 canary / feature flag 结合 |
备查:Kim 等的 The DevOps Handbook;Vernon, Implementing Domain-Driven Design(DDD 与发布边界)。
9.3.3 优秀博客 / 文档
| 资料 | 特点 | 用法 |
|---|---|---|
| GitHub Actions 官方文档 | workflow 语法、OIDC、artifact、security hardening 全部在这 | 主线查阅 |
| GitLab CI/CD Reference | 与 Actions 对照看 | 看 DAG 与 includes |
| Argo Rollouts 文档 | canary / blue-green / AnalysisTemplate 主线 | 必读 |
| Argo CD 文档 | Application / Sync / Drift | 必读 |
| Flux 文档 | GitOps Toolkit | 必读 |
| Spinnaker 文档 | 多云 pipeline | 备查 |
| Flagger 文档 | 轻量渐进发布 | 对照 Argo Rollouts |
| LaunchDarkly Blog | feature flag 工程实践 | flag 模式与案例 |
| Charity Majors 博客 | Observability Engineering 主线 | 配合 SLO |
| DORA 报告与指南 | Four Keys + 调研方法 | 必读 |
| Terraform Learn | state、module、import | IaC 入门 |
| Pulumi Blog | 用 TS/Go/Python 写 IaC | 对照 Terraform |
| Sigstore Blog | cosign / Rekor / Fulcio | 供应链 |
| Brendan Gregg | performance / observability 经典 | 配合 SLO |
| Julia Evans zines | 把复杂工具画成一张纸 | 入门破冰 |
9.3.4 核心人物
| 人物 | 主要影响 | 建议追踪的材料 |
|---|---|---|
| Jez Humble | Continuous Delivery、DORA、Accelerate | 书、DevOps Enterprise Summit 演讲 |
| David Farley | Continuous Delivery、CI/CD 实践派 | 书、博客 |
| Eric Ries | Lean Startup、build-measure-learn | 书 |
| Gene Kim | Phoenix Project、DORA | 书、报告 |
| Nicole Forsgren | DORA、Accelerate 统计 | 论文、报告 |
| Kelsey Hightower | Kubernetes、GitOps 布道 | Kubernetes The Hard Way、博客 |
| Charity Majors | Observability Engineering | 书、博客 |
| Liz Rice | Container Security、eBPF | 书、演讲 |
| Sam Newman | 微服务、独立可部署性 | 书 |
| Kelsey Evans(FluxCD 维护者之一) | GitOps Toolkit | GitHub、博客 |
| Dan Lorenc(Chainguard / Sigstore) | SLSA / cosign | 演讲、博客 |
9.3.5 开发方法
| 方法 | 具体动作 | 何时用 |
|---|---|---|
| Pipeline-as-code | workflow / pipeline 文件版本化、PR review | 任何 CI/CD 改动 |
| Trunk-based | 主干开发,short-lived feature branch | 配合 merge queue 提速 |
| Merge queue | PR 排队合并,CI 单测通过才进 | 大 monorepo、高并发 PR |
| Immutable build | image 只构建一次,按 digest 提升到各环境 | 杜绝「开发环境能跑、生产跑不了」 |
| Semver + conventional commits | 自动 bump、生成 changelog | 任何对外接口 |
| Progressive | canary → metric gate → abort / promote | 高风险发布 |
| Feature flag | 发布与部署解耦,runtime 切换 | 跨服务、A/B 实验 |
| GitOps | 期望状态在 Git,controller 收敛 | 多环境、多租户 |
| Drift detection | terraform plan、argocd app diff | 任何声明式资源 |
| SBOM + SLSA provenance | 构建时生成,对制品签名 | 合规、安全审查 |
| DORA Four Keys | 自动从 CI/CD + incident 系统采集 | 季度效能复盘 |
| Postmortem without blame | 时间线、根因、行动项,不追责 | 任何线上事故 |
| Chaos drill | 主动 kill pod、断网络、错配 secret | 验证回滚预案 |
| Pin everything | 锁 base digest、action SHA、provider 版本 | 杜绝供应链漂移 |
9.4 经典问题与经典案例
| 问题 | 为什么重要 | 最简答案或证据 |
|---|---|---|
latest tag 部署后不知道跑的是哪个版本 | tag 可变、digest 不可变 | 部署必须按 image@sha256:... |
| Cache key 设计错,缓存全失效率 | monorepo 几百个 package,缓存命中直接决定流水线时长 | cache key 包含 lockfile hash + 操作系统 + runner arch |
| matrix 超过 256 触发 GitHub Actions 限制 | 上限是流程定义层硬编码 | 拆分 workflow、用 dynamic matrix |
| OIDC 配置错,cloud credential 泄露 | 长期 key 是供应链最大入口 | 用 OIDC 短期 token,actions 配 permissions: id-token: write |
| Canary 指标门控不灵,把烂版本推广到 100% | 没有 metric provider 或 threshold 错 | AnalysisTemplate 跑两次:基线 → canary,对比错误率/P99 |
| Drift 出现,argocd app diff 一直有差异 | 有人手动 kubectl edit,声明式失效 | 禁外网写入、事件告警、自动 Self-Heal |
| cosign verify 失败,无法判断是不是伪造 | 没启用 keyless 或 trust root | 配 Fulcio + Rekor,verify 用 transparency log |
| DORA 变更失败率突然飙升 | 看不到原因,只能事后数 | 在 CI 里埋指标,导出 Prometheus 或 BigQuery |
| Semver bump 错,旧 patch 升级破坏下游 | prerelease、build metadata 不规范 | 用 release-please / semantic-release,禁用手动改 |
| 回滚按钮找不着,或点了不生效 | 蓝绿忘了保留旧版本,canary abort 路径没人跑过 | 每次发布保留 last-known-good,定期演练 |
| Merge queue 死锁,PR 卡住 | 多个 PR 同时等 CI | 看 queue 日志,调整 concurrency 与 retry |
| SBOM 输出后没人看 | 合规要求但没有「must be free of CVE ≥ severity」策略 | 卡 release gate,severity ≥ high 必须有 fix 或 exception |
| Terraform state lock 失效,并发 plan 损坏 | 没启用 DynamoDB/Consul 锁 | 配 S3 backend + DynamoDB lock |
| Helm chart 升级失败,rollback 也失败 | Helm v2 client + v3 repo 混用 | 锁 Helm 与 chart 版本,演练 upgrade → rollback |
| 半夜发布无人审批 | 没设 maintenance window / approval | release pipeline 强制 approval + on-call 联动 |
9.5 学习难点
概念难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| Pipeline vs deploy | CI 跑测、CD 跑发布,混在一起导致 rollback 困难 | CI 不直连生产,CD 接签名制品 |
| Tag vs digest | latest 看起来是版本,实际是 mutable pointer | 部署用 digest,仓库只存 digest+tag 对照表 |
| Canary vs feature flag | 都能降风险,但粒度不同 | canary 按版本切换,flag 按用户/租户切换 |
| GitOps 与 push 部署 | 都改了文件,谁是 source of truth | GitOps 收敛到 controller;CLI 直连视为违规 |
思维难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 从失败到根因 | 「流水线红了」不是诊断 | 看 step log、看 runner log、看 artifact、看网络 |
| 策略选择 | 蓝绿、滚动、金丝雀各有权衡 | 用爆炸半径 × 回滚时长 × 资源开销三维评估 |
| 度量与噪音 | DORA 指标一旦采集,会引诱优化错的地方 | Four Keys 是顶层,下面再细分到 component |
| 变更 vs 部署 | 「改了 5 行」和「发到生产」是两件事 | 区分 commit frequency 与 deploy frequency |
工程难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| OIDC 配错 | trust policy / audience 错,token 拿不到 | 先在 staging 跑通,看 cloud audit log 是否出现 role |
| Cosign verify 在 air-gapped 环境 | Rekor transparency log 不可达 | 离线 TUF / 自建 Fulcio,或改用 KMS 签名 |
| 多集群 GitOps | 100+ cluster,Argo CD 单实例扛不住 | Hub-and-spoke 或 ApplicationSet + cluster generator |
| Canary 指标治理 | 各团队指标不一致 | 维护 canonical AnalysisTemplate,强制复用 |
| Terraform 跨云 | 不同 provider 行为不同 | 用 module 封装,state 按 region/env 拆分 |
| 回滚的 rollback vs rollout undo | kubectl rollout undo 只滚 deployment,Helm release 不动 | 统一 Argo Rollouts / Helm operator 的 abort 接口 |
| 合规审计 | SOC2 / ISO 要求所有变更可追溯 | audit log + immutable log sink,retention ≥ 1y |
9.6 技术标准与接口
9.6.1 Entity
| 名称 | 版本 / 文档 | 发布组织 | 状态 | 许可证 / 可访问性 |
|---|---|---|---|---|
| GitHub Actions | workflow schema 当前 2.x | GitHub | 持续更新 | 公开文档 |
| GitLab CI/CD | .gitlab-ci.yml schema | GitLab | 持续更新 | 公开文档 |
| CircleCI | config.yml schema 2.1+ | CircleCI | 持续更新 | 公开文档 |
| Argo CD | v2.x | CNCF / Intuit | Graduated | Apache-2.0 |
| Argo Rollouts | v1.x | CNCF | Incubating | Apache-2.0 |
| Argo Workflows | v3.x | CNCF | Incubating | Apache-2.0 |
| Spinnaker | 持续更新 | OSS | 活跃 | Apache-2.0 |
| Flux CD | v2.x | CNCF / Weaveworks | Graduated | Apache-2.0 |
| Terraform | 1.x | HashiCorp | 活跃 | MPL-2.0 |
| Pulumi | 持续更新 | Pulumi | 活跃 | Apache-2.0 |
| Ansible Core | 2.x | Red Hat | 活跃 | GPL-3.0 |
| Helm | v3 | CNCF | Graduated | Apache-2.0 |
| Kustomize | v5 | Kubernetes SIG | 活跃 | Apache-2.0 |
| OCI Distribution Spec | v1.x | OCI | 公开标准 | Apache-2.0 |
| SLSA | v1.0 | SLSA / Linux Foundation | 公开规范 | 公开 |
| Sigstore cosign | v2.x | Sigstore | 活跃 | Apache-2.0 |
| OIDC | RFC 8414 / OpenID Connect Core | IETF / OpenID | 标准 | 公开 |
| DORA Four Keys | 2024 指南 | DORA / Google Cloud | 公开指南 | 公开 |
9.6.2 Scope
- CI(GitHub Actions / GitLab CI / CircleCI)负责构建、测试、扫描、出制品。
- CD controller(Argo CD / Flux)按 Git 期望状态收敛集群。
- 渐进发布器(Argo Rollouts / Flagger / Spinnaker)在 controller 上加策略层。
- IaC(Terraform / Pulumi / Ansible)管云资源。
- 签名 / SBOM(cosign / SLSA / in-toto)管供应链完整性。
- 可观测(Prometheus / Grafana / OTel)出 DORA 卡。
- 它们之间用 OCI registry、OIDC、Kubernetes API 互通。
9.6.3 Structure
- workflow YAML:
on/jobs/steps/uses/run/env/with/needs/matrix/concurrency。 - 必须掌握字段:
on.push.branches、on.workflow_dispatch、jobs.<id>.runs-on、jobs.<id>.steps[*].uses/run、permissions、secrets、matrix.include/exclude、needs。 - 必须掌握接口:
actions/checkout@v4、actions/setup-go@v5、docker/build-push-action@v6、aquasecurity/trivy-action、sigstore/cosign-installer、Argo Rollouts CRD(Rollout/AnalysisTemplate/AnalysisRun)、Argo CD CRD(Application/AppProject)、Terraform CLI(init/plan/apply/import/state)、kubectl rollout status/undo、gh workflow run。 - 必须掌握的方法:读 Actions 表达式语法、写 AnalysisTemplate 指标、写 Terraform module + remote state、用
cosign verify-blob/verify-image、从 GitHub API + Prometheus 拉 DORA 数据。
9.6.4 Ecosystem
- CI:GitHub Actions、GitLab CI、CircleCI、Jenkins(legacy)、Buildkite、Drone、Woodpecker。
- CD controller:Argo CD、Flux、Spinnaker、Jenkins X。
- 渐进发布:Argo Rollouts、Flagger、Spinnaker、LaunchDarkly 自动发布、Datadog Continuous Testing。
- IaC:Terraform、Pulumi、Ansible、Crossplane、OpenTofu(fork)。
- 签名 / SBOM:cosign、SLSA Toolkit、in-toto、SPDX、CycloneDX。
- 可观测 / DORA:Prometheus、Grafana、Datadog、Honeycomb、LinearB、Waydev。
- 事实标准 vs 标准本身:OIDC 是标准;OIDC 在不同云的 trust policy 实现各异;OCI Distribution Spec 是标准;不同 registry 实现的功能(cosign 兼容、签名验证、garbage collection)差异显著。
9.6.5 Depth Tiers
| 层级 | 能力 | CI/CD 与发布的可观察标准 |
|---|---|---|
| L0 | 知道存在 | 知道 CI、CD、Argo Rollouts、Terraform、cosign、DORA 是什么 |
| L1 | 看得懂示例 | 能读 GitHub Actions workflow、Argo Rollouts Canary、Terraform resource |
| L2 | 能正确调用 | 能写一条 pipeline、配一个 Rollout 跑通、跑 terraform apply |
| L3 | 能解释与排错 | 能从 runner log / AnalysisRun 报告 / drift diff 解释失败与决策 |
| L4 | 能设计与扩展 | 能设计 multi-tenant GitOps、custom controller、cross-cloud IaC、audit pipeline |
本父主题目标是 L3。自定义 controller 或跨云 IaC 可触及局部 L4,但不作为 4~6 周硬门槛。
9.6.6 Source
- GitHub Actions 文档 — workflow、OIDC、security hardening。
- Argo Rollouts 文档 — Canary / BlueGreen / AnalysisTemplate。
- Argo CD 文档 — Application / AppProject / sync。
- Terraform 文档 — state、module、import。
- Sigstore cosign — sign / verify-blob / verify-image。
- DORA Four Keys 指南 — 四指标采集。
- SLSA v1.0 — 供应链等级模型。
- 引用版本快照日期:2026-07-30;实作前运行
gh --version、kubectl version、terraform version。
10. 常见误区
- 把 CI/CD 当成「装个 Jenkins」;
- 直接 push 到
main就触发 deploy,没有 review、没有 staging; - 用
latesttag 部署; - pipeline 不区分 build / test / scan / deploy,全堆在一个 job;
- 缓存 key 用
*,每次都失效; - 用 long-lived AWS access key 当 secret;
- 不限制
permissions,默认write-all; - CD 用
kubectl apply -f,没有 GitOps 与 drift 检测; - canary 配了,但 metric provider 不可用,悄悄跑满 100%;
- 灰度只看版本号,不看用户维度(feature flag);
- 没有 DORA 数据,季度复盘全凭感觉;
- 没有 on-call,事故出现找不到人;
- 不写 postmortem,或 postmortem 只写「我们做错了」;
- 用同一个 chart / manifest 覆盖多环境,只换 namespace;
- Terraform state 提交到 Git,并发 plan 直接损坏;
- Helm chart 升完不验证 rollback;
- cosign 签了制品,但 verify 没在 deploy pipeline 跑;
- 把 audit log 当 logrotate 对象,定期清理;
- 演练只在 staging 跑一次,再也没复盘。
11. 所有知识点分类(统一规则)
- 编程语言;2. 数据结构与算法;3. 计算机基础;4. 工程技术;5. Web 与后端;6. 前端与客户端;7. 数据与人工智能;8. 项目与职业能力;9. 安全与可靠性。
本计划归属:工程技术 主 + 安全与可靠性 辅。