こんにちは!日々のCI/CDパイプラインの最適化、本当にお疲れ様です。
「GitHub Actions、便利だけどビルド時間が長すぎて毎月ランナーの利用枠(GitHubホスト型ランナーの分)が枯渇しかけている…」
「機械学習のモデル学習や、数ギガバイトにも及ぶ超巨大なモノリスのビルドを回したいのに、標準ランナーのスペック(2コア・7GB RAM)じゃ歯が立たない…」
そんな悩みに直面していませんか?
今回は、GitHub Actionsの限界を突破し、高コストなジョブを劇的に安く、そして爆速にする「セルフホストランナー(Self-hosted runner)」の構築術を徹底解説します。
これをマスターすれば、会社のインフラコストを最適化しつつ、開発者の待ち時間を大幅に削減できるようになりますよ。さあ、一緒にフタを開けていきましょう!
—
1. セルフホストランナーとは? なぜ今、導入すべきなのか
GitHubホスト型ランナーの限界
GitHubが用意してくれている標準ランナー(`ubuntu-latest`など)は、環境構築不要ですぐに使えて最高です。しかし、以下の壁にぶつかります。
1. コストの壁: 大規模なビルドや並列実行が増えると、GitHub Actionsの追加分(Minute)の課金が跳ね上がります。
2. スペックの壁: GPUを使ったAI/MLのトレーニング、数100GBのキャッシュを扱うビルドなど、特殊なハードウェア要件に対応できません。
3. セキュリティとネットワークの壁: 社内(オンプレミス)のプライベートネットワーク内にあるデータベースや検証用サーバーに、セキュアにアクセスしたい場合、標準ランナーではIP制限などの壁に阻まれます。
セルフホストランナーという「最強の選択肢」
セルフホストランナーとは、あなた自身が用意したサーバー(AWS EC2、オンプレミス機、Kubernetesクラスターなど)を、GitHub Actionsの実行環境として登録する仕組みです。
- 圧倒的なコストパフォーマンス: 使い慣れたクラウドのスポットインスタンス(AWS Spot Instancesなど)を使えば、標準ランナーの何分の一ものコストで、8コアやGPU搭載のモンスターマシンを動かせます。
- 環境の完全なコントロール: Docker in Docker、専用のSDK、ローカルキャッシュの永続化など、やりたい放題です。
—
2. 【実践】AWS EC2上にセルフホストランナーを構築する
今回は、最も実務で使われている「AWS EC2(Ubuntu)」をベースに、セルフホストランナーを構築する手順を、優しく丁寧にステップバイステップで解説します。
ステップ1: GitHub側でランナーの登録トークンを発行する
まずは、GitHubに「うちのサーバーをランナーとして登録するよ」と教えるための合言葉(トークン)を発行します。
1. 対象のGitHubリポジトリ(または組織)を開く。
2. Settings > Actions > Runners に移動。
3. [New self-hosted runner] ボタンをクリック。
4. OS(Linux)とアーキテクチャ(x64)を選択すると、画面下に登録用コマンドが表示されます。このトークンは後で使います。
ステップ2: EC2インスタンスの準備とセットアップ
AWSコンソールからEC2(Ubuntu 22.04 LTS推奨)を立ち上げ、SSHでログインします。スペックは用途によりますが、最初は `c6i.xlarge`(4vCPU, 8GB)あたりがバランス良いでしょう。
ログインしたら、ランナー用のディレクトリを作成し、GitHubから公式のエージェントをダウンロードして展開します。
1. 作業用ディレクトリの作成
mkdir actions-runner && cd actions-runner
2. 最新のランナーパッケージをダウンロード(※バージョンは適宜最新を確認してください)
curl -o actions-runner-linux-x64-2.311.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.311.0/actions-runner-linux-x64-2.311.0.tar.gz
3. ハッシュ値の検証(セキュリティの基本!)
echo “2e33c449eeccab637955f9353086eb49b5d3511ea6365bb5be0c2e9a022634d9 actions-runner-linux-x64-2.311.0.tar.gz” | shasum -a 256 -c
4. 解凍
tar xzf ./actions-runner-linux-x64-2.311.0.tar.gz
ステップ3: ランナーのコンフィグレーション(設定)
いよいよGitHubとEC2を紐付けます。先ほどGitHubの画面で取得した登録トークン(`–token` の値)を使って設定スクリプトを実行します。
–url: あなたのリポジトリURL
–token: GitHubで発行されたワンタイムトークン
./config.sh –url https://github.com/your-org/your-repo –token A
実行すると、以下のような質問をされます。
- Enter the name of the runner: (ランナー名。デフォルトのホスト名のままでもOKですが、`ec2-spot-runner-01` など分かりやすい名前を推奨)
- Enter any additional labels: (ラベル。これが超重要です!後述します)
- Enter name of work folder: (ワークスペース名。デフォルトの `_work` でOK)
ステップ4: デーモン(サービス)として常駐させる
サーバーを再起動するたびに手動でランナーを立ち上げるのはナンセンスです。systemdを使って、バックグラウンドで常にGitHubからの指示を待ち受ける常駐サービスとして登録しましょう。
1. サービスのインストールと起動(sudo権限が必要)
sudo ./svc.sh install
2. サービスのスタート
sudo ./svc.sh start
3. 状態の確認
sudo ./svc.sh status
これで、GitHubの画面に戻ると、ランナーが「Idle(待機中)」の緑色に変わっているはずです!おめでとうございます、自前ランナーの完成です。
—
3. 精度高い HelloWorld 的な動作確認:いざジョブを投げる!
構築したセルフホストランナーが実際に動くか、GitHub Actionsのワークフローから確認してみましょう。
リポジトリの `.github/workflows/test-runner.yml` に以下のYAMLファイルを作成します。ここで重要なのが `runs-on` の指定です。
name: Self-Hosted Runner Test
手動でワークフローを実行できるようにする
on:
workflow_dispatch:
jobs:
check-environment:
# ここでセルフホストランナーのラベルを指定します
# (デフォルトでは self-hosted と linux と x64 が付与されています)
runs-on: [self-hosted, linux]
steps:
- name: 1. チェックアウト
uses: actions/checkout@v4
- name: 2. 実行環境のスペックを確認する
run: |
echo “=== CPU情報 ===”
lscpu | grep “Model name”
echo “=== メモリ情報 ===”
free -h
echo “=== ディスク容量 ===”
df -h
- name: 3. Dockerが使えるか確認
run: |
docker –version
echo “セルフホストランナーならDockerも自由自在に叩けます!”
このファイルをコミットし、Actionsタブから手動実行(`workflow_dispatch`)してみてください。
数秒でジョブがピックアップされ、あなたが立ち上げたEC2上でコマンドが実行されるログが流れます。GitHubの標準ランナーとは一味違う、自前マシンならではの爆速感を体感できるはずです!
—
4. 現場で役立つ!セルフホストランナー運用の「知見と罠」
最後に、実運用で絶対に知っておくべき「プロのハック」をいくつか共有します。これを押さえておかないと、夜中に障害対応に追われることになりかねません(笑)。
① ラベル(Labels)を使い倒せ
先ほど設定したラベルは、ジョブのルーティングに命を吹き込みます。
例えば、以下のようにラベルを使い分けます。
- `runs-on: [self-hosted, gpu, ml-training]` → GPU搭載のハイスペック機へ
- `runs-on: [self-hosted, ARM64]` → Apple SiliconやGravitonプロセッサのビルド用へ
これにより、「どのジョブをどの物理マシンに任せるか」を完全にコントロールできます。
② セキュリティの鉄則:パブリックリポジトリでは使わない原則
セルフホストランナーをパブリックリポジトリで使うのは、セキュリティ上、極めて危険です。悪意あるプルリクエスト(PR)によって、ランナー内で任意のコード(マイニングスクリプトや社内ネットワークへのスキャンなど)を実行されてしまう脆弱性(RCE)があるためです。
セルフホストランナーは、原則としてプライベートリポジトリ(または組織内の信頼されたリポジトリ)でのみ使用してください。
③ ディスク肥大化問題への対策
セルフホストランナーで最も多いトラブルが「ビルドキャッシュやDockerイメージが溜まりすぎて、ディスクが100%になりサーバーが死ぬ」という現象です。
定期的に不要なDockerイメージやコンテナを掃除するcronジョブを仕込んでおくか、GitHub Actionsのステップの最後でクリーンアップを行うスクリプトを挟むのが定石です。
- name: Docker Clean up
if: always()
run: |
docker system prune -f –volumes
—
まとめ
いかがでしたでしょうか?
セルフホストランナーの構築は、最初は少し難しく感じるかもしれませんが、一度環境を作ってしまえば、「コスト削減」「爆速化」「特殊要件への対応」という計り知れないメリットをもたらしてくれます。
「毎月のCI費用の請求書を見るのが怖い…」そんなストレスから解放され、開発により集中できる環境を、ぜひあなたのチームでも手に入れてみてください。
あなたのDevOpsライフが、今日からさらに快適になることを応援しています!