actでGitHub Actionsのworkflowをローカルで動作確認する

2024/11/15に公開

はじめに

actはGitHub Actionsのworkflowをローカルで動作させることができるツールです。
push、pull_requestなどの起動条件をコマンドで指定できるため、簡単に動作確認ができます。
今回はpytestを実行する簡易workflowを作ってactで実行してみます!

https://github.com/nektos/act

準備

今回はHomebrewを利用してインストールします。

brew install act

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

テストコード

今回は下記のサンプルを利用します。
pushされたときにsample_code1(足し算)、pull_requestされたときにsample_code2(引き算)のテストが実行されることを確認します。

ディレクトリ構成
ActSample/
├── .github/
│   └── workflows/
│       ├── test1.yml
│       └── test2.yml
├── sample_code1/
│   ├── sample1.py
│   └── test_sample1.py
└── sample_code2/
    ├── sample1.py
    └── test_sample2.py
workflows
test1.yml
name: test1

on:
  push:

jobs:
  pytest:
    runs-on: ubuntu-latest

    steps:
      # リポジトリをチェックアウト
      - name: Checkout repository
        uses: actions/checkout@v4

      # Pythonのバージョンを設定
      - name: Set up Python version
        uses: actions/setup-python@v4
        with:
          python-version: '3.12'

      # 仮想環境を設定し、pytestをインストール
      - name: Set up virtual environment
        working-directory: ./sample_code1
        run: |
          python -m venv venv
          source venv/bin/activate
          python -m pip install --upgrade pip
          pip install pytest==8.3.3

      # Pytestを実行
      - name: Run Pytest
        working-directory: ./sample_code1
        run: |
          source venv/bin/activate
          pytest test_sample1.py
test2.yml
name: test2

on:
  pull_request:

jobs:
  pytest:
    runs-on: ubuntu-latest

    steps:
      # リポジトリをチェックアウト
      - name: Checkout repository
        uses: actions/checkout@v4

      # Pythonのバージョンを設定
      - name: Set up Python version
        uses: actions/setup-python@v4
        with:
          python-version: '3.12'

      # 仮想環境を設定し、pytestをインストール
      - name: Set up virtual environment
        working-directory: ./sample_code2
        run: |
          python -m venv venv
          source venv/bin/activate
          python -m pip install --upgrade pip
          pip install pytest==8.3.3

      # Pytestを実行
      - name: Run Pytest
        working-directory: ./sample_code2
        run: |
          source venv/bin/activate
          pytest test_sample2.py
sample_code1
sample1.py
def addition(a, b):
    return a + b
test_sample1.py
import pytest
from sample1 import addition


@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),
    (0, 0, 0),
    (-1, 1, 0),
    (-1, -2, -3),
    (1, -1, 0)
])
def test_sample1(a, b, expected):
    assert addition(a, b) == expected
sample_code2
sample2.py
def subtraction(a, b):
    return a - b
test_sample2.py
import pytest
from sample2 import subtraction


@pytest.mark.parametrize("a, b, expected", [
    (2, 1, 1),
    (0, 0, 0),
    (1, -1, 2),
    (-1, -1, 0),
    (1, 1, 0)
])
def test_sample2(a, b, expected):
    assert subtraction(a, b) == expected

実行

actを実行してみます。

act

初回はランナーのサイズを聞かれるため、Mediumを選択します。
ランナーの詳細は下記を確認ください。
https://nektosact.com/usage/runners.html#runners

pushされた時のworkflowを実行してみます。
AppleシリコンのMacでない場合は、--container-architecture linux/amd64オプションは不要です。

act push --container-architecture linux/amd64

push時のworkflowに設定したsample_code1のテストが実行されています!

同じく、pull_requestのworkflowを確認してみます。

act pull_request --container-architecture linux/amd64



pull_requestのworkflowに設定したsample_code2のテストが実行されました!

各コマンドの詳細は下記を参照ください。
https://nektosact.com/usage/index.html

終わりに

今回はGihHub Actionsのworkflowをローカルで実行できるactを使ってみました。
workflowを追加や修正した際、コマンドだけで手軽に動作確認できるのが非常に便利でした!
GItuHub Actionsと全く同じ動作をするわけではないので、その点に注意は必要そうです。
https://nektosact.com/not_supported.html

レスキューナウテックブログ

Discussion