18 CI/CD、制品与发布工具
交付工具的目标不是让流水线“变绿”,而是让一次变更从源码、构建环境、测试结果、制品摘要、签名、审批到发布版本都可以追溯和复现。平台执行面、制品存储面和发布控制面必须分别建立证据,不能用一个 YAML 文件掩盖 Runner 信任、缓存污染、凭证权限和制品不可回退等真实风险。
一次可靠交付从安装和启用工具开始,经过配置、运行验证、项目接入、故障定位和团队治理,最终留下不可变制品、内容摘要、审批记录、凭证撤销路径和上一版本恢复入口。生产变更窗口、流量切换和数据迁移可以由另一套运行手册执行,但它们消费的必须是同一份已经验证的制品,而不是现场重新构建的副本。
交付证据链
缓存用于加速、Artifact 用于传递本次运行产物、制品仓库用于长期分发,不可混为一谈。Tag 是可读引用,Digest 或校验和才是内容身份。流水线重跑也不应悄悄覆盖已经发布的同版本制品。
阅读顺序
| 文章 | 先跑通 | 团队继续治理 |
|---|---|---|
| GitHub Actions | PR 触发检查并保存 Artifact | 权限、OIDC、环境审批、自托管 Runner 与 Fork 风险 |
| GitLab CI/CD | Pipeline、Job、Cache 和 Artifact | Runner 标签、变量保护、环境和合并请求边界 |
| Jenkins | Controller、Agent 和 Jenkinsfile | 插件、凭证、备份、升级、隔离和高可用取舍 |
| Gitee Go | 国内托管流水线完成一次构建 | 官方能力边界、变量、权限、制品和平台依赖 |
| Nexus 与 Artifactory | 上传、代理和下载一个制品 | hosted/proxy/group 或 local/remote/virtual、清理、存储和 HA |
| Harbor 与容器镜像仓库 | Push/Pull 并按 Digest 验证 | Project、Robot、保留、复制、扫描、签名和备份 |
| npm 与 Maven 包仓库 | 发布并消费测试包 | Scope、Snapshot、Token、provenance、撤回和命名治理 |
| Cosign、SBOM、Syft 与 Grype | 生成 SBOM、签名并验证 | OIDC、信任根、Attestation、离线验证和证据保留 |
| semantic-release 与 Changesets | 生成版本和发布说明 | 分支/Channel、Monorepo、Token、不可变发布和失败恢复 |
共通执行边界
Hosted Runner 省运维但受平台配额、镜像和网络边界约束;Self-hosted Runner 能进入内网,却把仓库代码带进受信网络。任何可以执行 Fork PR 或不受信分支代码的 Runner,都不能同时持有生产凭证和长期云权限。
CI Secret 只在确实需要的 Job、环境和分支可见。优先使用短期 OIDC 身份,不能使用时再采用可轮换、最小权限的 Token。日志、缓存、Artifact、构建目录、Docker layer 和进程参数都可能复制 Secret,脱敏不能只依赖平台日志掩码。
共通制品合同
每个可发布制品至少记录:源码提交、构建流水线、构建器镜像或工具版本、依赖锁文件、测试和扫描结论、文件校验和或 OCI Digest、SBOM、签名/Attestation、发布版本、目标仓库、保留策略和 owner。发布只提升已经验证的制品,不能在不同环境重复构建“看起来同版本”的包。
共通恢复底线
流水线失败可以重跑,已外发的制品不能假装从未存在。恢复方案要区分:撤销凭证、停止后续 Job、隔离污染 Runner、删除未发布临时产物、废弃错误版本、恢复上一不可变制品和重新建立签名/Attestation。生产流量回切与数据恢复转交部署运维,但工具链必须保留准确入口和证据。
