See the Elephant

1992生まれのプログラマが書くエンジニアブログ

Github ActionsでCI testを回す

Github ActionsでCI testを回す

このブログでやること

- github actionsでCI testを回す
- docker の nodeコンテナを使う
- CI testを行う

今回はすでに動いているリポジトリにci testを追加します。

nodeのバージョンを揃えるため、dockerコンテナを利用する方法を採用しました。

別の言語やruntimeを使っている人は適宜読み替えてください。

github actions がきた!

github actions きましたね。 github上で起こるアクション(push, prなど)に応じて特定のタスクを実行することができるタスクランナですね

f:id:namu_r21:20191117105905p:plain
github actions navi bar

リポジトリの 「actions」からいけます。 めちゃくちゃ設定が簡単で、30分ほどで設定できました。

GitHub Actionsについて - GitHub ヘルプ

詳しくはこちら

www.kaizenprogrammer.com

こちらの記事がusageについて詳しいです。

workflowが登録できる

「new workflow」をクリック

f:id:namu_r21:20191117110620p:plain
build workflow

ここで「set up a workflow」 します。
yamlファイルでworkflowを定義します。

yamlの項目はこちらに詳細に書いてあります。

GitHub Actionsのワークフロー構文 - GitHub ヘルプ

初期状態はこちら。

name: CI

on: [push] # pushで実行

jobs: # ジョブ一覧
  build: # ジョブ

    runs-on: ubuntu-latest  # ジョブを動かす環境を選ぶ(複数指定可能)

    steps:
    - uses: actions/checkout@v1  # github のリソースにアクセスするアクション
    - name: Run a one-line script  # workflow name
      run: echo Hello, world! # CLIで実行されるshell command
    - name: Run a multi-line script
      run: |
        echo Add other actions to build,
        echo test, and deploy your project.

nodeでtestを回す準備

この節は適宜読み飛ばしたり、読みかえてください。

CIの前に依存パッケージインストール, ビルド, テストの準備を行います。

ここに関しては元々用意してあったため使いまわしました。

僕は開発にMakefileを利用しています。

プログラムのビルド作業を自動化するツールですね。

よく使うコマンドをMakefileに記述することで開発速度を早めることができるためです。

特にCIなど予め定められた特定の処理を行う場合には非常に優秀なツールです。

qiita.com

今回はnpmで依存パッケージのインストールと、gulpによるビルド、テスティングライブラリavaによるtestを行います。

Makefile


.PHONY: install gulp

npm=$(shell which npm)
npx=$(shell which npx)

install:
    $(npm) install # package.jsonの依存lib install

gulp:
    $(npx) gulp # gulpでビルド

test:
    $(npm) test # package.jsonのtestを叩きます

package.json (一部抜粋)

{
  ...,
  "devDependencies": {
    ... ,
    "ava": "^1.3.1",
    "gulp": "^4.0.0",
    "gulp-cli": "^2.0.1",
    ... ,
  },
  "ava": {
    "compileEnhancements": false,
    "extensions": [
      "ts"
    ],
    "require": [
      "ts-node/register"
    ]
  },
  "scripts": {
    "test": "tsc && ava"
  },
  ...
}

Github ActionsでCI testを回す

さて、準備が整いました。yamlを書いていきます。

今回は docker の nodeコンテナを利用します。

github.com

setup-node が利用可能です。

name: CI

on: [push, pull_request] # prが出た時, pushした時にciをトリガする

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-node@v1 # これがnode コンテナ
        with:
          node-version: '10.x' # withでバージョン指定
      - run: make install # makefileで指定したタスクをrun!
      - run: make gulp
      - run: make test

job はデフォルトで並列実行されます。

このため、 このjobでは install -> build -> test を1つの jobで行っています。

個々の役割を job に切り分けることも可能です。
その場合は jobs.<job_id>.needs で依存jobを指定できます。

一度試してみましたが、needsを書くだけではうまく動きませんでした。 jobごとにインスタンスが生成されるのでその辺を解消しないといけません。

今回はそこまでやらなくてもいいのでここまで。