私,山崎 進はプログラミング言語Elixir(エリクサー)向けのOSSであるPelemay Backend(ペレメイ・バックエンド)という機械学習基盤を開発しております.本記事では,Pelemay Backend向けに構築したGitHub Actionsによる自動テスト事例について,2023年12月現在の状況を紹介したいと思います.
Pelemay Backendのレポジトリ
2023年12月現在のPelemay Backendのブランチ構成
- main
- check_by_SHR
運用としては次のようにします.
- Issueごとに新しくブランチを作成して作業する
- 1が出来上がったら,
check_by_SHRにPRを送って,GitHub-hosted Runnerによるチェック(Ubuntu)を受ける. - 2のチェックをクリアしたら,マージし,
mainにPRを作成し,コード差分を読む.ライブラリの更新があった時には,Changelogを読む.脆弱性の確認と,機種依存のコードの有無を確認する.特に機種依存のコードがある場合には熟読して精査する. - 3に問題がなければ,PRを送って,Self-hosted Runnerによるチェックを受ける.2023年12月現在は次のSelf-hosted Runnerが存在する
- macOS Sonoma 14.2.1 / x86_64
- macOS Sonoma 14.2.1 / Apple Silicon
- 4のチェックをクリアしたらマージする.
2023年12月現在のPelemay Backendのディレクトリ構成
CIの対象になっているところのみ
-
utilities-
node_activator- A module to activate VM nodes.
- https://hex.pm/packages/node_activator
-
spawn_co_elixir- SpawnCoElixir spawns cooperative Elixir nodes that are supervised.
- https://hex.pm/packages/spawn_co_elixir
- Depends on
node_activator
-
http_downloader- Downloads remote file with progress bar.
- https://hex.pm/packages/http_downloader
-
-
benchmarks-
onnx_to_axon_bench- A benchmark program of loading ONNX to Axon.
- Depends on
http_downloader
-
distributed_computing_bench(WIP)- Depends on
spawn_co_elixirandhttp_downloader
- Depends on
-
-
.github-
dependabot.yml- Dependabotの設定.下記の更新をチェックする
- GitHub Actions
- Hex
- Dependabotの設定.下記の更新をチェックする
-
workflows-
ci_node_activator.yml-
utilities/node_activatorに更新があった時に実行するワークフロー -
node_activatorと,node_activatorに依存する下記のモジュールのテストを行うspawn_co_elixirdistributed_computing_bench
-
-
ci_spawn_co_elixir.yml-
utilities/spawn_co_elixirに更新があった時に実行するワークフロー -
spawn_co_elixirと,spawn_co_elixirに依存する下記のモジュールのテストを行うdistributed_computing_bench
-
-
ci_http_downloader.yml-
utilities/http_downloaderに更新があった時に実行するワークフロー -
http_downloaderと,http_downloaderに依存する下記のモジュールのテストを行うonnx_to_axon_benchdistributed_computing_bench
-
-
ci_onnx_to_axon_bench.yml-
benchmarks/onnx_to_axon_benchに更新があった時に実行する -
onnx_to_axon_benchのテストを行う
-
-
ci_distributed_computing_bench.yml-
benchmarks/distributed_computing_benchに更新があった時に実行するワークフロー -
distributed_computing_benchのテストを行う
-
-
reusable_ci.yml- 下記の引数を伴って呼び出されるGitHub-hosted runnerのワークフロー(詳細)
working_directoryos-
matrix- 下記を与える
otp-versionelixir-version
- 下記を与える
-
perform-check-
trueの時は,下記を行うmix compile --warnings-as-errorsmix format --check-formattedmix credomix dialyzer
-
falseの時は下記を行うmix test
-
- 下記の引数を伴って呼び出されるGitHub-hosted runnerのワークフロー(詳細)
-
dependabot_auto_merge.yml- Dependabotを実行しているとき,再利用可能ワークフローをテストしてパスした後,次のいずれかの条件の時には,自動でマージする
- パッケージシステムが
hexで,パッチバージョンのみの変更だった場合 - パッケージシステムがGitHub Actions
- パッケージシステムが
- Dependabotを実行しているとき,再利用可能ワークフローをテストしてパスした後,次のいずれかの条件の時には,自動でマージする
-
reusable_ci_with_working_directory.yml- 下記の引数を伴って呼び出されるGitHub-hosted runnerのワークフロー(詳細)
os-
matrix- 下記を与える
otp-versionelixir-versionworking_directory
- 下記を与える
-
perform-check-
trueの時は,下記を行うmix compile --warnings-as-errorsmix format --check-formattedmix credomix dialyzer
-
falseの時は下記を行うmix test
-
- 下記の引数を伴って呼び出されるGitHub-hosted runnerのワークフロー(詳細)
-
ci_self_hosted_macos.yml- macOS向けSelf-hosted Runnerのワークフロー
- テストのみを行う
-
reusable_ci_for_self_hosted_runner_macos.yml- 下記の引数を伴って呼び出されるmacOSのSelf-hosted runnerのワークフロー
-
matrix- 下記を与える
otp-versionelixir-versionworking_directory
- 下記を与える
-
arch- 下記のいずれかを与える
X64ARM64
- 下記のいずれかを与える
-
- 下記の引数を伴って呼び出されるmacOSのSelf-hosted runnerのワークフロー
-
-
actions-
matrix_check.yml- チェック用のマトリクス
- 単一Elixir/Erlang環境
-
matrix_test.yml- テスト用の環境
- Elixir/Erlangのサポート環境を網羅
-
matrix_reduced_test_1.yml- 回帰テスト用の環境
- 組み合わせを削減
-
matrix_reduced_test_2.ymlと合わせることで,Elixir/Erlangのサポート環境を網羅
-
matrix_reduced_test_2.yml- 回帰テスト用の環境
- 組み合わせを削減
-
matrix_reduced_test_1.ymlと合わせることで,Elixir/Erlangのサポート環境を網羅
-
matrix_dependabot.yml- Dependabot Automerge用のマトリクス
-
working-directoryがついている - 今のところ単一Elixir/Erlang環境
-
matrix_for_self_hosted_macos.yml- Self-hosted Runner用の環境
-
working-directoryがついている - 今のところ単一Erlang環境/複数Elixir環境
-
-
再利用可能ワークフロー
次の手順を実行する
- チェックアウト
-
kenchan0130/actions-system-infoによるシステム情報の取得 - OTPのメジャーバージョンとマイナーバーションの取得
- ElixirとErlangのバージョンの設定
-
erlef/setup-beamによるElixirのセットアップ - 5が失敗した時
-
asdfインストール -
asdfキャッシュからの復旧 - 2が失敗した時に
asdfによる設定
-
- dependenciesキャッシュからの復旧
- 7が失敗した時に次を実行
mix local.hexmix local.rebarmix deps.get
-
perform-checkがtrueの時に次の手順を実行mix compile --warnings-as-errorsmix format --check-formattedmix credo-
dialyzerキャッシュ復旧 mix dialyzer
-
perform-checkがfalseの時に次の手順を実行mix test
今まで山崎進が書いたGitHub Actions関連のQiita記事
謝辞
本研究の一部は,北九州産業学術推進機構(FAIS)旭興産グループ研究支援プログラムの支援を受けた.