コマンド紹介シリーズ:act
今回はactを紹介します。actを利用することで、ローカル環境でGitHub Actionsのワークフローを動かすことができます。
なお、第12回は以下になりますので、ぜひご興味があればご覧ください。
actとは?
actはGitHub Actionsをローカルで動かすことを目的としたものとなります。GitHub Actionsを使ったことならわかると思いますが、動作テストをするためにはレポジトリにpushした後に実際にワークフローを動かす必要があります。検証用の内容などならまだいいですが、本番観光に影響するようなワークフローをテストできないままpushするのはとても怖いものです。そのような問題をできるだけ解消し、ローカルで動作チェックをすることができるのがactになります。
使ってみる!
インストール
インストール方法はこちらにまとまっているので、自分の環境に合った方法でインストールしてみてください。私はmacbookを使っているので、brew経由でインストールしました。
brew install act
Pythonコードの実装
今回は以下のように簡単な計算を行うコードを実装します。なお、以下のコードはclaude codeで生成させました!
def add(a: float, b: float) -> float:
return a + b
def subtract(a: float, b: float) -> float:
return a - b
def multiply(a: float, b: float) -> float:
return a * b
def divide(a: float, b: float) -> float:
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
def power(base: float, exponent: float) -> float:
return base ** exponent
また、以下のようにテストコードを実装しました。
import pytest
from src.calculator import add, subtract, multiply, divide, power
class TestCalculator:
def test_add(self):
assert add(2, 3) == 5
assert add(-1, 1) == 0
assert add(0, 0) == 0
assert add(2.5, 1.5) == 4.0
def test_subtract(self):
assert subtract(5, 3) == 2
assert subtract(0, 5) == -5
assert subtract(-3, -2) == -1
assert subtract(10.5, 0.5) == 10.0
def test_multiply(self):
assert multiply(3, 4) == 12
assert multiply(-2, 3) == -6
assert multiply(0, 100) == 0
assert multiply(2.5, 4) == 10.0
def test_divide(self):
assert divide(10, 2) == 5
assert divide(9, 3) == 3
assert divide(-10, 2) == -5
assert divide(10.0, 4.0) == 2.5
def test_divide_by_zero(self):
with pytest.raises(ValueError, match="Cannot divide by zero"):
divide(10, 0)
def test_power(self):
assert power(2, 3) == 8
assert power(5, 0) == 1
assert power(10, 2) == 100
assert power(2, -1) == 0.5
assert power(9, 0.5) == 3.0
試しにテストコードを実行すると、以下のように問題なく実行できることが確認できます。
uv run pytest test/
# 結果
============================= test session starts ==============================
platform darwin -- Python 3.12.9, pytest-8.4.1, pluggy-1.6.0
rootdir: /Users/user/Documents/act_test
configfile: pyproject.toml
plugins: cov-6.2.1
collected 6 items
tests/test_calculator.py ...... [100%]
============================== 6 passed in 0.01s ===============================
GitHub Actions向けワークフローの実装
次にGitHub Actionsのワークフローを作成します。今回作成したのは以下のようなワークフローになります。
name: Tests
on:
push:
branches: [ main, master ]
pull_request:
branches: [ main, master ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.12.9
uses: actions/setup-python@v5
with:
python-version: 3.12.9
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
version: "latest"
- name: Install dependencies
run: |
uv sync --all-extras --dev
- name: Run tests
run: |
uv run pytest tests/ -v
actの実行
actの使い方を紹介しながら使ってみます。
actでは実行するワークフローの一覧を取得することができます。以下のようにすることで現在のフォルダから実行できるワークフローを表示することができます。今回はワークフローはpushおよびPR作成時に実行するように設定していたので、Eventsの部分でその選択肢が表示されています。
act -l
# 結果
Stage Job ID Job name Workflow name Workflow file Events
0 test test Tests test.yml push,pull_request
次にワークフローを実行してみましょう。例えばpush実行時を想定してワークフローを動かすには以下のようにします(PRの場合はpushをpull_requestに置き換えてください)。
act push

Zennに載せれるデータ量の関係で高速になっていてわかりにくいですが、テストは問題なく実行できています。
なお、同じ内容をGitHub Actionsで動かすと以下のように全てのステップが成功しています。

ちなみに、macbookを使っているのですがact実行時にうまくいかない場合があり、その際以下のsiruku6さんの記事にある~/.actrcの設定をすることで動くようになりました。ぜひこちらのQiita記事も参考にしてください!
まとめ
今回はローカルでActionsの動作をチェックできるactを使ってみました。GitHub Actionsはプランにもよると思いますが実行回数のTierもあると思いますし、何よりワークフローのテストをするのに毎回レポジトリを更新する必要があるので、ローカルでテストできるactは重宝されるのかなと思います。ぜひ皆さんも使ってみてください。
Discussion