构建流程包含 CI/CD 流水线中的 Docker 镜像创建、资源编译和构件管理。该系统创建了具有特定环境配置的多个 Docker 镜像,并为暂存和生产环境部署编译前端资源。有关部署自动化和编排的信息,请参阅部署自动化。有关 Docker 配置的详细信息,请参阅Docker 配置。
构建流程包含三个主要阶段,用于创建分层 Docker 镜像和编译特定环境的资源。
源文件:.buildkite/scripts/build_base.sh1-37 .buildkite/scripts/build_web.sh1-81 .buildkite/scripts/compile_assets.sh1-93
构建流程创建了一系列分层的 Docker 镜像,从基础镜像开始,然后添加特定应用程序的组件。
build_base.sh 脚本管理包含通用依赖项的基础 Docker 镜像。
| 组件 | 目的 | 实现 |
|---|---|---|
| Ruby 基础镜像 | 来自 Docker Hub 的基础层 | ruby:$(cat .ruby-version)-slim-bullseye |
| 基础镜像标签 | 基于内容的版本控制 | docker/base/generate_tag_for_web_base.sh |
| ECR 注册表 | 私有镜像存储 | ${ECR_REGISTRY}/gumroad/web_base |
| 构建缓存 | 避免重复构建 | 清单检查 |
基础镜像构建包含重试逻辑和存在性检查,以优化构建时间 .buildkite/scripts/build_base.sh15-36
主应用程序镜像基于基础镜像构建,包含应用程序代码和配置。
Web 构建流程从 git 提交 SHA 的前 12 个字符生成标签 .buildkite/scripts/build_web.sh19,并包含一个独立的 nginx 镜像来提供静态内容 .buildkite/scripts/build_web.sh62-66
源文件:.buildkite/scripts/build_base.sh10-36 .buildkite/scripts/build_web.sh10-30 .buildkite/scripts/build_web.sh47-80
资源编译创建了包含预编译前端资源的特定环境镜像,并利用并行处理提高效率。
编译过程使用 BUILDKITE_PARALLEL_JOB 同时构建暂存和生产资源。
| 并行作业 | 环境 | 分支条件 | Make 目标 |
|---|---|---|---|
| 0 | 预发布 | != "main" | make build_staging |
| 1 | 生产 | !~ ^deploy-.* | make build_production |
每个环境都使用不同的配置和凭据。
资源编译包含用于 S3 资源上传的 AWS 凭据,并使用 COMPOSE_PROJECT_NAME 进行容器隔离 .buildkite/scripts/compile_assets.sh24
源文件:.buildkite/scripts/compile_assets.sh62-76 .buildkite/scripts/compile_assets.sh78-92
构建系统采用结构化的标签策略进行镜像管理和部署协调。
| 镜像类型 | 标签来源 | 示例 |
|---|---|---|
| 基础镜像 | 内容哈希 | generate_tag_for_web_base.sh 的 SHA |
| Web 镜像 | Git 提交 | BUILDKITE_COMMIT 的前 12 个字符 |
| Nginx 镜像 | 文件更改 | 影响 public/ 和 docker/nginx/ 的 Git 提交 |
| 环境镜像 | Web 标签 + 环境 | staging-abc123def456 或 production-abc123def456 |
所有镜像都存储在 AWS ECR 中,并为推送操作提供重试逻辑。
nginx 镜像标签生成使用 generate_nginx_tag() 函数,从 public/ 目录和 docker/nginx/ 配置中的文件创建基于内容的标签 .buildkite/scripts/build_web.sh47-59
源文件:.buildkite/scripts/build_base.sh22-34 .buildkite/scripts/build_web.sh34-45 .buildkite/scripts/compile_assets.sh41-55