act を使いローカルPC 上でGitHub Actions のワークフローをテストする
GitHub Actions ワークフローの動作確認を行うとき、環境構築やGitHub ホストの実行時間が課題になることがあります。今回はローカルPC 上でGitHub Actions のワークフローを実行できるツール・act を使い、お手軽にGitHub Actions のワークフローをテストする方法を説明します。

実行環境
OS | Windows 11 |
---|
前提条件
- Docker Desktop のようなコンテナランタイムをローカルPC にインストールしていること
act とは
概要
act はローカルPC 上でGitHub Actions のワークフローを検証できるGo 言語で実装されたツールです。現在はCasey Lee という方が保守を行っています。GitHub Actions のワークフローを検証する時、以下のような課題が発生します。
- ワークフローのトリガーによって毎回Push やPull Request を作成しないといけない
- GitHub hosted runner でワークフローの検証、テストを多く行うことによる料金の発生 (従量課金)
- Self hosted runner のような環境で多くのユーザーがテストを行うことによる実行環境の専有
ローカルPC 上でact を使うことにより、これらの課題を解決すると共にワークフローのエラーや問題を早期に発見できます。そのため、ワークフローの品質、開発効率の向上に繋げることができます。ただし、act にはサポートされていないGitHub Actions の機能もあるため注意が必要です。
https://nektosact.com/not_supported.html
act はGitHub リポジトリのREADME だけでなくユーザーガイドも提供されています。
https://nektosact.com/introduction.html
実行環境
act で利用するRunner は指定されたコンテナイメージを利用します。利用するコンテナイメージは以下で確認できます。
https://nektosact.com/usage/runners.html
Windows OS やmacOS ではDocker を利用せずホストの実行環境を直接利用することもできます。また、act はCLI コマンドのオプションを設定することで、カスタムGitHub Enterprise Server を利用できます。
act はカスタムDocker エンジンに対応しており、設定によってPodman やSSH 経由のリモートDocker エンジンの実行にも対応しています。
https://nektosact.com/usage/custom_engine.html
act のインストール方法
act は以下のパッケージマネージャーまたは拡張機能でインストールできます。ローカルPC 上にGo のランタイムがインストールされている場合はソースコードをビルドしてインストールもできます。
- Arch
- Chocolatey
- COPR
- GitHub CLI
- Homebrew
- MacPorts
- Nix
- Scoop
- WinGet
今回はWinGet を使いact をインストールします。ターミナルを開き以下のコマンドを実行します。act のバージョン確認を行い、インストールしたバージョンが表示されることを確認します。
# WinGetをインストールする
winget install nektos.act
# WinGetのインストール確認を行う
act --version
基本的なact のコマンド
act はact コマンドを実行するとローカル上でテスト用のDocker イメージを起動し、現在のフォルダを起点にしたワークフローのテストを実行します。Windows OS の場合、パブリックネットワークへの接続を求めるポップアップが表示されることがあるため、「はい」を選択して許可します。
# ./.github/workflows配下にあるワークフローを実行する
# 実行するとLarge、Medium、Microと実行するサイズを確認するため任意のサイズを選択する
act
echo で文字列を出力するだけのワークフローをテストすると以下のような実行結果が出力されます。
[Echo sample/echo] ⭐ Run Set up job
[Echo sample/echo] 🚀 Start image=node:16-buster-slim
[Echo sample/echo] 🐳 docker pull image=node:16-buster-slim platform= username= forcePull=true
[Echo sample/echo] using DockerAuthConfig authentication for docker pull
[Echo sample/echo] 🐳 docker create image=node:16-buster-slim platform= entrypoint=["tail" "-f" "/dev/null"] cmd=[] network="host"
[Echo sample/echo] 🐳 docker run image=node:16-buster-slim platform= entrypoint=["tail" "-f" "/dev/null"] cmd=[] network="host"
[Echo sample/echo] 🐳 docker exec cmd=[node --no-warnings -e console.log(process.execPath)] user= workdir=
[Echo sample/echo] ✅ Success - Set up job
[Echo sample/echo] unable to get git ref: reference not found
[Echo sample/echo] unable to get git revision: reference not found
[Echo sample/echo] unable to get git ref: reference not found
[Echo sample/echo] unable to get git revision: reference not found
[Echo sample/echo] unable to get git ref: reference not found
[Echo sample/echo] unable to get git revision: reference not found
[Echo sample/echo] unable to get git ref: reference not found
[Echo sample/echo] unable to get git revision: reference not found
[Echo sample/echo] unable to get git ref: reference not found
[Echo sample/echo] unable to get git revision: reference not found
[Echo sample/echo] unable to get git ref: reference not found
[Echo sample/echo] unable to get git revision: reference not found
[Echo sample/echo] ⭐ Run Main Echo message
[Echo sample/echo] unable to get git ref: reference not found
[Echo sample/echo] unable to get git revision: reference not found
[Echo sample/echo] unable to get git ref: reference not found
[Echo sample/echo] unable to get git revision: reference not found
[Echo sample/echo] unable to get git ref: reference not found
[Echo sample/echo] unable to get git revision: reference not found
[Echo sample/echo] unable to get git ref: reference not found
[Echo sample/echo] unable to get git revision: reference not found
[Echo sample/echo] 🐳 docker exec cmd=[bash -e /var/run/act/workflow/0] user= workdir=
| This is a test workflow!!
[Echo sample/echo] ✅ Success - Main Echo message [82.9863ms]
[Echo sample/echo] ⭐ Run Complete job
[Echo sample/echo] Cleaning up container for job echo
[Echo sample/echo] unable to get git ref: reference not found
[Echo sample/echo] unable to get git revision: reference not found
[Echo sample/echo] ✅ Success - Complete job
[Echo sample/echo] 🏁 Job succeeded
ワークフローのジョブ一覧を表示する
.github/workflows 配下のワークフローのジョブを確認するには -l (--list) オプションを実行します。
# ワークフローの一覧を表示する
act -l
実行するとワークフロー内のジョブ一覧やトリガーを確認できます。
Stage Job ID Job name Workflow name Workflow file Events
0 echo echo Echo sample echo.yml pull_request
0 test-job1 test-job1 test workflow test.yaml workflow_dispatch
1 test1 test1 Echo sample echo.yml pull_request
2 test2 test2 Echo sample echo.yml pull_request
特定のワークフロー、ジョブを指定して実行する
act はデフォルトでワークフロー内の全てのジョブを実行します。また、.github/workflows 配下に複数のワークフローファイルが存在する場合はエラーとなるためフィルターのオプションが必要です。特定のワークフローを指定して実行したい場合は -W オプションを使用します。
# 特定のワークフローファイルを指定してワークフローを実行する
act -W .github/workflows/<実行したいワークフローファイル>
複数のワークフローファイルを配置している、ワークフロー内に再利用可能なワークフローを含むような場合、ワークフロー指定のオプションが無いとエラーになるため注意が必要です。
特定のジョブのみ実行したい場合は -j オプションを使用します。
# 特定のジョブを指定してワークフローを実行する
act -W .github/workflows/<実行するワークフローファイル名> -j <実行するジョブID>
特定のイベントを指定してワークフローを実行する
特定のイベントに関するワークフローを実行する場合は act コマンドの後にイベントを指定します。例えばPull Request をトリガーとするワークフローを実行したい場合は以下コマンドを実行します。
# 特定のイベントを指定してワークフローを実行する
act pull_request
act ではJSON 形式のイベントファイルを実行時に指定することで、GitHub の詳細なイベントを指定できます。イベントファイルはWebhook のイベントとペイロードの形式で指定します。ワークフローによって、特定のイベントで条件分岐を行うジョブ、ステップがある場合にこの方法を利用できます。例えば、特定のブランチに対してPull Request をOpen する場合は以下のようなイベントファイルを作成します。
{
"pull_request": {
"number": 42,
"state": "open",
"title": "Add new feature",
"body": "This PR adds a new feature.",
"head": {
"ref": "test",
"sha": "abc123def456"
},
"base": {
"ref": "main",
"sha": "789ghi012jkl"
}
},
"repository": {
"full_name": "Organization/acttest",
"name": "acttest",
"owner": {
"login": "Organization"
}
},
"action": "opened"
}
イベントファイル作成後は -e オプションでイベントファイルを指定して実行します。
# イベントファイルを指定してactを実行する
act -W .github/workflows/test.yaml -e .github/workflows/event.json
イベントファイルはトリガー以外にもジョブやステップのスキップにも利用できます。act ではワークフロー内にカスタムイベントを設定できるため、条件分岐を確認したいようなケースに有効です。例えば、act というカスタムイベントを指定しジョブをスキップするには以下のように指定します。
on: push
jobs:
deploy:
if: ${{ !github.event.act }} # skip during local actions testing
runs-on: ubuntu-latest
steps:
- run: exit 0
{
"act": true
}
また、act はワークフロー実行時に環境変数・ACT を作成します。この環境変数を利用することで意図的にジョブをスキップできます。特にTeams やSlack のような通知、バージョンの更新のようなテスト時に実行したくない処理をスキップするケースで有効です。
- name: Notify Slack channel
if: ${{ !env.ACT }}
run: |
<Slackチャネルに通知する処理>
workflow_dispatch のinput を指定する
act でworkflow_dispatch 時のinput 値を設定する場合、コマンドで渡す方法とイベントファイルを作成しファイルを指定して実行する方法があります。コマンドでinput 値を指定するには以下のようになります。
# input値を指定してワークフローを実行する
# 複数の変数を指定する場合は--inputを複数使用する
act -W .github/workflows/echo.yml --input environment=dev
input はイベントファイルを使い指定もできます。input の値が多い場合にはファイル指定を行うことで簡単にテストできます。以下のイベントファイルではworkflow_dispatch のワークフローでenvironment にdev、ref にmain の値が指定されることになります。
{
"inputs": {
"environment": "dev",
"ref": "main"
}
}
作成後にオプションを指定すればinput の値を指定してワークフローが実行されます。
# inputを指定してワークフローを実行する
act -W .github/workflows/test.yaml -e .github/workflows/event.json
特定のマトリクスのみ実行する
act ではジョブ内にあるマトリクスに対し、特定のケースのみ検証することができます。例えば以下のワークフローに対し、--matrix オプションで実行したい変数、値を指定することで、その組み合わせのジョブのみ実行できます。
name: matrix-with-user-inclusions
on: push
jobs:
build:
name: Matrix
runs-on: ubuntu-latest
steps:
- run: echo ${NODE_VERSION}
env:
NODE_VERSION: ${{ matrix.node }}
strategy:
matrix:
os: [ubuntu-20.04, ubuntu-22.04]
node: [16, 18, 20]
include:
- os: ubuntu-20.04
node: 16
# 特定のマトリクスのみ指定しワークフローを実行する
# この場合os:ubuntu-20.04とnode:18のケースのみ実行される
act -W .github/workflows/matrix.yml --matrix os:ubuntu-20.04 --matrix node:18
変数、シークレットの指定
GitHub Actions のワークフローでは組織やリポジトリに関連付けられた変数やシークレットを使用するケースがあります。act で変数、シークレットを使用するには、コマンド実行時にオプションで指定する方法と env ファイルを指定して実行する方法があります。コマンド実行時に変数、シークレットを実行する場合は以下のようなコマンドとなります。
# コマンド実行時に変数を指定し実行する
# 複数の変数を指定する場合は--varを複数使用する
act -W .github/workflows/echo.yml --var SAMPLE_ENV=testvalue
# コマンド実行時にシークレットを指定する
# 複数の変数を指定する場合は-sを複数使用する
act -W .github/workflows/echo.yml -s SAMPLE_SECRET=********
変数、シークレットは .env 形式のファイルを使い指定もできます。複数の変数やシークレットを指定したい場合はファイル形式で行うと簡単にできます。例えば変数をいくつか指定する場合は以下のようなファイルを作成します。シークレットを複数指定したい場合も以下の形式で指定できます。
SAMPLE_ENV=hello
ANOTHER_ENV=world
変数のファイルを作成後、変数は --var-file オプション、シークレットは --secret-file オプションで指定します。
# 変数のファイルを指定してワークフローを実行する
act -W .github/workflows/echo.yml --var-file .github/workflows/.vars
# シークレットのファイルを指定してワークフローを実行する
act -W .github/workflows/echo.yml --secret-file .github/workflows/.secrets
GitHub CLI がインストールされている環境であれば、ah auth token コマンドを使用してGITHUB_TOKEN をシークレットとして渡すこともできます。
# GITHUB_TOKENをシークレットで渡しワークフローを実行する
act -s GITHUB_TOKEN="$(gh auth token)"
ワークフロー内のジョブをグラフで視覚化する
act ではワークフローの実行順を簡易的なグラフで視覚化できます。以下の例はneeds を使ったジョブの関係を表示しています。
# ワークフロー内のジョブをグラフ化する
act -g
time="2025-10-10T23:50:37+09:00" level=info msg="Using docker host 'npipe:////./pipe/docker_engine', and daemon socket 'npipe:////./pipe/docker_engine'"
╭──────╮
│ echo │
╰──────╯
⬇
╭───────╮
│ test1 │
╰───────╯
⬇
╭───────╮
│ test2 │
╰───────╯
act のhelp コマンド
今回は全てのオプションやコマンドを記述しませんが、細かいコマンド、オプションを調べたい時は act -h でhelp が表示されるため、オプションの指定で悩んだときは利用してみてください。
# actのhelpを表示する
act -h
act の設定ファイル
act では .actrc ファイルをroot ディレクトリに作成することで、コマンドの引数を事前に設定できます。例えばコンテナイメージのアーキテクチャを linux/amd64 に指定したい場合は .actrc ファイルに以下のような記述をします。
--container-architecture=linux/amd64
.actrc は複数追加でき、act 実行時にファイルで指定したコマンドが自動的に追加されます。事前に指定しておきたいオプションが複数ある場合、このファイルに指定することで毎回オプションを指定する必要が無くなります。
実行するRunner のイメージを変更する
act はGitHub Actions のワークフローテスト時に使用するコンテナイメージを指定できます。例えば ubuntu-latest で利用するact のOS をUbuntu 24.04 にする場合は以下のコマンドを実行します。
# actで実行するubuntu-latestをUbuntu 24.04にして実行する
act -P ubuntu-latest=catthehacker/ubuntu:act-24.04
ローカルPC 上にあるコンテナイメージを使いact を実行したい場合はイメージのPull を無効化するかオフラインモードに設定します。この設定を行うことでローカルPC 上にあるコンテナイメージを使用します。
# コンテナイメージのPullを無効化する
act --pull=false
# オフラインモードを設定する
act --action-offline-mode
Visual Studio Code 拡張機能
act はVisual Studio Code の拡張機能でも利用できます。Visual Studio Code の拡張機能で利用する場合、GUI 操作でワークフローの実行を行うことができます。
https://sanjulaganepola.github.io/github-local-actions-docs/
まとめ
- act はローカルPC 上でGitHub Actions のワークフローをテストできるツール。GitHub Actions でテストを行うときの一部課題を解消できる
- act の利用にはDocker Desktop のようなコンテナランタイムが必要となる
- イベントファイルや変数、シークレット用のファイルを準備することで、GitHub 上のイベントやOrganization、リポジトリに関連付けられた変数、シークレットの使用も簡単にできる
- カスタムコンテナイメージを使うことで、独自の実行環境でテストを行うこともできる