🤖

GitHub Actions をローカルマシンで実行する(PHP 編)

2021/05/13に公開

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 を使ったワークフローを実行する」を達成するためには課題があります。

  1. Micro, もしくは Medium を選択すると shivammathur/setup-php が動作しない。
  2. 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-latestshivammathur/node:latest を用いるよう指定しています。

これらのオプションは ./.actrc~/.actrc に書いておくことで省略することも可能です。詳しくは 公式の README を参照してください。

Discussion