菜单

CI/CD 流水线

相关源文件

本文详细介绍了 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-image25 分钟1
compile-assets编译资产build-web-image25 分钟2
build-and-deploy-branch部署分支应用compile-assets45 分钟1
require-approval手动批准不适用不适用
production-deployment部署到生产环境compile-assets, require-approval120 分钟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 注册表集成,用于镜像存储和分发

认证方法

注册表认证方式环境变量
Docker Hub用户名/密码使用用户名 gumroadteamDOCKERHUB_PASSWORD
AWS ECRAWS 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_VERSIONRuby 版本规范 (3.1.4)用于环境设置的预命令挂钩

密钥管理集成

来源:.buildkite/pipeline.yml9-10 .buildkite/hooks/pre-command12-18

测试与部署流程

main 分支的完整 CI/CD 流程遵循以下顺序

  1. 开发人员将代码推送到 GitHub
  2. GitHub Actions 触发测试工作流
  3. 测试并行运行(快速测试和慢速测试)
  4. 测试成功后,GitHub Actions 解锁 Buildkite
  5. Buildkite 构建 Docker 镜像并编译资产
  6. 生产部署需要手动批准
  7. 批准后,Buildkite 部署到生产环境

对于带有 deploy-* 前缀的功能分支,步骤 1-5 相同,但部署到特定分支环境,无需批准。

来源:.github/workflows/tests.yml426-489 .buildkite/pipeline.yml1-65