阿里云 DevOps:CI/CD 流水线与自动化实战指南

📅 · 海外服务器线路与网络实测 - ChengziCloud

一句话结论

阿里云 DevOps 提供一整套集成化工具,覆盖从源代码管理、持续集成到制品存储和基础设施编排的完整软件交付生命周期。

本文要点
  • 阿里云 DevOps 生态概览
  • 代码仓库:基于 Git 的源码管理
  • CI/CD 流水线构建
  • 制品管理
  • Terraform 集成:基础设施即代码
  • 阿里云 DevOps 最佳实践

阿里云 DevOps 提供一整套集成化工具,覆盖从源代码管理、持续集成到制品存储和基础设施编排的完整软件交付生命周期。对于在阿里云上构建和部署应用的团队而言,这些 DevOps 服务免去了引入第三方工具链的需要,并提供与云平台的原生集成,降低运维复杂度,缩短交付到生产环境的时间。本指南全面覆盖端到端的 DevOps 工作流,包括代码仓库管理、CI/CD 流水线构建、制品管理以及基于 Terraform 的基础设施即代码实践。

阿里云 DevOps 生态概览

阿里云 DevOps 平台由多项无缝协作的服务组成。代码仓库(Code Repository)提供基于 Git 的源码管控,支持分支保护、代码评审以及与 CI 流水线的集成。流水线服务(Pipelines)是更广泛 DevOps 平台的一部分,通过可视化编辑器和基于 YAML 的流水线定义,编排构建、测试和部署阶段。制品仓库(Artifact Repository)存储构建产物(如 Docker 镜像、JAR 文件和 npm 包),并提供版本管理和访问控制。资源编排服务(ROS)与 Terraform 集成则支持在部署流水线中完成基础设施的即代码化编排。

对于已经在使用阿里云的团队而言,这一原生工具链相对于外部 CI/CD 方案具有多项优势。构建代理与部署目标之间因一切都在阿里云网络内运行,网络延迟最低。通过与 RAM 的 IAM 集成,流水线凭证可通过 RAM 角色管理,无需使用长期有效的 AccessKey。统一的计费和支持模式也简化了采购和供应商管理。

代码仓库:基于 Git 的源码管理

阿里云代码仓库是一项托管式 Git 服务,同时支持公共和私有仓库并提供细粒度访问控制。它为协作开发奠定基础,同时也是自动化 CI/CD 流水线的触发器。

仓库管理与访问控制

仓库可组织到与你的组织架构相对应的分组中——按团队、产品或业务单元划分。每个分组和仓库通过 RAM 集成支持基于角色的访问控制,你可以向单个用户、RAM 角色或整个用户组授予读、写或管理员权限。这种集成意味着当工程师加入或离开团队时,其仓库访问权限通过标准 IAM 流程统一管理,无需在仓库层面单独配置。

分支保护规则用于保障代码质量和评审规范。受保护分支(通常为 main、master 和 release 分支)可要求由指定审批人完成 Pull Request 评审、CI 流水线的状态检查通过以及线性提交历史。这些保护规则防止直接推送到关键分支,确保只有通过评审和测试的代码才能进入生产路径。

代码评审工作流

Pull Request 工作流支持行内代码评论、讨论串以及必需的审批。Pull Request 可关联到 Issue 或工作项,从功能需求到代码变更再到部署,形成完整的可追溯链路。Web 端的合并请求界面提供并排差异对比视图和语法高亮,让分布式团队的代码评审更加高效。

通过在 CI 流水线中集成静态分析工具,并将构建状态反馈到 Pull Request,可进一步增强自动化代码评审。CI 流水线失败或审批人数不足将阻止合并,以编程方式强制执行质量关卡。

Webhook 与流水线触发器

代码仓库支持 Webhook,用于向外部系统通知仓库事件——Push 事件、Pull Request 创建、Tag 创建等。这些 Webhook 是触发 CI/CD 流水线的主要机制。典型配置为:向功能分支的每次 Push 触发构建流水线,Pull Request 创建触发更全面的测试流水线,合并到主分支或创建 Release Tag 时触发部署流水线。

CI/CD 流水线构建

流水线服务提供灵活、云托管的执行环境,用于构建、测试和部署应用。流水线以代码的形式定义,覆盖从简单的构建-部署序列到包含并行阶段、人工审批和条件执行的复杂工作流。

流水线定义

流水线以 YAML 格式定义,与应用程序代码一同存储在代码仓库中。一条流水线定义指定了触发器、阶段(Stage)、作业(Job)和任务(Task)。每个阶段代表交付流程的一个逻辑阶段——如构建、测试、预发部署和生产部署——可包含多个可并行运行的作业。每个作业在其独立的环境中执行,由一系列顺序执行的任务组成。

YAML 语法支持变量定义,既可在流水线级别(跨阶段共享配置),也可在阶段或作业级别(特定于阶段的设置)使用。变量可以设置为明文,也可标记为加密(Secret),加密后的变量值在日志中被遮蔽。加密变量对于存储凭证、API Token 等敏感配置至关重要,可避免在流水线定义中硬编码这些信息。

构建环境

流水线作业运行在阿里云管理的构建代理(Build Agent)上。代理预装常用语言和框架的工具链——Java 配 Maven 和 Gradle,Node.js 配 npm 和 yarn,Python 配 pip,以及 Go、.NET 等。自定义构建环境可通过指定包含全部所需工具的 Docker 镜像来创建,使团队能够精确使用所需工具版本。

对于计算密集型构建——如编译大型单体仓库或运行大规模测试套件——可以配置更高 CPU 和内存规格的构建代理。构建缓存(通过 Maven 本地仓库、npm 缓存或 Docker 层缓存)可在后续流水线执行时保留依赖项,缩短构建时间。

阶段编排

流水线阶段默认按顺序执行,阶段内可选并行执行。常见流水线模式包括:

构建-测试-部署是最简单的流水线模式:代码被编译(或打包),对构建产物运行自动化测试,测试通过后触发部署到目标环境。这种顺序流程确保只有测试过的产物才能到达生产环境。

多环境晋级模式在基础流程上扩展了针对开发、预发和生产环境的独立部署阶段。预发部署阶段可包含审批门禁,要求在生产部署阶段执行前进行人工审核。此模式对受监管行业或关键业务应用至关重要,这类场景下每次生产变更都需要明确审批。

扇出-扇入模式将阶段内独立任务并行化——如同时运行单元测试、集成测试和安全扫描——然后聚合结果以决定是否继续。并行执行缩短流水线总耗时,保持快速反馈循环。

测试集成

流水线中的测试不限于构建任务内执行的单元测试。集成测试可将应用部署到临时环境,对该环境运行测试,并在测试结束后无论结果如何都销毁该环境。端到端测试可使用 Selenium 或 Playwright 等浏览器自动化工具。性能测试可对已部署服务施加负载,并断言响应时间或吞吐量阈值。

测试结果发布到流水线的报告界面,提供历史趋势、失败分析和测试覆盖率可视化。除非显式绕过,否则测试失败将阻止流水线继续推进,确保质量关卡不会被绕开。

部署策略

流水线服务通过与阿里云部署目标的集成支持多种部署策略。对于 Kubernetes 部署,流水线可通过滚动更新来更新 Deployment 或 StatefulSet,配置健康检查,并在失败时触发自动回滚。对于基于 ECS 的应用,流水线可通过运维编排服务(OOS)或 SSH 执行部署脚本,跨多个实例协调执行。

蓝绿部署(新版本部署在现有版本旁,验证后切换流量)可通过与负载均衡(SLB/ALB)集成来实现。金丝雀部署(小部分流量先路由到新版本,监控后再全量发布)则利用 API 网关或服务网格的路由规则来实现。

制品管理

构建制品——编译的二进制文件、Docker 镜像、库包——必须安全存储并进行版本管理,以实现可追溯和可复现。阿里云制品仓库提供多种制品类型的托管存储,并具备访问控制和生命周期管理能力。

支持的制品类型

制品仓库支持 Docker 镜像(兼容 Docker Registry)、Maven 制品(Java 库和应用)、npm 包、Python Wheel 以及通用文件制品。每种仓库类型提供相应的 API 和工具集成:Maven 仓库配合 mvn deploy 使用,Docker 仓库配合 docker push,npm 仓库配合 npm publish。

组织通常会维护独立的 Snapshot 仓库(开发构建)、Release 仓库(生产就绪制品)以及缓存公共注册表依赖的第三方代理仓库。代理仓库通过防止因外部注册表不可用导致的构建失败并降低出口带宽成本,从而提高构建可靠性。

版本管理与晋级

制品版本遵循语义化版本规范,并附带用于可追溯性的构建元数据——如 Git Commit SHA 或流水线运行 ID。制品在仓库间的晋级支持从开发到生产的推进流程:在 Snapshot 仓库中构建和测试的制品,通过所有质量关卡后晋级到 Release 仓库,仅 Release 仓库的制品可部署到生产环境。

不可变标签和制品锁定可防止对生产制品的意外覆盖或删除。保留策略自动清理旧的 Snapshot,同时根据合规要求保留 Release 制品。

访问控制与分发

制品仓库通过 RAM 集成实现安全管控,支持按仓库和按操作(读、写、删除)的细粒度访问控制。CI/CD 流水线服务账号应对 Snapshot 仓库具有写权限、对 Release 仓库具有读权限,而生产部署账号则仅对 Release 仓库具有只读权限。这种最小权限模型可防止对制品的未授权修改,并限制凭证泄露的影响范围。

Terraform 集成:基础设施即代码

基础设施编排是部署流水线的关键组成部分,而 Terraform 已成为多云基础设施即代码的事实标准。阿里云提供官方 Terraform Provider,支持涵盖所有主要阿里云服务的数百种资源。

阿里云 Terraform Provider

阿里云 Terraform Provider 支持使用 HashiCorp 配置语言(HCL)进行声明式基础设施定义。一个 Terraform 配置可以在受版本控制的文本文件中定义整个应用栈——VPC 网络、安全组、ECS 实例、RDS 数据库、SLB 负载均衡器、Kubernetes 集群等。

该 Provider 支持所有标准 Terraform 特性:资源的创建、更新和删除;用于查询现有资源的数据源;用于在配置间传递信息的输出值;以及用于团队协作的 OSS 远程状态存储。Provider 配置使用 RAM AccessKey,或者更推荐使用当 Terraform 运行在阿里云计算资源上时的实例 RAM 角色。

流水线集成模式

将 Terraform 集成到 CI/CD 流水线需要在自动化与安全性之间精心权衡。一种常见模式是将基础设施分为两条流水线:基础流水线用于变更不频繁的长期基础设施(VPC、子网、安全组、数据库实例),部署流水线用于随每次发布变更的应用专用基础设施。

流水线中 Terraform 的工作流通常包括:terraform init 初始化工作目录并下载 Provider,terraform plan 预览变更并保存计划为制品,terraform apply(生产环境需人工审批后)执行计划,以及 Apply 后通过健康检查或集成测试进行自动验证。

对于生产环境,plan 输出应经过人工审核(或使用 OPA、Sentinel 等工具的自动化策略检查)后方可执行 apply。此审批门禁可作为流水线中的人工审批步骤实现,确保任何基础设施变更在到达生产环境之前都经过审查。

状态管理

Terraform 状态追踪配置资源与实际资源的映射关系。对于团队协作工作流,存储在阿里云 OSS 中的远程状态是必不可少的基础配置。配置一个开启版本控制功能的共享 OSS 存储桶,并通过 TableStore(OTS)实现状态锁定以防止并发修改冲突。

状态文件包含敏感信息,包括资源属性和输出值。使用 OSS 服务端加密保护静态状态数据,并通过存储桶策略和 RAM 权限限制访问。切勿将状态文件提交到版本控制系统,它们应仅存放于远程存储中。

阿里云 DevOps 最佳实践

在阿里云上落地 DevOps 实践需要组织与技术层面的协同。以下最佳实践针对最常见的挑战。

流水线即代码

以对待应用代码同等的严谨度对待流水线定义。将流水线 YAML 与其所构建和部署的代码放在同一仓库中进行版本管理。通过 Pull Request 审核流水线变更。在合并到主分支之前,在专用分支上测试流水线变更。这种纪律可防止流水线配置漂移,确保构建和部署流程可复现。

密钥管理

切勿在流水线 YAML 或应用配置文件中存储密钥——如 API Key、数据库密码、TLS 证书等。使用阿里云 Secrets Manager 或在流水线定义中以加密标志标记的环境变量。定期轮换密钥,并通过 CloudTrail 或日志服务审计访问行为。对于运行在 ECS 或 ACK 上的应用,使用实例 RAM 角色自动获取临时凭证,彻底消除对静态凭证的需求。

不可变基础设施

尽可能采用不可变基础设施模式。不更新运行中的服务器,而是构建包含更新后配置的新机器镜像或容器镜像,并以替换方式部署。这种方式消除了配置漂移,使回滚变得极其简单:只需重新部署上一版本的制品。阿里云镜像构建服务(Image Builder)可作为流水线的一部分,创建预置配置的自定义操作系统镜像。

可观测优先的部署

每次部署都应包含可观测性配置。流水线部署阶段应验证 CloudMonitor 仪表盘和告警是否已针对新服务更新。部署事件应记录到专用 LogStore,用于审计和关联分析。部署后的健康检查不应仅验证服务是否运行,还应验证关键指标——错误率、延迟、吞吐量——是否在可接受范围内,然后才将流水线视为成功。

多环境策略

至少维护三个环境:开发环境(用于敏捷开发和集成测试)、预发环境(使用类生产数据和配置进行上线前验证)和生产环境。每个环境应有独立的流水线,配置适合的审批门禁和部署策略。各环境的基础设施应使用同一套 Terraform 配置,仅通过特定于环境的变量文件进行区分,从而保证环境一致性,消除"在我机器上能跑"的问题。

总结

阿里云 DevOps 工具链为现代软件交付提供了完整平台,涵盖从基于 Git 的源码管理,到 CI/CD 流水线编排,再到制品存储和基础设施编排的各个环节。通过采用这些服务并遵循本指南中概述的实践,开发团队可以缩短部署前置时间、提高发布可靠性,并保持生产云工作负载所需的运维规范。与阿里云 IAM、网络和计算服务的原生集成,消除了常见的集成痛点,让团队能够专注于交付业务价值,而非维护工具基础设施。

本文由 6.chengzicloud.cloud 提供,点击访问首页了解更多