GitHub Actionsのワークフローをローカルで実行する

公開:2020/10/06
更新:2020/10/06
2 min読了の目安(約1900字TECH技術記事

GitHub Actions、利用しておりますでしょうか。
簡単かつ高機能でいいですよね。

しかし、いいことばかりでもありません。
こういったことはないでしょうか。

  • 実行がpushしたときなので、pushしないと動くかどうかわからない
  • ローカルでのテストのために似たような docker-compose.yml を書くのが嫌

今回はそういうお困りごとを解決すべく、
Actionsのワークフローをローカルで実行する方法を紹介します。

なお、以下に紹介する方法はServicesが使えないなど完全な代替ではありません。技術選定の際にはお手元でのテストをお勧めします。

nektos/act を使う

nektos/act を使ってみましょう。
これは、

Run your GitHub Actions locally 🚀

act/README.md at master · nektos/act

とあるように、まさに今回求めていたものです。

導入する

お手持ちのパッケージ管理マネージャーから導入できます。
Mac(HomeBrew)であれば以下の通り。

brew install act

他の環境のインストール方法は公式のREADMEをご確認ください。

実行する

push時のワークフローを実行する方法は、
プロジェクトルートにて以下のコマンド一発で可能です。

act

Pull Request時など、他のタイミングで実行されるものは以下のコマンドです。

act pull_request

めちゃめちゃ簡単ですね。

注意点

actの挙動は、実際のActionsのそれと異なります。
顕著な点としては、 ubuntu-latest イメージを指定した際、内部的に node:12.6-buster-slim が使われるので、 makesudo といった基本的なコマンドがないという点です。

本家の 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でコケます。ここでコマンドのインストール済みかどうかで条件分岐をすればいいのですが、シュっとかける方法が思いついた方は教えてくださると幸いです……。

まだできないこと、できるかわからないこと

まとめ

というわけで、GitHub Actionsのローカルでの実行方法もとい nektos/act の紹介でした。

ただActionsをローカルで実行するだけでなく、
仮想環境上でテストを回す際の選択肢としてもよさそうです。

まだできないことも多いですが、めちゃめちゃ期待できるプロジェクトですね。

参考文献