CircleCI 是目前最流行的云端 CI/CD 平台之一,以高速构建、灵活配置和强大的并行能力著称。它围绕 .circleci/config.yml 构建了一套完整的流水线体系,从 Pipeline、Workflow、Job 到 Step,层层嵌套,职责清晰。本文深入解析 CircleCI 的核心架构、执行环境、缓存机制与配置语法,帮助你真正理解它为何能在众多 CI/CD 工具中脱颖而出。
一、CircleCI 的整体架构层次
CircleCI 的配置体系是一个清晰的四层结构,从最外层到最内层依次为:
1 2 3 4
| Pipeline(流水线) └── Workflow(工作流) └── Job(任务) └── Step(步骤)
|
1.1 Pipeline
Pipeline 代表一次完整的 CI/CD 触发事件,通常由代码 Push、PR 创建/更新、Tag 推送或手动触发引起。一个 Pipeline 包含所有 Workflow,并携带 pipeline.id、pipeline.number、pipeline.git.branch 等内置参数。
1 2 3 4 5 6
| jobs: build: steps: - run: echo "当前分支:<< pipeline.git.branch >>" - run: echo "Pipeline 编号:<< pipeline.number >>"
|
Pipeline 参数(Pipeline Parameters)可以通过 API 触发时传入,实现动态配置:
1 2 3 4 5 6 7 8 9 10 11 12 13
| version: 2.1
parameters: deploy-env: type: enum enum: ["dev", "staging", "prod"] default: "dev"
workflows: deploy: jobs: - deploy: context: << pipeline.parameters.deploy-env >>-secrets
|
1.2 Workflow
Workflow 是编排 Job 执行顺序的核心。它定义了 Job 之间的依赖关系(requires)、触发条件(分支过滤、Tag 过滤)、定时调度(cron),以及手动审批门(type: approval)。
典型的多阶段 Workflow:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| workflows: build-test-deploy: jobs: - build - unit-test: requires: - build - integration-test: requires: - build - deploy-staging: requires: - unit-test - integration-test filters: branches: only: main - hold-for-prod: type: approval requires: - deploy-staging - deploy-production: requires: - hold-for-prod context: prod-secrets
|
分支与 Tag 过滤:
1 2 3 4 5 6 7 8 9
| workflows: release: jobs: - build: filters: tags: only: /^v\d+\.\d+\.\d+$/ branches: ignore: /.*/
|
定时触发(Scheduled Workflow):
1 2 3 4 5 6 7 8 9 10 11
| workflows: nightly-regression: triggers: - schedule: cron: "0 2 * * *" filters: branches: only: main jobs: - full-regression-test - performance-benchmark
|
1.3 Job
Job 是实际执行任务的单元,每个 Job 运行在独立的执行环境(Executor)中。Job 之间通过 Workspace 共享文件,但默认隔离,不共享进程或文件系统。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| jobs: build: docker: - image: cimg/node:22.0 resource_class: medium steps: - checkout - run: npm ci - run: npm run build - persist_to_workspace: root: . paths: - dist - node_modules
test: docker: - image: cimg/node:22.0 steps: - attach_workspace: at: . - run: npm test
|
1.4 Step
Step 是 Job 内部的最小执行单元,常见类型:
| Step 类型 |
作用 |
checkout |
从 Git 仓库检出代码 |
run |
执行 Shell 命令 |
save_cache / restore_cache |
依赖缓存 |
persist_to_workspace / attach_workspace |
Job 间文件共享 |
store_artifacts |
存储构建产物(可在 UI 下载) |
store_test_results |
存储测试报告(用于 Insights 分析) |
二、执行环境(Executor)详解
Executor 定义了 Job 的运行环境。CircleCI 提供四种类型:
2.1 Docker Executor(最常用)
在 Docker 容器中运行 Steps,启动速度快(约 5 秒),支持多服务容器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| jobs: test-with-db: docker: - image: cimg/python:3.12 environment: DATABASE_URL: postgresql://postgres:password@localhost/mydb - image: postgres:16 environment: POSTGRES_PASSWORD: password POSTGRES_DB: mydb - image: redis:7-alpine steps: - checkout - run: pip install -r requirements.txt - run: python manage.py test
|
主容器与服务容器的关系:
- 主容器:Steps 在此容器中执行,通过
localhost 访问服务容器
- 服务容器:提供数据库、缓存等依赖服务,随 Job 自动启停
- 网络:同一 Job 内所有容器共享同一网络命名空间
CircleCI 便利镜像(Convenience Images):
1 2 3 4 5 6 7
| - image: cimg/node:22.0 - image: cimg/python:3.12 - image: cimg/go:1.22 - image: cimg/rust:1.78 - image: cimg/aws:2024.03 - image: cimg/base:current
|
2.2 Machine Executor(完整 VM)
提供完整的 Linux 虚拟机,原生支持 Docker 操作,适合需要 root 权限或 Docker-in-Docker 的场景。
1 2 3 4 5 6 7 8 9 10 11
| jobs: build-docker-image: machine: image: ubuntu-2204:current docker_layer_caching: true resource_class: large steps: - checkout - run: | docker build -t myapp:${CIRCLE_SHA1} . docker push myapp:${CIRCLE_SHA1}
|
Machine vs Docker 执行器对比:
| 维度 |
Docker |
Machine |
| 启动时间 |
~5 秒 |
~30-60 秒 |
| 隔离级别 |
容器级(共享宿主内核) |
VM 级(完整隔离) |
| Docker 支持 |
需要 setup_remote_docker |
原生支持 |
| 特权操作 |
受限 |
支持 |
| 资源成本 |
较低 |
较高 |
2.3 macOS Executor
专用于 iOS/macOS 应用构建,预装 Xcode。
1 2 3 4 5 6 7 8 9
| jobs: build-ios: macos: xcode: "15.4.0" resource_class: macos.m1.medium.gen1 steps: - checkout - run: pod install - run: xcodebuild -workspace MyApp.xcworkspace -scheme MyApp test
|
2.4 Resource Class(资源规格)
通过 resource_class 控制 CPU 和内存:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| jobs: lint: docker: - image: cimg/node:22.0 resource_class: small steps: - run: npm run lint
heavy-build: docker: - image: cimg/node:22.0 resource_class: xlarge steps: - run: npm run build:production
|
Docker Executor 资源规格(常用):
| resource_class |
vCPU |
RAM |
small |
1 |
2GB |
medium(默认) |
2 |
4GB |
large |
4 |
8GB |
xlarge |
8 |
16GB |
2xlarge |
16 |
32GB |
三、依赖缓存机制
CircleCI 的缓存机制是提升构建速度的关键。理解其设计原理,才能用好缓存。
3.1 缓存工作原理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| jobs: build: docker: - image: cimg/node:22.0 steps: - checkout
- restore_cache: keys: - node-deps-v1-{{ checksum "package-lock.json" }} - node-deps-v1-
- run: npm ci
- save_cache: key: node-deps-v1-{{ checksum "package-lock.json" }} paths: - node_modules - ~/.npm
|
3.2 缓存 Key 的模板函数
| 模板 |
含义 |
{{ checksum "file" }} |
文件内容的 SHA256 哈希 |
{{ .Branch }} |
当前 Git 分支名 |
{{ .Revision }} |
当前 Git commit SHA |
{{ .BuildNum }} |
构建编号 |
{{ epoch }} |
当前时间戳(Unix) |
缓存策略示例(多语言项目):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| - restore_cache: keys: - go-mod-v1-{{ checksum "go.sum" }} - go-mod-v1- - run: go mod download - save_cache: key: go-mod-v1-{{ checksum "go.sum" }} paths: - /go/pkg/mod - ~/.cache/go-build
- restore_cache: keys: - pip-v1-{{ checksum "requirements.txt" }}-{{ .Branch }} - pip-v1-{{ checksum "requirements.txt" }}- - pip-v1- - run: pip install -r requirements.txt - save_cache: key: pip-v1-{{ checksum "requirements.txt" }}-{{ .Branch }} paths: - ~/.cache/pip
|
3.3 缓存的注意事项
- 缓存不跨分支(默认):某分支保存的缓存优先被同分支后续构建使用
- 缓存不可更新:已存在的 key 不会被覆盖,需要修改 key(如
v1 → v2)来强制刷新
- 安全性:缓存在同一组织的项目间可能共享,不要缓存敏感信息
- 缓存不保证命中:CircleCI 基于最大努力原则提供缓存,不做强承诺
四、Workspace:Job 间数据共享
Workspace 与 Cache 不同,专门用于同一 Workflow 内不同 Job 之间传递文件,不跨 Workflow 持久化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| jobs: build: steps: - checkout - run: npm run build - persist_to_workspace: root: ~/project paths: - dist - .env.production
deploy: steps: - attach_workspace: at: ~/project - run: | ls ~/project/dist # 可以直接访问上游构建产物 ./deploy.sh ~/project/dist
|
Workspace 与 Cache 的区别:
| 维度 |
Workspace |
Cache |
| 生命周期 |
单次 Workflow |
跨构建(天级别) |
| 用途 |
Job 间传递构建产物 |
加速依赖安装 |
| 存储大小 |
无硬性限制 |
有配额限制 |
| 可更新 |
每次 Workflow 重新生成 |
Key 存在则不更新 |
五、Reusable Config(可复用配置)
CircleCI 2.1 引入了强大的配置复用能力,避免重复编写相同配置。
5.1 Commands(可复用步骤序列)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| commands: setup-aws: description: "配置 AWS 凭证和 CLI" parameters: aws-region: type: string default: "us-east-1" steps: - run: name: 配置 AWS 凭证 command: | aws configure set region << parameters.aws-region >> aws sts get-caller-identity
notify-slack: description: "发送 Slack 通知" parameters: message: type: string steps: - run: name: 发送 Slack 通知 command: | curl -X POST $SLACK_WEBHOOK_URL \ -H 'Content-type: application/json' \ --data '{"text":"<< parameters.message >>"}'
jobs: deploy: steps: - setup-aws: aws-region: "ap-northeast-1" - run: ./deploy.sh - notify-slack: message: "部署完成:${CIRCLE_BRANCH} @ ${CIRCLE_SHA1}"
|
5.2 Executors(可复用执行环境)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| executors: node-executor: docker: - image: cimg/node:22.0 resource_class: medium environment: NODE_ENV: production TZ: Asia/Shanghai
go-executor: docker: - image: cimg/go:1.22 resource_class: large
jobs: build-frontend: executor: node-executor steps: - checkout - run: npm ci && npm run build
build-backend: executor: go-executor steps: - checkout - run: go build ./...
|
5.3 Orbs(可跨项目复用的配置包)
Orb 是 CircleCI 最强大的复用机制,可以打包 Commands、Jobs、Executors 供其他项目使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| version: 2.1
orbs: node: circleci/node@5.2.0 aws-ecr: circleci/aws-ecr@9.3.7 slack: circleci/slack@4.13.3 kubernetes: circleci/kubernetes@1.0.0
jobs: build-and-push: docker: - image: cimg/aws:2024.03 steps: - checkout - aws-ecr/build-and-push-image: repo: my-app tag: ${CIRCLE_SHA1} region: us-east-1
workflows: ci: jobs: - node/test: version: "22.0" pkg-manager: npm - build-and-push: requires: - node/test context: aws-prod
|
六、配置校验与调试技巧
6.1 本地校验配置
1 2 3 4 5 6 7 8 9 10 11
| brew install circleci
circleci config validate
circleci config process .circleci/config.yml
circleci local execute --job build
|
6.2 SSH 调试失败构建
CircleCI 允许直接 SSH 进入失败的构建容器进行调试:
- 在 CircleCI UI 中,点击失败的 Job
- 点击右上角「Rerun」→「Rerun Job with SSH」
- 将提供的 SSH 命令复制到终端执行
- 在容器内检查文件、环境变量、运行命令
1 2 3 4
| env | grep CIRCLE cat /tmp/deploy.log ls -la ~/project
|
七、小结
本文梳理了 CircleCI 的核心架构层次(Pipeline → Workflow → Job → Step)、四种执行环境(Docker/Machine/macOS/Windows)、依赖缓存与 Workspace 机制,以及 2.1 版本引入的可复用配置(Commands/Executors/Orbs)。
理解这些基础概念是用好 CircleCI 的前提。在第二篇中,我们将深入探讨并行测试拆分、Docker Layer Caching、自托管 Runner、安全上下文管理、以及在 Kubernetes 环境中集成 CircleCI 的最佳实践。
参考资料: