GitHub Actions のワークフローは、push してみるまで本当に動くかわからない。
構文を直しては push し、ログを眺めてはまた直す、という往復が地味につらい。
そんなときに使えるのが act 。.github/workflows/ の yml を読み、Docker コンテナ上で GitHub ランナーを再現してワークフローを実行してくれる。
push する前に、手元で挙動を確認できる。
目次
act とは
act は .github/workflows/ の yml を読み込み、Docker コンテナ上で GitHub ランナーを再現してワークフローを実行する CLI。
push せずに挙動を確認できる。
用途によって使い分けるとよい。
- 構文ミスのような静的なチェックだけなら
actionlintが軽量で速い - 実際にジョブを動かして挙動を見たいなら
act
準備
ローカルで Docker が動いていれば OK。
act が Docker API を叩いてコンテナを起動する。
1 | docker info # これが通れば動く |
初回実行時に使用イメージを聞かれる。
Medium (catthehacker/ubuntu:act-latest) が無難で、選択した結果は ~/.actrc に保存される。
Apple Silicon の設定
amd64 前提の action でコケることがあるので、~/.actrc に書いておくと安定する。
1 | --container-architecture linux/amd64 |
基本コマンド
1 | act -l # 実行されうるジョブ一覧(まずこれ) |
act [<event>] [options] という構造になっている。
イベントを指定しないと on: push 扱いになる点だけ覚えておけばよい。
act は「イベントを発火」するツール
act は cron の時刻を評価するのではなく、イベントを即座に発火させる。
定期ジョブ(on: schedule)を試したいときは、schedule イベントを指定する。
1 | act schedule # schedule トリガーを即実行 |
cron: '0 9 * * *'のような時刻指定は無視され、その場で即実行される- 時間が来るのを待つわけではない
-j に渡すのは「ジョブ ID」
-j で指定するのは jobs: 直下のキー(ID)であって、name: の表示名ではない。
1 | on: |
1 | act schedule -j nightly-build # OK |
シークレットと変数
secrets や vars を使うワークフローでは、値を明示的に渡す必要がある。
1 | act schedule --secret-file .secrets # KEY=value 形式のファイル |
secrets.GITHUB_TOKEN は自動では入らない。
必要なら、手元の gh から取得して渡すのが手軽だ。
1 | act schedule -s GITHUB_TOKEN=$(gh auth token) |
典型的な流れ
実際に試すときは、いきなり本実行せず段階を踏むと事故が少ない。
1 | act -l schedule # 1. 何が動くか確認 |
詰まりやすい点
ローカル実行は便利だが、GitHub 上の環境を完全に再現できるわけではない。
以下は実際にハマりやすいポイント。
- デフォルトイメージは軽量で、
dockerコマンドや一部ツールが入っていないことがある。フル再現は-P ubuntu-latest=catthehacker/ubuntu:full-latest(ただし重い) actions/cacheはローカルでは no-op になることがある- matrix は全組み合わせ走る。重ければ
--matrix key:valueで絞る windows-latest/macos-latestランナーは再現不可(Linux コンテナのみ)
所感
push してログを待つループから解放されるだけで、ワークフローを書く心理的なハードルがかなり下がる。
特に on: schedule のような「待たないと動かない」ものを即座に発火できるのは大きい。
完全再現ではないという前提さえ押さえておけば、CI を書くときの強力な相棒になる。