4. 制品供应链概述:从代码提交到生产部署的完整链路
制品供应链(Artifact Supply Chain)是 DevOps 与 SRE 实践中的核心数据流。每一次代码提交都会触发一系列自动化环节,最终生成可部署的制品并交付至生产环境。理解这条链路的每个环节,是定义误差预算、配置基线同步以及 Terraform 管理策略的前提。
4.1 从代码提交到生产部署的完整链路
下图展示了制品供应链的典型端到端流程,包含 7 个关键阶段:
SRE 视角: 供应链中每个环节的失败率都会累积到总误差预算中。例如,CI 构建失败率 2%、部署测试失败率 1%,则整体交付成功率约为 97%。Terraform 配置基线需要为每个环节定义明确的误差预算阈值。
4.2 关键制品类型
在制品供应链中,不同技术栈会产生不同类型的制品。下表对比了三种最常见的制品类型及其在供应链中的角色:
| 制品类型 | 典型格式 | 仓库/注册表 | 供应链位置 | 基线同步要点 |
|---|---|---|---|---|
| 容器镜像 | OCI Image (Docker v2) | Harbor, ECR, ACR, GCR | CI 构建后 → 制品仓库 → 部署 | 镜像标签策略、签名验证、漏洞扫描基线 |
| Helm Chart | tgz / OCI Artifact | Harbor, OCI Registry, ChartMuseum | CI 打包后 → Chart 仓库 → 部署 | Chart 版本号、values 基线、依赖锁文件 |
| 二进制包 | .jar, .war, .deb, .rpm, tar.gz | Nexus, Artifactory, S3 | CI 打包后 → 制品仓库 → 部署 | 包名规范、版本号语义化、校验和基线 |
4.3 容器镜像:供应链的核心载体
容器镜像是现代云原生应用最普遍的交付格式。一个完整的容器镜像供应链包含以下关键环节:
- 基础镜像选择: 使用经过安全扫描的官方或内部基础镜像,避免“镜像嵌套”导致的漏洞扩散。
- 多阶段构建: 构建阶段使用完整 SDK 镜像,运行阶段使用精简镜像,减小攻击面。
- 镜像签名与验证: 使用 cosign / notation 对镜像进行数字签名,部署时验证签名完整性。
- 漏洞扫描: 在推送至仓库前和部署前分别进行 CVE 扫描,阻断高危漏洞镜像进入生产。
- 不可变标签: 使用 Git commit SHA 或语义化版本作为镜像标签,禁止复用 latest 标签。
Terraform 基线配置示例: 在 Terraform 中管理容器镜像的基线策略,包括允许的基础镜像列表、强制签名要求、漏洞严重性阈值等。
# 容器镜像基线策略示例(HCL)
resource "harbor_retention_policy" "app_images" {
scope = "project/app"
schedule = "Daily"
rule {
tag_matching = "v*"
untagged_artifacts = true
most_recently_pulled = 90
}
}
resource "cosign_policy" "production" {
registry = "harbor.internal.io"
require_signature = true
allowed_keys = [
"kms://key-vault/cosign-prod-key"
]
}
4.4 Helm Chart:Kubernetes 应用的配置封装
Helm Chart 将 Kubernetes 资源清单、配置模板和依赖关系打包为一个可版本化的制品。在供应链中,Helm Chart 的管理需要关注:
- Chart 版本化: 严格遵循 SemVer 规范,每次变更都更新 Chart.yaml 中的 version 字段。
- Values 基线分离: 环境特定的 values 文件(如 values-dev.yaml、values-prod.yaml)与 Chart 包分离存储,由 Terraform 管理基线。
- 依赖管理: 使用 Chart.lock 锁定子 Chart 版本,避免意外升级导致配置漂移。
- OCI 分发: 将 Helm Chart 以 OCI Artifact 格式推送到容器镜像仓库,统一制品管理。
4.5 二进制包:传统应用的持续交付
对于非容器化应用或遗留系统,二进制包(如 JAR、WAR、DEB、RPM)仍然是主要的交付制品。其供应链管理要点包括:
- 语义化版本: 遵循 MAJOR.MINOR.PATCH 格式,版本号嵌入包名或元数据中。
- 制品仓库: 使用 Nexus、Artifactory 或 S3 作为中央存储,配置自动清理策略。
- 校验和验证: 每个制品发布时生成 SHA256 校验和,部署前验证完整性。
- 元数据标注: 在制品中嵌入构建时间、Git commit、CI 流水线 ID 等溯源信息。
常见陷阱: 二进制包供应链中容易忽略“依赖链”的版本锁定。例如,一个 JAR 包依赖的第三方库版本变更可能导致生产环境行为不一致。建议使用 Gradle/Maven 的依赖锁文件(如 gradle.lockfile)并纳入 Terraform 基线管理。
4.6 制品供应链与误差预算的关联
在《Terraform 管理制品供应链误差预算台账的配置基线同步》课程中,制品供应链的每个环节都会产生误差预算消耗。下表总结了关键环节的典型误差预算指标:
| 供应链环节 | 误差预算指标 | 典型 SLO 目标 | Terraform 基线管理项 |
|---|---|---|---|
| CI 构建 | 构建成功率 | ≥ 99.5% | 构建超时阈值、重试策略 |
| 单元测试 | 测试通过率 | ≥ 99.9% | 测试覆盖率基线、失败阈值 |
| 制品打包 | 打包成功率 | ≥ 99.8% | 制品大小限制、签名验证 |
| 制品仓库 | 仓库可用性 | ≥ 99.99% | 仓库冗余配置、访问控制 |
| 部署测试 | 部署成功率 | ≥ 99.0% | 部署超时、回滚策略 |
| 生产部署 | 部署成功率 | ≥ 99.9% | 金丝雀比例、自动回滚条件 |
实践建议: 使用 Terraform 的
terraform_data 资源或外部数据源,将制品仓库中的制品版本号、校验和、签名状态等元数据同步到 Terraform 状态中,实现“配置即制品溯源”。