本文详细介绍了 Gumroad 应用程序的持续集成和持续部署 (CI/CD) 管道。该管道由两个主要组件组成:通过 GitHub Actions 进行自动化测试和通过 Buildkite 进行部署。本页解释了代码更改如何从提交到生产环境,包括测试、构建和部署流程。
有关本地开发设置的信息,请参阅本地开发。
Gumroad CI/CD 管道使用 Buildkite 实现,它负责构建、测试协调以及向暂存和生产环境的部署。该管道包括用于环境设置、并行资产编译和部署保护的预命令挂钩。
来源:.buildkite/hooks/pre-command1-19 .buildkite/pipeline.yml1-65
CI/CD 管道从一个预命令挂钩开始,该挂钩在执行任何管道步骤之前建立构建环境。
pre-command 挂钩配置 Ruby 环境并与 AWS ECR 进行身份验证
该挂钩执行以下关键设置任务
| 任务 | 实现 |
|---|---|
| Ruby 版本 | 设置 RBENV_VERSION="3.1.4"(忽略 .ruby-version) |
| 环境路径 | 添加 $HOME/.rbenv/bin:$PATH |
| ECR 身份验证 | 使用 aws ecr get-login-password 进行 Docker 注册表访问 |
| Docker 登录 | 使用 ${ECR_REGISTRY} 在 us-east-1 区域进行身份验证 |
来源:.buildkite/hooks/pre-command7-18
Buildkite 管道执行一系列依赖步骤,用于构建 Docker 镜像并部署到不同的环境。
| 步骤键 | 标签 | 依赖项 | 超时 | 并行度 |
|---|---|---|---|---|
build-base-image | 构建基础镜像 | 无 | 60 分钟 | 1 |
build-web-image | 构建 Web 镜像 | build-base-image | 25 分钟 | 1 |
compile-assets | 编译资产 | build-web-image | 25 分钟 | 2 |
build-and-deploy-branch | 部署分支应用 | compile-assets | 45 分钟 | 1 |
require-approval | 手动批准 | 无 | 不适用 | 不适用 |
production-deployment | 部署到生产环境 | compile-assets, require-approval | 120 分钟 | 1 |
来源:.buildkite/pipeline.yml1-65
管道根据分支模式执行不同的步骤
| 分支模式 | 管道步骤 | 部署目标 |
|---|---|---|
main | 构建 → 编译 → 手动批准 → 生产部署 | 生产环境 |
deploy-* | 构建 → 编译 → 分支部署 | 暂存/分支环境 |
comp-assets-* | 仅构建 → 编译 | 不部署 |
来源:.buildkite/pipeline.yml4-16 .buildkite/pipeline.yml39 .buildkite/pipeline.yml49 .buildkite/pipeline.yml58
生产部署需要通过 Buildkite 的 require-approval 块步骤进行手动批准。这在生产部署之前创建了一个手动检查点。
批准块配置
| 属性 | 值 |
|---|---|
| 块键 | require-approval |
| 分支 | 仅 main |
| 提示 | "您确定要继续部署吗?" |
| 阻塞状态 | running |
来源:.buildkite/pipeline.yml47-51 .buildkite/pipeline.yml53-64
管道与多个 Docker 注册表集成,用于镜像存储和分发
| 注册表 | 认证方式 | 环境变量 |
|---|---|---|
| Docker Hub | 用户名/密码 | 使用用户名 gumroadteam 的 DOCKERHUB_PASSWORD |
| AWS ECR | AWS CLI 集成 | 使用区域认证的 ECR_REGISTRY |
预命令挂钩处理 ECR 身份验证,而管道步骤通过 docker-login 插件使用 Docker Hub 凭据。
来源:.buildkite/pipeline.yml9-10 .buildkite/pipeline.yml19-21 .buildkite/hooks/pre-command17-18
compile-assets 步骤以 parallelism: 2 运行,以同时为多个环境构建资产
编译过程生成日志制品,这些制品将保留以供调试和分析。
来源:.buildkite/pipeline.yml23-34
Buildkite 管道依赖于几个环境变量进行身份验证和配置
| 环境变量 | 目的 | 使用位置 |
|---|---|---|
DOCKERHUB_PASSWORD | 用于 gumroadteam 用户的 Docker Hub 身份验证 | 所有带有 docker-login 插件的构建步骤 |
ECR_REGISTRY | 用于容器存储的 AWS ECR 注册表 URL | 用于身份验证的预命令挂钩 |
RBENV_VERSION | Ruby 版本规范 (3.1.4) | 用于环境设置的预命令挂钩 |
来源:.buildkite/pipeline.yml9-10 .buildkite/hooks/pre-command12-18
main 分支的完整 CI/CD 流程遵循以下顺序
对于带有 deploy-* 前缀的功能分支,步骤 1-5 相同,但部署到特定分支环境,无需批准。
来源:.github/workflows/tests.yml426-489 .buildkite/pipeline.yml1-65