2019/09/12

GitHub Actionsの使い方まとめ

9月上旬にGitHubから「You're in! Get started with GitHub Actions beta」というメールが届いた。どうやら以前した利用申請が通り、個人アカウントでGitHub Actionsのベータ版が利用できるようになったらしい。

ちょうど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 件のコメント :

コメントを投稿