GitHub Actions で特定の OS の時のみ実行するスクリプトを切り替える
テスト時の必要なパッケージのセットアップ等で OS 毎に実行するスクリプトを切り替える必要があり, 色々と調べたので書き残します。
GitHub Actions では標準で Windows Server 2019, Ubuntu 18.04, 16.04, macOS Catalina 10.15 が使えます。 (2019/12/18 現在)
CI の際に, OS により実行する事が違う場合が多々ありますが, GitHub Actions では YAML ファイル内で簡単に分岐できます。
OS の切り替えに限らず, 特定の条件のみ実行する場合は jobs.<job_id>.if
でコンテキストを使って分岐します。
変に説明するよりも見たほうが早いので, 例を貼り付けます。
以下は Linux (ubuntu-latest) の時は apt, macOS (macos-latest) の時は brew を使い, zsh をインストールする例です。
name: CI on: [push] jobs: build: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macos-latest] node-version: [12.x] steps: - uses: actions/checkout@v1 - name: Use the Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} # Linux の時のみ, apt で zsh をインストール - name: Install zsh on ubuntu-latest if: runner.os == 'Linux' run: | sudo apt update -y sudo apt install -y zsh # macOS の時のみ, HomeBrew で zsh をインストール - name: Install zsh on macos-latest if: runner.os == 'macOS' run: | brew update brew install zsh
runner.os
で現在のジョブで実行されてる OS の取得が出来ます。
取得できる文字列はLinux
, macOS
, Windows
です。
if
で書く OS 名はシングルクォートで囲う必要があります(ダブルクォートだと Your workflow file was invalid: The pipeline is not valid.
, Unexpected symbol
になります)。
分岐条件が複数ある場合は &&
で繋ぐだけです。
# os が macOS かつ, イベントが pull_request if: runner.os == 'macOS' && github.event_name == 'pull_request'
Node.js のバージョン切り替えで使っている matrix.node-version
や, ジョブの状態を取得する job.status
などもコンテキストの一つですので if
に使えます。
その他のコンテキストは GitHub ヘルプから参照できます。
Travis CI のようにジョブの情報が環境変数に入っていてシェルスクリプトの中で分岐するのは, シェルスクリプトにあまり慣れてない人(僕)が触るとまあまあ最悪なので, YAML ファイル内で簡単に分岐出来るのはありがたいですね。