はじめに
個人ブログのリプレイスに伴い、ちゃんと CI を用意して開発したいと考え Github Actions を書いたのですが、どうせなら効率良くしたいと思い、その時の備忘録を残しておきます。 大したことはしていません、下記観点を考慮して並列化した程度です 💦
何をしたいのか?
- なるべく並列化して CI を速くまわしたい
- how: Job 単位で処理を実行する
- Step は直列実行ですが Job は並列実行なので、処理を Job 単位で上手く切り分けることで、並列に処理を完了させることができます
- how: Job 単位で処理を実行する
- テスト結果を Slack に通知できるようにしたい
- how: Slack 通知用の action-slack ワークフローがあるのでこれを使います
前提条件
- Ubuntu 20.04
- Node.js 14.15.0
サンプル
1name: CI
2
3on:
4 pull_request:
5 paths-ignore:
6 - *.md # markdownは避けたい
7
8jobs:
9 lint:
10 runs-on: ubuntu-20.04
11 strategy:
12 matrix:
13 node-version: [14.15.0]
14 steps:
15 - uses: actions/checkout@v2
16 - uses: actions/setup-node@v2
17 with:
18 node-version: ${{ matrix.node-version }}
19 cache: "yarn"
20 - run: yarn
21 - run: yarn bootstrap
22 - run: yarn lint
23
24 test:
25 runs-on: ubuntu-20.04
26 strategy:
27 matrix:
28 node-version: [14.15.0]
29 steps:
30 - uses: actions/checkout@v2
31 - uses: actions/setup-node@v2
32 with:
33 node-version: ${{ matrix.node-version }}
34 cache: yarn
35 - run: yarn
36 - run: yarn bootstrap
37
38 - name: test
39 working-directory: packages/backend # テストがある階層に移動
40 run: yarn test
41
42 # テストの成否をSlackに通知 by https://github.com/8398a7/action-slack
43 - name: notification
44 uses: 8398a7/action-slack@v3
45 env:
46 SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
47 if: always()
48 with:
49 status: custom
50 custom_payload: |
51 {
52 attachments: [{
53 fields: 'job',
54 author_name: 'Test for CMS',
55 mention: 'here',
56 if_mention: 'failure',
57 color: '${{ job.status }}' === 'success' ? 'good' : 'danger',
58 text: '${{ job.status }}' === 'success' ? 'Test success' : 'Test failed',
59 }]
60 }
おわりに
今まで Github Actions では、直列実行の Step でやりくりしていたのですが、Job で並列化することで高速化を試みました。比較はしていませんが、速くなったような...気がしています。 この程度の Step 数ではそこまでメリットはなさそうですが、処理が増えると並列化が効いてくるのかなと信じています。