GitHub Actions をローカルマシンで実行する(PHP 編)
GitHub Actions をローカルマシンで実行できるツール nektos/act
を使って PHP を使ったワークフローを手元で実行する方法についてまとめました。
想定ユースケース
- GitHub Actions で PHPUnit など PHP を使ったワークフローを実行している。
- ワークフローで
shivammathur/setup-php
を使っている。
要約
-
nektos/act
便利。 -
shivammathur/setup-php
使ってる場合の実行イメージはshivammathur/node
がオススメ。
nektos/act
をインストール
macOS の場合は Homebrew でインストールが可能です。
brew install act
その他の環境の場合は 公式の README に各種 OS 向けのインストール方法が載っているのでそちらをご覧ください。
また、実行には Docker が必要になるので、もし導入していない場合は別途セットアップが必要です。
実行イメージを選択
act
を使ってワークフローを実行するためにはワークフローを実行する環境、つまりコンテナイメージを選択する必要があります。標準の選択肢は 公式の README に載っていますが、今回の目的である「PHP を使ったワークフローを実行する」を達成するためには課題があります。
- Micro, もしくは Medium を選択すると
shivammathur/setup-php
が動作しない。 - GitHub Actions の実行環境と互換性のある Large を選択すると 18GB もある。
ダウンロードする時間と潤沢なローカルストレージがあれば2番目の選択肢を選ぶこともできると思いますが、オススメは shivammathur/setup-php
の README で紹介されている shivammathur/node
を使う方法です。
shivammathur/node
も約 700MB と軽量とは言えませんが、18GB と比べれば雲泥の差です。今回は act
のオプション -P
を使ってこのイメージを指定することにします。
GitHub Personal Access Token を準備する
GitHub Actions で自動テストなどを行う時、多くの場合は actions/checkout
を用いてプロジェクトをチェックアウトしていると思います。 この時、GitHub Actions 環境においては自動的にアクセストークンを用いてチェックアウトを行ってくれますが、act
を使う場合は明示的に指定する必要があります。
適切なトークンが手元にない場合は下記のマニュアルを参考にトークンを準備してください。
トークンはコマンドラインオプション(-s GITHUB_TOKEN=...
)で指定できる他、カレントディレクトリに .secrets
というファイルを作成することで自動的に act
に読み込ませることもできる。また、./.secrets
以外のファイルを --secret-file
オプションで指定することも可能です。
今回は ./.secrets
を下記のように作成します。
GITHUB_TOKEN=...
GitHub Actions ワークフローをローカルマシンで実行する
準備が整ったので本題。下記のようなワークフローがあるとします。プルリクエスト時に単体テストを行う例です。
name: "Unit Test"
on:
- pull_request
jobs:
phpunit:
runs-on: ubuntu-latest
steps:
- name: Setup PHP with pecl extension
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
extensions: gd, json, pdo, redis
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 1
- name: Get composer cache directory
id: cache
run: |
echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Restore cache
uses: actions/cache@v2
with:
path: ${{ steps.cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-
- name: Install dependencies
run: composer install
- name: Run codeception
run: composer test:unit
act
ではトリガーを指定してワークフローを実行できますが、今回は複数定義されているワークフローのうち、上記の単体テストのみを実行してみます。
act pull_request -j phpunit -P ubuntu-latest=shivammathur/node:latest
act pull_request
トリガー pull_request
を指定してワークフローを実行します。トリガーを省略した場合は暗黙的に push
を指定したと見做されます。
-j phpunit
指定した名前の job のみを実行します。今回は単体テストであるジョブ phpunit
のみを実行するよう指定しています。
-P ubuntu-latest=shivammathur/node:latest
ワークフローで指定している実行環境 ubuntu-latest
に shivammathur/node:latest
を用いるよう指定しています。
これらのオプションは ./.actrc
や ~/.actrc
に書いておくことで省略することも可能です。詳しくは 公式の README を参照してください。
Discussion