GitHub Actions Self-hosted runnerをお手軽にスケールさせる ghalet
tl;dr: 単一のGoデーモンで、GitHub ActionsのSelf-hosted runnerをお手軽にスケールさせられるOSSを作ったのでぜひご利用下さい。ご自宅のMac mini等でも使えます。
GitHub ActionsのSelf-hosted runner
GitHub Actionsは標準で提供されているGitHub-hosted runner上でワークフローを実行できるため、ほとんどのケースではそれで十分です。
その他に、Self-hosted runnerというワークフローを自前の環境で実行できる機能もあります。手順に従えばすぐに利用を開始でき、外部IPを持たない社内ネットワーク内のマシン等にも簡単にセットアップできます。
Self-hosted runnerは今のところは無料ですが、とても便利ですし、今後もその保証はありません。実際、昨年末に価格改定の計画が発表されたものの、Self-hosted runnerに関してはその後延期のアナウンスが出された、ということがありました。
Self-hosted runnerのスケールの課題とghalet
Self-hosted runnerは便利ですが、標準のセットアップでは単一のランナーがホストに常駐する方式のため、同時に複数のジョブを実行できません。それで困らないケースも多いでしょうが、少しCI/CDの規模が大きくなってくると、オンデマンドにrunnerを起動し、同時に複数ジョブを実行したくなってきます。
そこで公式が提供しているのが、Actions Runner Controller (ARC) で、これはk8s上でSelf-hosted runnerをスケールさせるコントローラーです。CI/CD環境にはスケーラビリティが求められるので、k8s上でのスケール手段を提供するのは理にかなっています。
ただ、単一ホスト上だけで動かすことを前提とした、もう少し単純なSelf-hosted runnerコントローラーが欲しくなり、ghalet というものを作りました。これは単一のGoデーモンであり、外部コンポーネントに依存せず、設定ファイルを書けばすぐに動きます。
ghaletは内部的には、少し前にARCから切り出されたScale Set APIクライアントである actions/scaleset というGoライブラリを利用してスケール管理を行っています。
ghaletの割り切り
ghaletは単一ホスト上で複数のrunnerをスケールさせるものです。また、runnerは単なるOSプロセスとして起動し、コンテナや軽量VMなどでの隔離は行いません。
そのため、ghalet自体を専用のマシンやVM上で動かすことを想定しています。また、runnerの実行ユーザーを、ghaletのそれとは別に設定できるため、そこでも権限を分離できます。
CI/CD環境という特性上、コンピューティングを提供するだけで状態を持たなくて良いため、何かおかしくなったら単に破棄して作り直せば良いという割り切りで、再構築もしやすくなっています。
私は、自宅のMac mini上に、Lima でVMを立て、その中でghaletを動かしています。GitHub Releases 上でdebとrpmのパッケージも提供しているので、systemd上ですぐに動かせます。
まとめ
実は最近までSelf-hosted runnerを構築したことがなかったのですが、ARCを大規模に活用されているお客様がいらっしゃったこともあり、その辺りを調査していたらOSSができていた。
当然、GitHub Copilotの力を借りながらではありますが、かなり作り込んでしまい、結果、いい感じのものができたと思っているので、ぜひ使ってみてください。PRやIssueも歓迎です!
作っていて色々勉強になった部分もあったのでそこも別途まとめたい。