Young Leaves

act を使いローカルPC 上でGitHub Actions のワークフローをテストする

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

実行環境

OS

Windows 11

前提条件

  • Docker Desktop のようなコンテナランタイムをローカルPC にインストールしていること

act とは

概要

nektos/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、リポジトリに関連付けられた変数、シークレットの使用も簡単にできる
  • カスタムコンテナイメージを使うことで、独自の実行環境でテストを行うこともできる