📚

actを使ってローカル環境でGitHub Actionsを実行する方法

2023/01/15に公開

背景

GitHub Actionsは、GitHub上でのワークフローの自動化を行うためのツールです。
これまでは、GitHub上でのみ実行が可能でしたが、テストを行う際になかなか面倒ですね、最近ではローカル環境でも実行することができるようになりました。
この記事では、ローカル環境でGitHub Actionsを実行するためのツール、actについて紹介します。

actとは

actは、GitHub Actionsをローカル環境で実行するためのツールです。
actはGitHub Actionsのワークフローをローカル環境で実行するために必要な環境を構築し、ワークフローを実行することができます。

インストール

actをインストールするためには、下記のコマンドを実行します。

brew install act

前提条件

actを実行するためには、Dockerが必要です。
M1 Macの場合は、--container-architecture linux/amd64のオプションを付けて実行する必要があります。

使い方

# コマンドの構造:
act [<イベント>] [オプション]
イベント名が指定されない場合は、デフォルトで "on: push" になります
アクションが1つのイベントだけを処理する場合は、デフォルトでは "on: push" の代わりに使用されます

# すべてのイベントのすべてのアクションを一覧表示:
act -l

# 特定のイベントのアクションを一覧表示:
act workflow_dispatch -l

# 特定のジョブのアクションを一覧表示:
act -j test -l

# デフォルト(`push`)イベントを実行:
act

# 特定のイベントを実行:
act pull_request

# 特定のジョブを実行:
act -j test

# 特定のワークフローでジョブを実行(重複するジョブ名がある場合に便利)
act -j lint -W .github/workflows/checks.yml

# ドライランモードで実行:
act -n

# バーチャルログを有効にする(上記のすべてのコマンドで使用可能)
act -v

ローカルで実行してみる

テスト用のworkflowを作成する

サンプルyaml

name: GitHub Actions Demo
run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
on: [push]
jobs:
  Explore-GitHub-Actions:
    runs-on: ubuntu-latest
    steps:
      - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
      - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
      - run: echo "🍏 This job's status is ${{ job.status }}."

actで実行する

M1 Macを使っているので、--container-architecture linux/amd64のオプションを付けて実行します。

-> act --container-architecture linux/amd64

[GitHub Actions Demo/Explore-GitHub-Actions] 🚀  Start image=catthehacker/ubuntu:act-latest
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker pull image=catthehacker/ubuntu:act-latest platform=linux/amd64 username= forcePull=false
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker create image=catthehacker/ubuntu:act-latest platform=linux/amd64 entrypoint=["tail" "-f" "/dev/null"] cmd=[]
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker run image=catthehacker/ubuntu:act-latest platform=linux/amd64 entrypoint=["tail" "-f" "/dev/null"] cmd=[]
[GitHub Actions Demo/Explore-GitHub-Actions] ⭐ Run Main echo "🎉 The job was automatically triggered by a push event."
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/0] user= workdir=
| 🎉 The job was automatically triggered by a push event.
[GitHub Actions Demo/Explore-GitHub-Actions]   ✅  Success - Main echo "🎉 The job was automatically triggered by a push event."
[GitHub Actions Demo/Explore-GitHub-Actions] ⭐ Run Main echo "🐧 This job is now running on a Linux server hosted by GitHub!"
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/1] user= workdir=
| 🐧 This job is now running on a Linux server hosted by GitHub!
[GitHub Actions Demo/Explore-GitHub-Actions]   ✅  Success - Main echo "🐧 This job is now running on a Linux server hosted by GitHub!"
[GitHub Actions Demo/Explore-GitHub-Actions] ⭐ Run Main echo "🍏 This job's status is success."
[GitHub Actions Demo/Explore-GitHub-Actions]   🐳  docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/2] user= workdir=
| 🍏 This job's status is success.
[GitHub Actions Demo/Explore-GitHub-Actions]   ✅  Success - Main echo "🍏 This job's status is success."
[GitHub Actions Demo/Explore-GitHub-Actions] 🏁  Job succeeded

Discussion