[MINISFORUM] MS-S1 MAX 導入設定(概要編) Self-hosted runner #4-a
ちまちまちまちま導入を毎日やっていますが、ちょっと大きなアーキテクチャ決定がありましたので、今回はその点について紹介です。
Ansible での実装がだいぶうまくいくようになってきました。その分、GitHub Actions でのテストがぶん廻るようになり、無料枠を超過して月額 $20 以上の課金が発生するようになってしまいました。そこで Self-hosted Runner を導入してコストを削減しました。本記事では、その設計思想を紹介します。セットアップは後編で。
背景・課題
GitHub Actions の課金問題
GitHub Actions には月間 2,000 分(約 33 時間)の無料枠があります。しかし、Ansible Role の Molecule テストを充実させていくにつれ、この無料枠を超過するようになりました。
Ansible Role の品質を担保するために「Molecule」によるテストは不可欠ですが、これは非常に重い処理です。特に複数の Role を並列でテストし始めると、無料枠はあっという間に消費されてしまいます。今後さらにテスト対象が増えれば、コストは青天井になりかねません。
そこで、実行時間による課金が発生しない「自宅サーバーを用いた Self-Hosted Runner」の導入が決断しました。
課題:
月額 $20 以上の課金が発生
テストの追加に伴い、今後さらにコスト増加の見込み
12 個以上の Role を並列テストすると、すぐに枠を消費
解決策: Self-hosted Runner を導入し、自宅サーバーで CI を実行することで、実行時間を無制限化。
設計思想・アーキテクチャ
ハイブリッド構成の選択
用途に応じて 2 種類の Runner を使い分けるハイブリッド構成を採用しました。
すべてのジョブを同じ環境で実行するのではなく、ジョブの特性(重さ、必要な権限)に応じて最適な実行環境を使い分ける「ハイブリッド構成」を採用しています。
なぜ 2 種類の Runner を使い分けるのか


アーキテクチャの核心:ハイブリッド構成の採用
上段の「GitHub Actions Workflow」では、3種類のジョブが定義されており、それぞれ適切な Runner へルーティングされています。
軽量なジョブのルート
ジョブ: lint job (light) や integration-test (light)
内容: yamllint, ansible-lint, syntax-check など、コードの静的解析が中心。
行き先: 下段左側の 「Docker Runners (Container-based)」
理由: これらのタスクは依存関係が少なく軽量です。Docker コンテナは起動が高速でオーバーヘッドが少ないため、これらをサクサクこなすのに最適です。図でもシンプルなクジラのアイコン(Docker)がそれを示しています。
重量級・特殊要件ジョブのルート
ジョブ: molecule jobs (heavy/parallel)
内容: Ansible Role の適用テスト。実際に OS 環境を立ち上げ、その中で Docker を動かしたり(Docker-in-Docker)、ファイアウォール(iptables/UFW)の設定を行ったりします。
行き先: 下段右側の 「VM Runners (KVM)」
理由: ここがこの構成のキモです。なぜ Docker ではダメで、KVM 仮想マシンが必要なのか?
Docker-in-Docker (DinD): Molecule はテスト時にコンテナ内でさらにコンテナを起動することがあります。これを通常の Docker Runner で行うのはセキュリティや設定の面で複雑になりがちです。
カーネル権限: iptables や UFW の操作はホストのカーネル権限に触れるため、一般的なコンテナ環境では実行できません。
解決策としてのKVM: KVM による完全な仮想マシン環境を用意することで、ホストから隔離された安全な環境で、OS レベルの操作や DinD を自由に実行できるようになります。図では KVM ハイパーバイザーの上に複数の runner-xx (Molecule) が並列で並んでおり、重いテストを同時にさばける体制ができていることを表しています。
環境
本記事で使用する環境:

リソースが潤沢でローカルLLM(SLM)にもマッチします。
潤沢なリソースを是非ご自宅で。
次回、実際のセットアップ編です。
いいなと思ったら応援しよう!
あなたの支えが、私の心の糧になります。
note の収益はガジェットのレビューや、自費出版に使わせていただきます。