GitHub Actionsのワークフローをローカルで実行する
GitHub Actions、利用しておりますでしょうか。
簡単かつ高機能でいいですよね。
しかし、いいことばかりでもありません。
こういったことはないでしょうか。
- 実行がpushしたときなので、pushしないと動くかどうかわからない
- ローカルでのテストのために似たような docker-compose.yml を書くのが嫌
今回はそういうお困りごとを解決すべく、
Actionsのワークフローをローカルで実行する方法を紹介します。
なお、以下に紹介する方法はServicesが使えないなど完全な代替ではありません。技術選定の際にはお手元でのテストをお勧めします。
nektos/act
を使う
nektos/act
を使ってみましょう。
これは、
Run your GitHub Actions locally 🚀
とあるように、まさに今回求めていたものです。
導入する
お手持ちのパッケージ管理マネージャーから導入できます。
Mac(HomeBrew)であれば以下の通り。
brew install act
他の環境のインストール方法は公式のREADMEをご確認ください。
実行する
push時のワークフローを実行する方法は、
プロジェクトルートにて以下のコマンド一発で可能です。
act
Pull Request時など、他のタイミングで実行されるものは以下のコマンドです。
act pull_request
めちゃめちゃ簡単ですね。
注意点
actの挙動は、実際のActionsのそれと異なります。
顕著な点としては、 ubuntu-latest
イメージを指定した際、内部的に node:12.6-buster-slim
が使われるので、 make
や sudo
といった基本的なコマンドがないという点です。
本家の ubuntu-latest
らしいイメージを利用する方法もありますが、イメージが18GBもあります。そのため、act環境下のワークフローでは、必要なパッケージを個別にインストールするとよいでしょう。たとえば、こんな感じのstepを入れておきます。
# some package is not installed on nektos/act's ubuntu-latest
# (node:12.6-buster-slim)
- name: Install dependencies
run: |
apt update
apt install -yV build-essential
ただ、Actions側では sudo
がないと apt
が使えないため、このままだとactはよくてもActionsでコケます。ここでコマンドのインストール済みかどうかで条件分岐をすればいいのですが、シュっとかける方法が思いついた方は教えてくださると幸いです……。
まだできないこと、できるかわからないこと
- Servicesは使えません
- GitHub Pages周りが使えるのかはわかりません
- CodeQLが使えるのかはわかりません
まとめ
というわけで、GitHub Actionsのローカルでの実行方法もとい nektos/act
の紹介でした。
ただActionsをローカルで実行するだけでなく、
仮想環境上でテストを回す際の選択肢としてもよさそうです。
まだできないことも多いですが、めちゃめちゃ期待できるプロジェクトですね。
Discussion