CircleCI 教程
1. 什么是 CircleCI?
CircleCI 是一个流行的 CI/CD 平台,它允许开发者自动化构建、测试和部署流程。CircleCI 与 GitHub、Bitbucket 和 GitLab 集成良好,使用 YAML 文件来定义构建配置。
2. CircleCI 的核心概念
2.1 工作流 (Workflow)
工作流是一个可配置的自动化流程,它由一个或多个作业组成。工作流定义在 .circleci/config.yml 文件中。
2.2 作业 (Job)
作业是工作流中的一个执行单元,它由一个或多个步骤组成。作业可以在不同的执行环境中运行。
2.3 步骤 (Step)
步骤是作业中的一个执行单元,它可以是一个命令或一个 Orb。
2.4 Orb
Orb 是可重用的配置包,它可以简化常见任务的配置,例如安装依赖、部署应用等。
2.5 执行环境 (Executor)
执行环境是作业运行的环境,它可以是 Docker 容器、虚拟机或 macOS 实例。
2.6 缓存 (Cache)
缓存用于存储依赖项和构建产物,以加速后续构建。
2.7 工件 (Artifact)
工件是构建过程中生成的文件,例如构建产物、测试报告等。
3. CircleCI 的基本使用
3.1 配置 CircleCI
- 访问 CircleCI 网站
- 使用 GitHub、Bitbucket 或 GitLab 账号登录
- 授权 CircleCI 访问你的代码仓库
- 在 CircleCI 仪表板上添加你要构建的仓库
3.2 创建构建配置文件
在仓库的 .circleci 目录中创建 config.yml 文件:
version: 2.1
jobs:
build:
docker:
- image: cimg/node:16.17.0
steps:
- checkout
- run:
name: Install dependencies
command: npm install
- run:
name: Run tests
command: npm test
workflows:
build-and-test:
jobs:
- build3.3 构建配置选项
CircleCI 支持多种配置选项,例如:
version:指定配置文件版本jobs:定义作业workflows:定义工作流docker:指定 Docker 执行环境steps:定义作业步骤run:运行命令checkout:检出代码cache:缓存依赖项artifacts:存储工件
3.4 工作流配置
使用工作流可以定义多个作业及其依赖关系:
version: 2.1
jobs:
build:
docker:
- image: cimg/node:16.17.0
steps:
- checkout
- run:
name: Install dependencies
command: npm install
- run:
name: Build
command: npm run build
test:
docker:
- image: cimg/node:16.17.0
steps:
- checkout
- run:
name: Install dependencies
command: npm install
- run:
name: Run tests
command: npm test
deploy:
docker:
- image: cimg/node:16.17.0
steps:
- checkout
- run:
name: Install dependencies
command: npm install
- run:
name: Deploy
command: npm run deploy
workflows:
build-test-deploy:
jobs:
- build
- test:
requires:
- build
- deploy:
requires:
- test
filters:
branches:
only: main4. CircleCI 的高级功能
4.1 使用缓存
使用缓存可以加速构建过程,避免重复安装依赖:
version: 2.1
jobs:
build:
docker:
- image: cimg/node:16.17.0
steps:
- checkout
- restore_cache:
keys:
- v1-dependencies-{{ checksum "package-lock.json" }}
- v1-dependencies-
- run:
name: Install dependencies
command: npm install
- save_cache:
paths:
- node_modules
key: v1-dependencies-{{ checksum "package-lock.json" }}
- run:
name: Run tests
command: npm test4.2 使用 Orb
Orb 可以简化常见任务的配置,例如:
version: 2.1
orbs:
node: circleci/node@5.0.0
jobs:
build:
executor: node/default
steps:
- checkout
- node/install-packages
- run:
name: Run tests
command: npm test
workflows:
build-and-test:
jobs:
- build4.3 使用矩阵构建
矩阵构建允许在不同的环境中并行运行作业:
version: 2.1
jobs:
build:
parameters:
node-version:
type: string
docker:
- image: cimg/node:<< parameters.node-version >>
steps:
- checkout
- run:
name: Install dependencies
command: npm install
- run:
name: Run tests
command: npm test
workflows:
build-matrix:
jobs:
- build:
matrix:
parameters:
node-version: ["14.19", "16.17", "18.9"]4.4 使用环境变量和密钥
CircleCI 支持使用环境变量和密钥来存储敏感信息:
version: 2.1
jobs:
build:
docker:
- image: cimg/node:16.17.0
environment:
NODE_ENV: production
API_URL: https://api.example.com
steps:
- checkout
- run:
name: Install dependencies
command: npm install
- run:
name: Run tests
command: npm test
- run:
name: Deploy
command: npm run deploy4.5 使用工件
工件用于存储构建过程中生成的文件:
version: 2.1
jobs:
build:
docker:
- image: cimg/node:16.17.0
steps:
- checkout
- run:
name: Install dependencies
command: npm install
- run:
name: Build
command: npm run build
- store_artifacts:
path: dist
destination: build5. CircleCI 的最佳实践
5.1 构建配置的组织
- 使用清晰的结构来组织构建配置
- 使用注释来解释配置的目的
- 遵循语言和框架的最佳实践
5.2 构建优化
- 使用缓存来加速构建过程
- 使用 Orb 来简化配置
- 并行运行测试以减少构建时间
- 只在必要时运行构建
5.3 安全性
- 使用 CircleCI 仪表板来设置密钥
- 避免在配置文件中硬编码敏感信息
- 定期更新依赖项以修复安全漏洞
- 使用受信任的 Docker 镜像
5.4 监控和调试
- 配置构建通知以获取构建状态更新
- 使用 CircleCI 的调试工具来排查构建问题
- 保存测试报告和构建日志作为工件
6. 实际应用示例
6.1 前端项目的 CI/CD
version: 2.1
orbs:
node: circleci/node@5.0.0
aws-s3: circleci/aws-s3@2.0.0
jobs:
build:
executor: node/default
steps:
- checkout
- node/install-packages
- run:
name: Run lint
command: npm run lint
- run:
name: Run tests
command: npm test
- run:
name: Build
command: npm run build
- store_artifacts:
path: dist
destination: build
- persist_to_workspace:
root: .
paths:
- dist
deploy:
executor: aws-s3/default
steps:
- attach_workspace:
at: .
- aws-s3/sync:
from: dist
to: s3://your-bucket-name
aws-access-key-id: $AWS_ACCESS_KEY_ID
aws-secret-access-key: $AWS_SECRET_ACCESS_KEY
region: us-east-1
workflows:
build-and-deploy:
jobs:
- build
- deploy:
requires:
- build
filters:
branches:
only: main6.2 后端项目的 CI/CD
version: 2.1
orbs:
node: circleci/node@5.0.0
heroku: circleci/heroku@1.2.6
jobs:
build:
executor: node/default
steps:
- checkout
- node/install-packages
- run:
name: Run lint
command: npm run lint
- run:
name: Run tests
command: npm test
deploy:
executor: heroku/default
steps:
- checkout
- heroku/deploy-via-git:
app-name: your-heroku-app-name
workflows:
build-and-deploy:
jobs:
- build
- deploy:
requires:
- build
filters:
branches:
only: main6.3 Docker 项目的 CI/CD
version: 2.1
jobs:
build:
docker:
- image: cimg/base:stable
steps:
- checkout
- setup_remote_docker:
version: 20.10.14
- run:
name: Build Docker image
command: docker build -t your-username/your-image .
- run:
name: Run tests
command: docker run your-username/your-image npm test
- run:
name: Push Docker image
command: |
echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin
docker push your-username/your-image
workflows:
build-and-deploy:
jobs:
- build:
filters:
branches:
only: main7. CircleCI 与其他 CI/CD 工具的比较
7.1 CircleCI vs GitHub Actions
- CircleCI 是一个独立的 CI/CD 平台,而 GitHub Actions 是 GitHub 内置的
- CircleCI 使用
.circleci/config.yml文件,而 GitHub Actions 使用.github/workflows目录中的 YAML 文件 - CircleCI 提供了更丰富的功能和更灵活的配置,而 GitHub Actions 提供了更紧密的 GitHub 集成
7.2 CircleCI vs Travis CI
- CircleCI 提供了更丰富的功能和更灵活的配置,而 Travis CI 提供了更简单的配置
- CircleCI 支持更多的执行环境,包括 Docker 容器、虚拟机和 macOS 实例
- CircleCI 提供了更强大的缓存和工件功能
7.3 CircleCI vs Jenkins
- CircleCI 是一个托管服务,而 Jenkins 是一个自托管工具
- CircleCI 使用 YAML 文件配置,而 Jenkins 使用 Web 界面或 Jenkinsfile 配置
- CircleCI 更易于设置和使用,而 Jenkins 提供了更强大的自定义能力
8. 总结
CircleCI 是一个功能强大的 CI/CD 平台,它与 GitHub、Bitbucket 和 GitLab 集成良好,使用 YAML 文件来定义构建配置。通过 CircleCI,开发者可以自动化构建、测试和部署流程,提高开发效率,保证代码质量。
CircleCI 的核心概念包括工作流、作业、步骤、Orb、执行环境、缓存和工件,它支持多种配置选项和高级功能,例如矩阵构建、环境变量和密钥管理、Orb 重用等。
通过本教程的学习,相信你已经对 CircleCI 有了全面的了解,并且能够在实际项目中使用它来自动化 CI/CD 流程。