其实这个叫 GitHub Actions 的持续集成已经上线很久了,在刚刚公开测试时我就尝试去使用,结果翻来翻去没找到 MongoDB 数据库的项目应该如何配置基础环境 不要问我当时为什么用了 MongoDB,我现在非常后悔(雾)。今天摸鱼的时候突然想到 Actions 支持 Docker,Docker 又能快速的启动一个 MongoDB 官方提供的容器,那么这就好办了,直接对着自己的博客下手,来试一试这个工具。

在仓库首页里点击 Actions 标签进入配置页面,并直接创建一个新的 Node CI 类型的 Workflow,这样就能获得一个适用于 node.js 项目的配置模版。和 Travis 一样,Actions 的模版配置也是使用 YAML 格式,写起来比 JSON 舒服多了。之后只需要在 steps 中添加以下内容即可启动一个 MongoDB 容器:

- name: Launch MongoDB
  run: |
    sudo docker container run --name mongo -v $PWD:/src -p 27017:27017 -d mongo
    sleep 4s
- name: Import initial database
  run: |
    sudo docker container ls --all
    sudo docker container exec mongo mongo localhost/newBlog /src/db.default.js

因为我的博客在测试时需要预先加载一份默认数据库,我在启动容器时将项目目录也 mount bind 到了容器内部。执行完 docker container run 之后等待若干秒是等待 MongoDB 启动,否则导入数据时会原地爆炸。

接下来就是整个安装依赖、构建代码和执行测试的过程,这里直接从之前 travis 的配置里复制就好了:

- name: npm install, build, and test
  run: |
    npm install
    npm run lint
    cp config.sample.ts config.ts
    sed -i 's,https://new.ntzyz.cn,http://localhost:1234,g' config.ts
    npm run build
    npm run test
    npx nyc report --reporter=text-lcov
  env:
    CI: true

最后在整一个上报测试覆盖率就完事儿了,直接去看 coverall 的文档,上面写了如何接入 Actions。因为上一步中的测试已经完成了测试覆盖报告的生成,这里只需要提交就可以了:

- name: Coveralls
  uses: coverallsapp/github-action@master
  with:
    github-token: ${{ secrets.GITHUB_TOKEN }}

搞定这些那么这个 CI 已经就跑通了,不过呢 Actions 在 workflow 的申明提供了矩阵构建策略的配置,可以写明此构建可以使用的多个虚拟环境,比如 node.js 8.x, 10.x, 12.x。Actions 会按照给定的环境并行地进行持续集成。如果出现了多组环境时,Action 会将这些环境的集合进行类似于笛卡尔积的操作,对每一种环境的组合都会进行构建。

这里我就以 Node.js 版本和 MongoDB 版本来尝试,在最开头的 jobs.strategy.matrix 中增加 MongoDB 版本列表:

strategy:
  matrix:
    node-version: ['8.x', '10.x', '12.x']
    mongo-version: ['3.6', '4.0', '4.2']

并修改启动 MongoDB 容器的步骤,将当前版本通过环境变量暴露给命令行,以指定创建容器的数据库版本:

- name: Launch MongoDB
  run: |
    sudo docker container run --name mongo -v $PWD:/src -p 27017:27017 -d mongo:$MONGO_VERSION
    sleep 4s
  env:
    MONGO_VERSION: ${{ matrix.mongo-version }}

这样我们就完成了所有调整了,具体效果可以前往 https://github.com/ntzyz/new-blog/actions 查看(可能需要登录)。