ローカルPC内でGithub Actionsを実行する – ‘nekos/act’
はじめに
Github Actions の設定ファイルを記述した後、正しく動作するかを確認するために毎回リモートリポジトリにプッシュするのが面倒だなと思ったので良い方法が無いかと調べてみました。
すると、ローカルで Github Actions の実行が可能なツールが見つかったので、検証してみました。
検証環境
見つけたツール : nektos/act
利用するツールは以下になります。
概要を見る限りは自分の目的にフィットしています。
nektos/act
ってどんなツール?
Github Actions をローカルで実行するためのツールとのことです。
このツールを導入するメリットは以下となります。
.github/workflows
ディレクトリ配下に設定ファイルを作成、変更した後、 commit/push しなくてもテストできるため開発効率が上がるMakefile
でタスクを管理することもできますが、.github/worflows
とタスクが重複し DRY ではなくなります。
ローカルで実行できればMakefile
が不要となります。- (この点については、 Github Actions から
make
を呼ぶことで回避できると思いますが公式ページのメリットとして書かれていました )
- (この点については、 Github Actions から
nektos/act
って何をしてくれるに?
act
コマンドが提供されます。
act
コマンドを実行すると、 .github/workflows/
ディレクトリから設定ファイルを読み込み、実行すべきアクションのセットを決定します。
実行されるアクションを決定するためには「イベント」 ( push
、branch
作成など ) を指定しなければいけませんが、明示しなければ push
イベントが発生したものとして解釈されます。
ワークフローファイルで定義されているように、Docker API を使用して必要なイメージをプルまたはビルドし、定義された依存関係に基づいて実行パスを最終的に決定します。
インストール
macOS なら、 Homebrew を使うのが最もかんたんです。
上記以外の環境の場合は、公式ページを参照するのが良いでしょう。
少し変わったインストール方法として、 Github CLI の拡張としてインストールする方法もあります。
試してみる前に ( .github/workflow/
内の設定ファイルの用意 )
自分で Github Actions の学習のために作成した Public リポジトリで試してみることにしました。
まずはリポジトリを用意し、移動します。
初回実行時の挙動
act
コマンドを初めて実行すると、デフォルトイメージとしてどのイメージを利用するかを問われます。
ここで選択した結果は ~/.actrc
ファイルに保存され、以降はこのファイルの設定が参照されます。
あまり読んでもわからなかったのですが、 Large だと 20GB と随分巨大なイメージを使うことに加えて、 「only ubuntu-18.04 platform」と書かれていたため、 Medium を選択することにしました。
すべてのジョブを一覧表示 : act --list
act --list
を実行すると、設定されているすべてのジョブの一覧が表示されます。
Apple M1 チップの PC ではワーニングが出ます。
メッセージの通り --container-architecture linux/amd64
オプションを指定することでワーニングを抑制できます。
以下の alias 設定をしておくのが良さそうです。
ワークフローを実行 : act --workflows <YAML>
--workflows
オプションと YAML 設定ファイルを指定して、ワークフローを実行することができます。
以下のような YAML ファイルを指定し実行してみます。
実行結果、 hello true
と hello develop
という文言が出力されました。
とりあえず動いた模様です。
今度はもう少しだけ複雑なワークフローを実行してみます。
実行した結果、 Go 実行環境のセットアップと実行が成功しました。
たです、実行してみてわかるのですがだいぶ遅いです。
既存の Go Docker イメージを拝借するようにしたほうが早いと思いました。
Dry Run : act --dryrun
設定ファイルの検証を行うだけなら、Dry Run で十分でしょう。
特に artifacts に成果物をアップロードするような処理を記述していたり、Github インフラ特有の機能を利用していたりすると、ローカルでは当然動かないわけで、そういうときには --dryrun
だけは通しておくと安心できます。
実行時に環境変数を渡す : --env
act
コマンド実行時に --env
オプションで環境変数を指定できます。
あるいは、 .env
ファイルが存在している場合はこちらから環境変数が充当されます。
イベント情報の取得
github.
プレイックスで始まるイベント情報も取得できます。
ひとこと
シークレットを利用する事もできそうですし、もう少し使ってみたいと思います。
ディスカッション
コメント一覧
まだ、コメントがありません