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

  1. 访问 CircleCI 网站
  2. 使用 GitHub、Bitbucket 或 GitLab 账号登录
  3. 授权 CircleCI 访问你的代码仓库
  4. 在 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:
      - build

3.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: main

4. 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 test

4.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:
      - build

4.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 deploy

4.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: build

5. 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: main

6.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: main

6.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: main

7. 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 流程。

« 上一篇 Travis CI 教程 下一篇 » AWS SDK 教程