ちょうどJSライブラリを開発していたので、そのリポジトリでGitHub Actionsを使ってCI(継続的インテグレーション)の設定をしてみたので、その使い方や解説をする。
GitHub Actionsとは
一言でいうと、GitHub上で完結するCI/CDサービス。
いままでCircleCIやTravisCI、Drone CIなど外部のサービスを使っていたところを、GitHub上で実行できるサービスだ。
昔はTerraformなどで使われているHCL(HashiCorp Configration Language)を用いて設定ファイルを書いていたらしいが、2019年9月30日に廃止されYAML構文に一本化される。そのため、CircleCIやTravisCIなどからも比較的簡単に移行することができる。
詳しくは公式ドキュメント参照。
▶ GitHub Actionsについて - GitHub ヘルプ
ワークフローの設定ファイル
GitHub Actionsはワークフローと呼ばれる単位で実行できる。設定ファイルはGitHubのUI上からも作成できるが
.github/workflows/your-workflow.yml
にファイルを作成するだけでもOK。設定ファイルをざっくり説明すると以下のようになる。
#===============================
# ワークフロー設定ファイル
#===============================
# ワークフロー名
name: ワークフロー名
#===============================
# ワークフローを実行するトリガー
#===============================
# ワークフローを実行するトリガーの設定(簡易版)
on: [push, pull_request]
# ワークフローを実行するトリガー設定(詳細版)
on:
# pushイベントで実行するときの条件
push:
branches:
- master
- develop
paths:
- 'src/*/*.ts'
- '!*.js'
# cronでスケジュール実行
schedule:
- cron: '*/15 * * * *'
#===============================
# ワークフローで実行するジョブ
#===============================
jobs:
# ジョブID
job_1:
name: ジョブ1
# ジョブを実行する仮想環境
runs-on: ubuntu-latest
# ジョブを実行する環境のバリエーション
strategy:
matrix:
node-version: [8, 10, 12]
# ジョブ内で実行するタスク(ステップ)
steps:
# ステップ名
- name: ジョブ1の1つ目の処理
# DockerHubで公開されているDockerイメージ or GitHubのパブリックリポジトリ
uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
# 入力パラメータのKeyValueペア→実行時は`INPUT_ + NODE-VERSION`で参照できる
with:
node-version: ${{ matrix.node-version }}
- name: npm install and test
# 実行するコマンド
run: |
npm ci
npm run test
# step内で使う環境変数
env:
CI: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
job_2:
name: ジョブ2
# job_1が成功したらjob_2実行する
needs: job_1
# ジョブ内で使うコンテナ
container:
image: alpine
env:
NODE_ENV: development
ports:
- 80
steps:
- name: ジョブ2の1つ目の処理
uses: hoge/hoge-image@master
with:
# DockerのENTRYPOINTを上書きする
entrypoint: /path/to/entrypoint.sh
# entrypointにわたす引数(文字列)
args: hello world one two three
job_3:
name: ジョブ3
needs: [job_1, job_2]
実行すると以下のような結果が表示される。
詳しくは公式ドキュメント参照。
▶ Workflow syntax for GitHub Actions - GitHub Help
▶ Events that trigger workflows - GitHub Help
実践: JavaScriptのプロジェクトでLint、Testする
以下の設定ファイルは最近開発しているXYPad.jsのリポジトリのワークフロー設定で、Node8, 10, 12の環境でLintとTestを実行している。
name: Node CI
on:
push:
branches:
- master
paths:
- '*.ts'
pull_request:
paths:
- '*.ts'
jobs:
lint:
name: eslint
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [8, 10, 12]
steps:
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: npm install and lint
run: |
npm ci
npm run lint
env:
CI: true
test:
name: Library test
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [8, 10, 12]
steps:
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: npm install and test
run: |
npm ci
npm run test
env:
CI: true
注意点
YAMLのAlias/Anchorが使えない
設定ファイルを見ていただくとわかると思うが、重複する箇所がいくつか存在している。そこでYAMLのAlias/Anchroを使って以下のように設定してみた。# エイリアス・アンカーを使用
environment: &environment
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [8, 10, 12]
name: CI
on: [push]
jobs:
lint:
<<: *environment
steps:
# 以下略
そうしたところ「Your workflow file was invalid.」というエラーがでてしまった。どうやらYAMLのAlias/Anchorはいまのところ使えないらしい。
参考サイト
以上
written by @bc_rikko
0 件のコメント :
コメントを投稿