コマンド紹介シリーズ:act

に公開

今回はactを紹介します。actを利用することで、ローカル環境でGitHub Actionsのワークフローを動かすことができます。

なお、第12回は以下になりますので、ぜひご興味があればご覧ください。

https://zenn.dev/akasan/articles/0fafdc64b8ae1c

actとは?

actはGitHub Actionsをローカルで動かすことを目的としたものとなります。GitHub Actionsを使ったことならわかると思いますが、動作テストをするためにはレポジトリにpushした後に実際にワークフローを動かす必要があります。検証用の内容などならまだいいですが、本番観光に影響するようなワークフローをテストできないままpushするのはとても怖いものです。そのような問題をできるだけ解消し、ローカルで動作チェックをすることができるのがactになります。

https://github.com/nektos/act?tab=readme-ov-file

使ってみる!

インストール

インストール方法はこちらにまとまっているので、自分の環境に合った方法でインストールしてみてください。私はmacbookを使っているので、brew経由でインストールしました。

brew install act

https://nektosact.com/installation/index.html

Pythonコードの実装

今回は以下のように簡単な計算を行うコードを実装します。なお、以下のコードはclaude codeで生成させました!

src/calculator.py
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

また、以下のようにテストコードを実装しました。

tests/test_calculator.py
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のワークフローを作成します。今回作成したのは以下のようなワークフローになります。

.github/workflows/test.yaml
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記事も参考にしてください!

https://qiita.com/siruku6/items/3d4e0a9367f81642c247

まとめ

今回はローカルでActionsの動作をチェックできるactを使ってみました。GitHub Actionsはプランにもよると思いますが実行回数のTierもあると思いますし、何よりワークフローのテストをするのに毎回レポジトリを更新する必要があるので、ローカルでテストできるactは重宝されるのかなと思います。ぜひ皆さんも使ってみてください。

Discussion