ブログ


GitHub Actionsをローカルでテスト!「act」でワークフロー開発を効率化する方法

こんにちは、Rt.Sです!
最近では開発において、CI/CDの自動化ツールであるGitHub Actionsを使うことがほぼ標準になっています。しかし、ワークフローを編集して動作を確認するには、基本的にpushするかPRを作成して実行する必要があります。
開発をしていると、こんな経験ありませんか?
- 小さな修正のたびにpushしてCIを待つ…
- CIで失敗してしまい、修正してまたpush…
- ローカルでは動くのにCIで失敗する…
ちょっとした修正でも「push → CI実行を待つ」の繰り返しは手間がかかりますよね。
そこで今回は、ローカルで簡単に GitHub Actions のワークフローをデバッグできるツール「act」を紹介します。
目次
実行環境
- Apple M1 Macbook Air(macOS 15.5)
- Homebrew 4.5.13
- Docker version 28.3.2
- act version 0.2.79
- go1.24.5 darwin/arm64
act について
actとは?
nektos/actは、GitHub Actionsのワークフローをローカルで実行できるCLIツールです。
特徴としては、
.github/workflows
以下のワークフローを そのままローカルで実行可能- DockerコンテナでGitHub-hosted runner とほぼ同等の環境を再現
- イベント指定やジョブ単位の実行が可能
CI環境と近い条件でローカル実行できるので、デバッグ効率が大幅に向上します。
インストール方法
私は、Mac環境なので、Homebrewを使用してインストールします。
Mac (Homebrew)
brew install act
Linux
curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash
Windows (scoop)
scoop install act
インストールできたら以下のコマンドでバージョン確認
act --version
その他インストール方法はInstallationをご覧ください。
基本操作
基本的な使い方はUsage guideに詳しく載っています。
ここでは実際にデモを見ながら解説します。
デモ:Go言語の簡単なテストをローカルで実行してみる
今回は、プルリクエスト時にGitHub Actionsでテストを実行することを想定したGo言語プロジェクトを用意します。
最小構成の処理とテストをactで動かしてみましょう。
.
├── .git /
├── .github
│ └── workflows
│ └── test.yml
├── go.mod
├── main_test.go
└── main.go
Goコードとテストを用意
まず、ディレクトリを作成して移動します。
mkdir act-demo
cd act-demo
go.mod
Goのモジュールを初期化します。
go mod init act-demo
main.go
package main
func Add(a, b int) int {
return a + b
}
main_test.go
package main
import "testing"
func TestAdd(t *testing.T) {
if Add(2, 3) != 5 {
t.Errorf("expected 5 but got %d", Add(2, 3))
}
}
ワークフローを作成
.github/workflows/test.yml
を作成します。
(コードの詳細な説明は割愛します)
name: act demo Go Test
on:
push:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: 1.24.5
- name: Install dependencies
run: go mod tidy
- name: Test
run: go test ./...
gitリポジトリを初期化
actは、Gitのコンテキストがないと警告が出てしまうため、リポジトリを初期化しておきます。
git init
git add .
git commit -m "Initial commit"
actを実行
以下のコマンドを実行して、ワークフローを実行します。
Apple Silicon搭載のMacの場合、--container-architectureact
オプションを指定しないと使用するDockerイメージがamd64専用の場合に警告が出てしまいます。
# M1 Macでの実行例
act --container-architecture linux/amd64
テストが実行され、以下のようなログが出力されます。
| ok act-demo 0.027s
[act action demo/test] ✅ Success - Main Test [25.445749209s]
テストが実行され、成功したことが確認できます!
その他も各stepsの実行結果が確認できます。
失敗パターンを試してみる
main.go
をわざとバグらせます。
package main
func Add(a, b int) int {
return a + b + 1 // バグ
}
再度 act を実行すると、テストが失敗するのが確認できます。
| --- FAIL: TestAdd (0.00s)
| main_test.go:7: Add(2, 3) = 6; want 5
| FAIL
| FAIL act-demo 0.028s
| FAIL
[act action demo/test] ❌ Failure - Main Test [19.378577958s]
このように、失敗のデバッグもローカルですぐ試せるのがactの大きなメリットですね!
まとめ
今回はテストを想定してデモを行いましたが、その他、静的解析やDockerビルド、AWSデプロイの検証などもローカルで手軽に試すことができます。
- GitHub Actionsの動作確認にいちいちpushするのは手間
- actを使えばローカルでワークフローを実行可能
- DockerでCI環境を再現できるので、push前のデバッグに最適
actを導入するとワークフロー開発の試行回数を増やせるので、CI/CDの改善に取り組むならぜひ使ってみてください!
株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!