CircleCI 流水线:快速构建、测试与发布
CircleCI 流水线全方位入门
在持续集成与持续交付 (CI/CD) 的世界中,CircleCI 凭借其云原生架构、开箱即用的并行能力和以配置文件为核心的流水线模型,成为众多开发团队的首选工具。本教程将手把手带你从零构建第一条 CircleCI 流水线,掌握代码提交后自动构建、测试与发布的核心技能。内容面向初学者,但包含大量可直接复用的配置示例与最佳实践。
1. 理解 CircleCI 流水线的核心组成
CircleCI 的流水线由以下几个核心概念构成,所有操作都围绕 .circleci/config.yml 文件展开:
| 概念 | 说明 |
|---|---|
| 项目 (Project) | 与代码仓库关联的 CircleCI 配置实体,通常一个仓库对应一个项目。 |
| 流水线 (Pipeline) | 触发一次 CI/CD 全流程的顶层容器,包含一个或多个工作流。 |
| 工作流 (Workflow) | 编排一组作业的执行顺序、依赖关系及触发条件。 |
| 作业 (Job) | 实际执行步骤的单元,运行在指定的执行环境(Docker 容器、Linux/Windows/macOS 虚拟机或 macOS 机器)中。 |
| 步骤 (Step) | 作业内顺序执行的指令,例如检出代码、运行脚本、存储缓存、持久化产物等。 |
明白这些抽象之后,你就能沿着“配置 → 作业 → 工作流”的路径构建出自己的自动化流程。
2. 准备工作:连接仓库与创建配置文件
前提条件
- 拥有一个包含应用源码的 Git 仓库(GitHub、GitLab 或 Bitbucket)。
- 已注册 CircleCI 账号并授权访问你的代码托管平台。
快速上手
- 登录 CircleCI Web 控制台,在 Projects 页面找到目标仓库,点击 Set Up Project。
- 选择 Fastest 配置模板或直接选择 Use existing config,然后按照提示在仓库根目录创建
.circleci/config.yml文件。 - 将以下基础配置推送到仓库的默认分支,CircleCI 会自动触发第一次流水线。
3. 编写第一条基础配置:一个最简单的构建作业
version: 2.1
jobs:
build:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Say hello"
command: echo "Hello, CircleCI!"
workflows:
version: 2
build-and-test:
jobs:
- build
逐行解读
version: 2.1:声明使用 CircleCI 2.1 配置格式,以启用 Orb、进阶工作流等功能。jobs区块定义了名为build的作业:docker:指定执行环境,这里使用 CircleCI 维护的cimg/base镜像,它包含常见 CLI 工具。steps:第一步checkout是 CircleCI 内置步骤,用于将当前 commit 的代码检出到工作目录;第二步run执行任意 shell 命令。
workflows区块将build作业编排进build-and-test工作流,每次推送都会自动运行。
将文件提交到仓库默认分支后,打开 CircleCI Dashboard 即可看到实时运行状态。
4. 构建阶段:编译代码与缓存依赖
真实项目通常需要安装依赖、编译资源。下面以 Node.js 项目为例,展示如何利用缓存大幅加速构建。
version: 2.1
jobs:
build:
docker:
- image: cimg/node:20.11
steps:
- checkout
- restore_cache:
keys:
- v1-deps-{{ checksum "package-lock.json" }}
- v1-deps-
- run:
name: Install dependencies
command: npm ci
- save_cache:
key: v1-deps-{{ checksum "package-lock.json" }}
paths:
- ~/.npm
- node_modules
- run:
name: Build application
command: npm run build
- persist_to_workspace:
root: .
paths:
- dist
- node_modules
workflows:
version: 2
build-and-deploy:
jobs:
- build
关键技巧
- 缓存策略:
restore_cache根据package-lock.json的哈希精确命中缓存;若未命中则回退到v1-deps-前缀的部分缓存。安装完成后save_cache更新缓存。 - 工作空间持久化:
persist_to_workspace将构建产物dist与依赖传递给同一工作流中的后续作业,避免重复安装和构建。
5. 测试阶段:并行运行与结果收集
测试是 CI 的核心增值点。CircleCI 允许在同一作业内使用 parallelism 拆分测试套件,或在不同作业中分类测试。
示例:拆分 Jest 测试用例(Node.js)
version: 2.1
jobs:
build:
# ...同上 build 作业,最后 persist_to_workspace
test:
docker:
- image: cimg/node:20.11
parallelism: 4
steps:
- attach_workspace:
at: /tmp/workspace
- run:
name: "Prepare workspace"
command: |
cp -R /tmp/workspace/dist ./dist
cp -R /tmp/workspace/node_modules ./node_modules
- run:
name: "Run tests in parallel"
command: |
TESTFILES=$(circleci tests glob "src/**/*.test.js" | circleci tests split --split-by=timings)
npx jest $TESTFILES --ci --reporters=default --reporters=jest-junit
- store_test_results:
path: test-results
- store_artifacts:
path: coverage
workflows:
version: 2
build-and-test:
jobs:
- build
- test:
requires:
- build
配置要点
attach_workspace从build作业获取之前持久化的dist和node_modules,避免重复依赖安装。parallelism: 4表示启动 4 个并行执行器。circleci tests glob与circleci tests split合作:先按模式收集测试文件列表,再根据历史执行时长(--split-by=timings)自动均衡分配到各个并行容器,大幅缩短总测试时间。store_test_results收集 JUnit 格式的测试报告,在 CircleCI UI 中展示通过率趋势。store_artifacts保存覆盖率报告等文件,方便事后下载查看。
6. 发布阶段:自动部署到生产环境
测试全部通过后,通常希望自动部署。下面以部署到 AWS S3 静态网站为例,展示多环境审批流程。
完整工作流示例
version: 2.1
orbs:
aws-cli: circleci/aws-cli@4.1.3
jobs:
build:
# ...生成 dist 目录,persist_to_workspace
test:
# ...测试并存储结果
deploy-staging:
docker:
- image: cimg/python:3.12
environment:
S3_BUCKET: my-staging-bucket
steps:
- attach_workspace:
at: /tmp/workspace
- aws-cli/setup:
role_arn: arn:aws:iam::123456:role/CircleCIDeploy
- run:
name: Deploy to Staging
command: |
aws s3 sync /tmp/workspace/dist s3://$S3_BUCKET --delete
aws cloudfront create-invalidation --distribution-id XYZ --paths "/*"
deploy-prod:
docker:
- image: cimg/python:3.12
environment:
S3_BUCKET: my-prod-bucket
steps:
- attach_workspace:
at: /tmp/workspace
- aws-cli/setup:
role_arn: arn:aws:iam::123456:role/CircleCIDeploy
- run:
name: Deploy to Production
command: |
aws s3 sync /tmp/workspace/dist s3://$S3_BUCKET --delete
aws cloudfront create-invalidation --distribution-id ABC --paths "/*"
workflows:
version: 2
build-test-deploy:
jobs:
- build
- test:
requires:
- build
- deploy-staging:
requires:
- test
filters:
branches:
only: main
- hold-for-production:
type: approval
requires:
- deploy-staging
- deploy-prod:
requires:
- hold-for-production
filters:
branches:
only: main
发布流水线解读
- 使用 Orb
circleci/aws-cli快速配置 AWS CLI 凭证(推荐通过 OIDC 角色信任,无需存储密钥)。 deploy-staging作业每次推送到main分支且测试通过后自动触发,将构建产物同步到预发布环境并刷新 CDN。- 手动审批:
hold-for-production是一个type: approval的特殊作业,会在预发布部署完成后暂停流水线。只有负责人点击 Approve 后,deploy-prod才执行。 - 过滤条件
branches: only: main确保该工作流仅在主分支触发,避免特性分支误部署生产。
7. 进阶必备:环境变量、上下文与定时触发
环境变量与上下文
- 在项目设置的 Environment Variables 中添加敏感信息(如 API Token),配置中通过
$MY_SECRET引用。 - 上下文 (Context) 可在组织级别共享变量,适用于跨项目的通用凭据。使用方式:
- deploy-prod:
context: aws-production
配置文件内无需改动,作业会自动注入上下文中定义的所有环境变量。
定时触发
若需要夜间构建或定期自动化任务,可添加 triggers:
workflows:
nightly-scan:
triggers:
- schedule:
cron: "0 2 * * *"
filters:
branches:
only: main
jobs:
- security-scan
上述配置会在每天 UTC 2:00 对 main 分支运行 security-scan 作业。
8. 故障排查与最佳实践
| 常见问题 | 解决思路 |
|---|---|
| 缓存未命中导致构建缓慢 | 检查 restore_cache 的 key 模板是否与 save_cache 一致;落盘文件路径是否正确。 |
| 并行测试仍很慢 | 使用 --split-by=timings 并确保至少运行过一次;排除大型 fixture 文件不参与 glob 匹配。 |
| 工作空间文件未找到 | 确认 attach_workspace 路径与 persist_to_workspace 时设置的 root 一致。 |
| 部署步骤因权限失败 | 若使用 OIDC,确保角色信任策略包含 CircleCI 组织 ID;检查 filters 是否意外限制分支。 |
最佳实践清单
- 单一 Trust 源:配置文件必须从可信分支推送,敏感信息一律不用明文写入仓库。
- 缓存与工作空间权责分离:缓存仅用于加速依赖安装,工作空间用于作业间传递产物。
- 使用 Orb 统一操作:官方和第三方 Orb 封装了常见任务(如 AWS、Docker Hub、Slack 通知),减少重复代码并保持配置简洁。
- 限定资源使用:结合
resource_class为重型作业分配更高规格的执行器;对小作业使用默认资源以节省计费分钟。 - 定期审查 Insights:CircleCI 提供的 Insights 面板可分析作业耗时、成功率和排队时间,持续优化流水线。
通过本篇教程,你已经完成了一条覆盖构建 → 并行测试 → 多环境部署 → 手动审批的完整 CircleCI 流水线。这套配置可以直接应用于大多数 Node.js 前端或后端项目,其他语言栈只需替换对应 Docker 镜像和构建命令即可。现在,把你的代码推送到仓库,观察绿色流水线带来的一气呵成体验吧。