📚
actを使ってローカル環境でGitHub Actionsを実行する方法
背景
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