本文档涵盖了暂存和生产环境的自动化部署过程。部署自动化系统使用 HashiCorp Nomad 协调容器部署,管理 Docker 镜像的构建和推送,并强制执行生产发布的业务逻辑约束。
有关创建部署工件的构建过程的信息,请参阅构建过程。有关底层容器编排的详细信息,请参阅Nomad 编排。
系统支持两种不同的部署工作流
| 部署类型 | 目标环境 | 触发器 | 自动化水平 |
|---|---|---|---|
| 分支部署 | 预发布 | 任意分支推送 | 全自动化 |
| 生产部署 | 生产 | 手动审批 | 半自动化带安全检查 |
两种部署类型都依赖于相同的基础设施组件,但实现了不同的安全机制和部署策略。
分支部署工作流
来源:.buildkite/scripts/deploy_branch.sh1-84
分支部署过程从 deploy_branch.sh 脚本开始,该脚本处理将功能分支部署到暂存环境的完整生命周期。该过程首先使用 generate_nginx_tag 函数生成唯一的 Nginx 镜像标签 .buildkite/scripts/deploy_branch.sh14-26,该函数根据要部署的特定路径的 Git 提交历史创建标签。
系统对 Docker 镜像使用复杂的标记策略
分支部署的镜像标记策略
来源:.buildkite/scripts/deploy_branch.sh28-32 .buildkite/scripts/deploy_branch.sh69
分支部署系统创建两种主要镜像类型
staging-{12-char-commit-hash}generate_nginx_tag 函数进行标记,用于分支特定的反向代理配置部署脚本实现了 Docker 操作的强大错误处理
Docker 推送重试逻辑
来源:.buildkite/scripts/deploy_branch.sh34-55
生产部署实施关键业务逻辑保护
生产部署安全流程
来源:.buildkite/scripts/deploy_production.sh10-15 .buildkite/scripts/deploy_production.sh24-28
生产部署系统强制执行一项关键业务规则,即在 UTC 10:00-12:00 付款处理窗口期间阻止部署 .buildkite/scripts/deploy_production.sh11-14。这可以防止在财务操作期间可能出现的服务中断。
在继续部署之前,系统会验证所需的生产镜像是否存在
| 验证步骤 | 命令 | 目的 |
|---|---|---|
| 镜像存在性检查 | docker manifest inspect $WEB_REPO:$PRODUCTION_TAG | 验证生产镜像是否可用 |
| 标签格式 | production-{12-char-commit-hash} | 确保一致的生产标记 |
| 注册表路径 | $ECR_REGISTRY/gumroad/web | 验证 ECR 仓库访问 |
来源:.buildkite/scripts/deploy_production.sh25-28
生产部署过程最终通过 bin/deploy 脚本执行,并带有 DEPLOYMENT_FROM_CI=true 环境变量 .buildkite/scripts/deploy_production.sh49。这区分了 CI 驱动的部署和手动部署,并可能在部署脚本中触发不同的行为。
两种部署类型都需要 HashiCorp Nomad 进行容器编排
Nomad 安装工作流
来源:.buildkite/scripts/install_nomad.sh10-23
系统使用特定 Nomad 版本(0.8.3)以确保部署一致性 .buildkite/scripts/install_nomad.sh11。安装过程包括正确的权限设置和版本验证。
两种部署过程都依赖于外部配置
| 组件 | 来源 | 目的 |
|---|---|---|
| 秘密 | copy_secrets.sh 脚本 | 注入敏感配置 |
| Nomad 配置 | nomad/staging/ 或 nomad/production/ | 环境特定编排 |
| 证书 | nomad/certs/ 和环境特定证书目录 | TLS/SSL 配置 |
来源:.buildkite/scripts/deploy_branch.sh65-66 .buildkite/scripts/deploy_production.sh35-36
部署自动化创建所需的目录结构,并设置适当的所有权
nomad/staging/certsnomad/production/certsbuildkite-agent:buildkite-agent 以进行适当的访问控制来源:.buildkite/scripts/deploy_branch.sh74-77 .buildkite/scripts/deploy_production.sh39-42
部署自动化与多个外部系统集成
部署系统集成图
来源:.buildkite/scripts/deploy_branch.sh61-66 .buildkite/scripts/deploy_production.sh31-36
部署自动化充当 CI/CD 流水线与运行时基础设施之间的桥梁,协调跨多个环境的镜像管理、配置部署和服务编排。