本节摘要:CI/CD 工具链在 2026 年完成了从"脚本驱动"到"声明式 + GitOps"的转型。GitHub Actions 成为最广泛使用的 CI 平台,Argo CD 和 Flux CD 让 Kubernetes 部署变得可审计、可回滚。基础设施即代码(IaC)从 Terraform 一家独大走向 Pulumi 等"用真编程语言写基础设施"的新范式。
阅读完本节,你应当能够:
DevOps 的核心诉求十年没变:让代码从开发者的脑袋安全、快速、可重复地到达生产环境。
变化的是实现方式。2016 年的典型流水线是 Jenkins + 一堆 shell 脚本 + Ansible 推配置。2026 年的典型流水线是 GitHub Actions 构建 → 镜像签名 → Argo CD 拉取 → K8s 自动部署。从"推"变成"拉",从"脚本"变成"声明"。
| 维度 | GitHub Actions | GitLab CI | Jenkins |
|---|---|---|---|
| 部署方式 | SaaS(也有 Self-hosted Runner) | SaaS + Self-hosted | 纯 Self-hosted |
| 配置方式 | YAML (.github/workflows) | YAML (.gitlab-ci.yml) | Groovy (Jenkinsfile) |
| 生态 | Marketplace 20000+ Actions | 内置功能丰富 | 插件最多但质量参差 |
| 维护成本 | 低 | 中 | 高(需要专人维护) |
| 适合 | 代码在 GitHub 的项目 | 代码在 GitLab 的项目 | 历史遗留、高度定制需求 |
💡 关键直觉:2026 年新项目几乎不会选 Jenkins。GitHub Actions 和 GitLab CI 的 SaaS 模式免去了运维 Jenkins Master 的痛苦。Jenkins 只适合"已经有大量 Jenkins Pipeline 且迁移成本高"的场景。
GitOps 的核心原则很简单:Git 仓库里的声明就是生产环境应该有的状态。Argo CD 持续监控 Git 和 K8s 集群,发现差异就自动同步。
| 维度 | Argo CD | Flux CD |
|---|---|---|
| 定位 | K8s 专用 GitOps | K8s 专用 GitOps |
| UI | 有 Web UI,可视化好 | 无 UI,纯 CLI |
| 多集群 | 原生支持 | 支持但配置复杂 |
| 社区 | CNCF 毕业,社区更大 | CNCF 毕业,Red Hat 支持 |
| 工具 | 语言 | 特点 | 适合 |
|---|---|---|---|
| Terraform | HCL(专用语言) | 生态最大、Provider 最多 | 多云基础设施 |
| Pulumi | Python/TS/Go | 用真编程语言、类型安全 | 喜欢编程式 IaC 的团队 |
| Crossplane | YAML + K8s CRD | 把基础设施变成 K8s 资源 | 已经重度使用 K8s 的团队 |
| Ansible | YAML | 配置管理为主,幂等执行 | 服务器配置、非容器场景 |
⚠️ 常见坑:Terraform 的 State 管理是最大痛点。生产环境必须用远程 State 存储(S3 + DynamoDB 锁),否则多人协作会出状态冲突。
| 阶段 | 工具 | 做什么 |
|---|---|---|
| 代码提交 | Git | 触发 Webhook |
| CI 构建 | GitHub Actions | 编译、测试、构建镜像 |
| 安全扫描 | Trivy + cosign | 漏洞扫描 + 镜像签名 |
| 镜像推送 | GHCR / Harbor | 推送到制品仓库 |
| GitOps 同步 | Argo CD | 检测 Git 变更,同步到 K8s |
| 生产部署 | K8s + Istio | 金丝雀/蓝绿发布 |
| 可观测性 | OTel + Prometheus | 监控部署后的指标变化 |
把上面的表格落到具体配置,才明白声明式流水线长什么样。下面是一个用 GitHub Actions 表达的最小流水线骨架:代码提交后自动构建、跑测试、扫依赖漏洞、构建镜像、签名,最后推到制品仓库,部署交给 Argo CD 从 Git 拉取:
name: build-and-scan on: push: branches: [main] pull_request: jobs: build: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 构建并测试 run: make test - name: 依赖漏洞扫描 uses: aquasecurity/trivy-action@master with: scan-type: fs - name: 构建镜像 run: make image - name: 镜像签名 run: cosign sign ${IMAGE} --yes - name: 推送镜像 run: make push
注意这里的节奏:测试和扫描放在构建之前,坏代码根本走不到镜像阶段;签名放在推送之前,保证仓库里只有可信制品。真实项目的流水线通常还会加缓存、并行矩阵、超时和重试,但骨架就是这几步。
CI 只解决"代码能不能构建",不解决"依赖安不安全"。依赖管理在 2026 年的标准做法是自动更新加自动扫描:Dependabot 或 Renovate 持续监控依赖新版本并开 PR,Trivy 或 Grype 在每次构建时扫描已知漏洞。依赖更新本身是个两难:不更新,漏洞和兼容性问题越积越多;盲目更新,一次破坏性变更就能让流水线全红。建议的做法是每周固定窗口批量合并小更新、单独评估大版本、关键依赖锁定精确版本并做回归测试。质量门禁上,SonarQube 这类静态分析工具可以提供圈复杂度、重复率、安全热点等指标,但门槛别定太死,先覆盖"编译不过、测试不过、高危漏洞"三条硬线,再逐步加码。
流量切换的粒度决定了故障影响半径。蓝绿部署是准备两套环境,切流量即回滚;金丝雀是先把新版本放给一小部分流量观察,再逐步放量;滚动更新是逐批替换旧实例,最省资源但回滚最慢。Argo Rollups 和 Flagger 把这类策略做成了 K8s 原生资源。选择依据是业务容忍度:核心支付链路宁可蓝绿,日志分析服务滚动就够了。无论选哪种,都要把"回滚"当作一等公民设计——一键回滚的前提是镜像标签可追溯、数据库迁移可逆、缓存能清。
GitOps 把 Git 当唯一真相源,听起来很美,落地时有三类坑最常见。一是"Git 里的不是真相":有人用命令行直接改集群,或者 Helm 渲染结果和提交内容不一致,漂移检测一开就天天告警。治理办法是收紧 kubectl 权限、全部变更走 MR、用 Argo CD 的应用集把声明和集群强制绑定。二是"同步风暴":改动一个公共 Chart,几十个应用同时触发同步,压垮 apiserver。对策是给同步加并发限制和窗口。三是"密钥怎么办":明文密钥不能进 Git,需要 Sealed Secrets 或外部密钥管理集成。GitOps 的价值建立在纪律之上,工具替代不了流程。
DevOps 转型最怕"感觉变好了但说不清哪里好"。DORA 框架给出四个可衡量的核心指标:部署频率(多久发一次版)、变更前置时间(从提交到上线的时长)、变更失败率(发布导致故障的比例)、恢复时间(故障到恢复的时长)。把这四个指标接入现有工具(Git 历史、CI 日志、监控告警)就能持续追踪。目标不是"指标最好看",而是趋势向好:部署频率升、前置时间降、失败率保持低位。很多团队跑了一年 DevOps,发现瓶颈根本不在工具链,而在审批流程和测试自动化——指标会逼你面对这些真问题。
下一节我们看一个正在挑战容器统治地位的新技术——WebAssembly。