act について
actは、actionlintのチェック後にDockerでGitHub Actionsワークフローをローカル実行するスキルです。開発者がステージ済みのワークフローをスモークテストし、ワークフローの失敗と環境上の制約を区別します。実行結果によってコミットが止まることはありません。
主な機能
- 01Dockerでワークフローをローカル実行
- 02ステージ済みワークフローファイルの確認
- 03ワークフローと環境の失敗を区別
- 04CIのカバレッジ制限を明示
- 05コミットをブロックしない実行
活用シーン
- 01コミット前のワークフローのスモークテスト
- 02ワークフローステップの不具合特定
- 03不足するイメージや前提条件の報告
- 04ローカルで実行されたワークフローの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ petr-korobeinikov/ skills --skill actインストール後、Claude Code で/actを入力して読み込まれたか確認します。
詳細
act
act は GitHub Actions ワークフローに対する第 2 の防御線であり、 actionlint スキルの後段に位置します。 actionlint は静的なチェックで、ワークフローが構文的に正しく解析され、 式と型が妥当であることを検証します。 act は動的なチェックで、ワークフローを Docker 内でローカル実行し、 実際に動作するかを確認します。
ゲートではなく、提案として使ってください。 ステージングされたワークフローで actionlint のチェックが通ったら、 act で実行して実際の失敗がないか確認することを提案します。 ただし、act を理由にコミットをブロックしてはいけません。 ローカル実行ではすべてを網羅できず、 ローカル環境も不安定です。
迷ったら、オペレーターに確認してください
あいまいな点があれば、 特に、失敗がワークフローに起因するのか、 ローカル環境に起因するのかが不明な場合は、 推測せずにオペレーターに確認してください。 壊れたワークフローを問題ないと判断したり、 ローカルイメージがないだけの失敗をオペレーターに心配させたりするより、 質問するほうが手間はかかりません。 以下のすべての手順で、この方針を適用してください。
実行するタイミング
- ステージングされたワークフローファイルで actionlint のチェックが通った後 — 安価な静的チェックで却下されたワークフローに Docker を使わないでください。
- ワークフローを変更するすべてのコミットで提案してください。 必須ではありません。 実行を提案し、オペレーターが断った場合はスキップしてください — コミットはブロックされません。
前提条件
実行には、正常に動作する Docker と事前設定済みのイメージが必要です。 まず確認してください。いずれかが欠けている場合は、 オペレーターに伝えて実行をスキップし、コミットを続行してください — 前提条件を理由にブロックしてはいけません。
- Docker に接続できること —
docker infoが成功すること (Docker Desktop、colima、podman info経由の podman など、プロバイダーは問いません)。 バイナリがない場合やデーモンが停止している場合、act は実行できません。スキップしてください。 - デフォルトのランナーイメージが設定されていること。
act は初回実行時にイメージのサイズを対話形式で尋ねます。
TTY がないと
fatal EOFで終了するため、事前に設定しておく必要があります。 設定は act のactrc(macOS では~/.config/act/actrc、~/.actrc、 または~/Library/Application Support/act/actrc)にあります。 設定済みの場合は、-Pのデフォルト行があります。 設定されていない場合は、オペレーターに act を一度実行して Medium (約 500MB。Large は約 70GB、Micro は node のみ)を選ぶよう依頼してください — イメージを推測してはいけません。 実行時に初めて未設定だとわかった場合(fatal EOFが発生した場合)は、そこで停止して確認してください。 - ホストフラグ。
- Apple Silicon — 最初から追加します。
uname -m→arm64の場合 →--container-architecture linux/amd64。 - デーモンソケットのバインドマウント失敗(colima で発生例あり) —
初回実行で確認された場合に限り、その後で追加します。
--container-daemon-socket -。
- Apple Silicon — 最初から追加します。
手順
-
最初に、ステージ済みのワークフローが actionlint を通ることを確認します — actionlint スキル、または
actionlintの直接実行で確認します。 act は二番手であり、最初ではありません。 -
実行を提案します — 「ステージ済みのワークフローを act で実行して、実際に動作するか確認しますか?」とオペレーターに一行で尋ねます。 断られた場合 → スキップしてコミットを続行します(act が妨げることはありません)。
-
上記の前提条件に加えて、act がインストールされていることを確認します(
command -v act)。 act がインストールされていない場合は、インストールを別途依頼します —mise.tomlを編集するためです(下記参照)。実行の提案ではインストールの許可は得られていません。 前提条件が一つでも満たされていない場合 → オペレーターに伝え、スキップしてコミットを続行します。 -
ステージ済みのワークフローファイルに対して act を実行します — ステージ済みのワークフローファイルごとに
-Wを指定して実行します。 act が読み込むのはインデックスではなく作業ツリーなので、 まずファイルに未ステージの変更がないことを確認します (git diff -- <file>が空であること)。 変更がある場合は、実行前に再ステージします(git add)。mise exec -- act -W .github/workflows/<staged-file> [host-flags]- act がすでに
PATH上にない場合に限り、mise exec --を付けます。 [host-flags]= 前提条件3に該当するフラグ(アーキテクチャ/ソケット)。- act がイベント(
push、またはワークフローで唯一のイベント)を選択します。 必要に応じて<event>または-j <job>で絞り込みます。 - ジョブを事前に絞り込まないでください — 実行できないジョブは環境エラーとして表面化させます(手順5)。
- シークレット:
.secretsが存在する場合、act は自動的に読み込みます (または--secret-fileを渡します)。シークレットを捏造しないでください — シークレットがない場合は環境によるスキップであり、失敗ではありません。
- act がすでに
-
結果を読み取り、二種類の失敗を区別します。 act の終了コードでは区別できないためです。 ログのマーカーを確認します。
- 成功 — ジョブが
✅/Job succeededで終了: ワークフローがローカルで実際に実行されました(act が対応する範囲内)。 - ワークフロー自体の失敗 — 「Set up job」ではなく、ワークフローのステップが そのロジックによりゼロ以外のコードで終了した場合です。 内容を示して修正を提案しますが、コミットは妨げません。
- 環境/非対応による失敗 — 実行を開始できなかった場合です:
failed to start container、Error response from daemon、unable to find image、または macos/windows ランナー用のイメージがない、fatal ... EOF(イメージのプロンプト)、シークレット不足、OIDC、ソケット、アーキテクチャなど。 標準ツールのcommand not foundも該当します — ワークフローではなく Medium イメージにそのツールがないことがほとんどです。 イメージの内容は確認できないため、デフォルトでは環境の問題として扱い、 重要であればオペレーターに確認します。 これらは失敗ではなく、理由を添えて「ローカルでは未確認」と報告します。 - 判断できない場合 — オペレーターに確認します。
- 成功 — ジョブが
-
結果にかかわらず、act を理由にコミットを妨げてはいけません。 実行後(またはスキップ後)は、コミットを続行します。
act がない場合のインストール
mise でインストールします — Docker は別途必要な依存関係であり、
Docker なしでは act を実行できないことにも留意してください。
mise.toml の [tools] 配下に記述します。
[tools]
act = "<version>"
mise latest act で <version> を解決します
(すべてのバージョン:mise ls-remote act)。latest は使わず、完全なバージョンを固定します。
名前 act は aqua を通じて aqua:nektos/act に解決されます。
brew、go install、curl パイプのスクリプトは使わないでください。
その方法で act をインストールできない場合、または Docker が利用できない場合は、
オペレーターに伝えて実行をスキップします。
対応範囲を正直に伝える — act は CI ではありません
act の実行が成功しても、それはスモークテストであり、実際の CI が成功する証明ではありません。 act は macos/windows ランナー、OIDC、 環境および環境スコープのシークレットを実行しません。 また、同時実行制御、タイムアウト、continue-on-error、 ステップサマリー、アノテーションは無視します。 キャッシュとサービスへの対応も一部に限られます。 act は「ローカルで実行を開始できるか」を確認するものとして扱い、 正しい結果の基準は実際の CI とします。
対象外
- 実際の CI の置き換え(act はスモークテストです。上記の対応範囲を参照してください)。
- シークレット/認証情報の提供や捏造。
- ローカルでは動作しない実行の強制 — 無理に実行せず、その旨を報告します。
報告
実行後、どのワークフローまたはジョブが実行されたか、 それぞれの結果(成功/実際の失敗/理由付きのローカル未確認)、 およびいずれの場合もコミットは妨げられないことを伝えます。