Skip to main content

circleci 系列1 - 起步

·2 mins

ci 工具的使用会极大得减少开发者的测试发布负担, 减少错误定位消耗的时间.

circleci #

我的 github 代码基本都是使用 circleci, 之前是 1.0 版本, 但是从它 2.0 测试版本发布我就一直使用 2.0. 建议大家使用 2.0, 因为 2.0 优化了很多东西, 支持 docker 镜像, 配置更加清晰简介, 速度快了好几倍, 是至今我见到的免费 ci 最好用的一个.

快速开始 #

举个简单的例子, node 项目每次提交代码自动执行测试

circleci 需要你在项目中包含一个 circle.yml 配置文件, 上面的需求可以这样定义:

# 使用 2.0 版本
version: 2
# 定义任务
jobs:
  # 任务名称
  test:
    # 工作目录
    working_directory: ~/github/repo
    # docker 配置
    docker:
      # 选择镜像
      - image: circleci/node:8.9.4
    # 执行步骤
    steps:
      # 拉取 github 代码, 内置命令
      - checkout
      # 定义命令, 安装依赖包
      - run:
          name: install dependences
          command: yarn
      # 定义命令, 执行我们的测试
      - run:
          name: run test
          command: yarn test

非常清晰直观, 首先拉取我们定义的 docker 镜像作为运行容器, 然后拉取 github 代码, 之后安装依赖, 然后运行测试, 这些命令执行如果退出状态吗为 0 就证明成功了, 否则失败, 失败我们会收到邮件提醒.

缓存 #

写过 node 项目的人基本都知道 node_modules 的威力, 尽管 circleci 的服务器在国外而且网络很好, 但是还是没必要在可以使用缓存节约时间的情况下浪费那些时间.

所以我们需要为上面配置的steps增加缓存配置:

# ...
steps:
  - checkout
  # 如果有缓存, 先取出缓存再运行安装依赖命令
  - restore_cache:
      # 标识键
      key: dependency-cache-{{ checksum "package.json" }}
  - run:
    name: install dependences
    command: yarn
  # 安装依赖包之后缓存 node_modules 文件夹
  - save_cache:
      # 缓存路径
      paths:
        - node_modules
      # 标识键, 改变时更新缓存
      key: dependency-cache-{{ checksum "package.json" }}
  - run:
    name: run test
    command: yarn test

于是我们增加了两个步骤, 安装依赖之前取出缓存, 安装依赖之后更新缓存. 这里主要注意的是 key, 这个值控制着改不改使用缓存, {{ checksum "package.json" }} 这部分的意思是该文件的哈希值, 也就是文件改变就丢弃缓存, 不变就一直使用, 所以我们使用yarn或者npm5最好使用lockfile作为标识, 也就是yarn.lock或者package.lock, 保证镜像源之类的更新不会受到缓存的影响.

这样我们的 circleci 执行任务时间就省了不少.

注意: 缓存的 saverestore 其实是上传下载同步到 circleci 自己的服务器上, 走的是https, 所以应该有一部分人为了节约docker镜像拉取时间, 而使用相应镜像的 alpine 版本, 确实 alpine 版本的镜像会小很多, 但是此版本默认都不会安装 ca-certificates 这将导致发送 https 请求收到影响, 会使得缓存拉取和上传都不正常, 所以如果要做这方面的优化最好自己构建安装了ca-certificates 的 docker 镜像.

例子请看 https://github.com/zcong1993/circleci-samples/tree/master/demos/start