【入門編】GitHub Actionsの「self-hosted runner」構築ガイド:高コストなジョブを安価に高速化する自前環境のススメ – バージョン管理・CI/CD活用バイブル

こんにちは!日々の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ライフが、今日からさらに快適になることを応援しています!

タイトルとURLをコピーしました