1 ジョブだけ動いて消える self-hosted runner。
1 ジョブ = ワークフローの jobs: の 1 つが 1 回実行されること。matrix なら組み合わせごと、Re-run も別ジョブ扱い。
登場人物
- 管理役: GitHub App の秘密鍵を持ち、API を叩いて runner を用意する側(ARC のコントローラや自作サーバ)。runner とは別物
- runner: ジョブを実行するマシン。秘密鍵は持たない
登録方法は 2 つ
違いは「誰が登録するか」だけ。
registration token: 管理役がトークンを取る → runner が自分で登録する
JIT config : 管理役が登録まで済ませる → runner は起動するだけ
registration token の流れ
管理役
1. 秘密鍵で JWT を作る(最大 10 分有効)
2. JWT → installation access token(1 時間有効)
3. installation access token → registration token(1 時間有効)
4. registration token を runner に渡す
runner
5. config.sh --token で登録。このとき runner 用の鍵ペアを作り、公開鍵を GitHub に送る
6. run.sh でジョブを待つ。以降は 5 の鍵で認証するので registration token は用済み
4 の渡し方は GitHub の仕様の外で、自分で作る。例:
- 管理役に「registration token を返すエンドポイント」を用意し、runner の VM が起動時に叩いて取る
手動登録(Settings → Actions → Runners → New self-hosted runner)も中身は同じ。画面に表示される config.sh --token XXX の XXX が registration token で、1〜3 を管理役の代わりに人間が画面でやっているだけ。
JIT config の流れ
1〜2 は同じ。3 で generate-jitconfig を叩くと、その時点で登録が済み、認証情報(base64)が返る。runner は run.sh --jitconfig で起動するだけで、1 ジョブ終わると自動で登録解除される。
比較
| registration token | JIT config | |
|---|---|---|
| 登録する人 | runner | 管理役 |
| 使い方 | 常駐も使い捨て(--ephemeral)も可 | 使い捨てのみ |
| 向いている | 少数を手で立てる | オートスケール |
公式の推奨
公式が推しているのは「使い捨て(ephemeral)」。常駐 runner でのオートスケールは非推奨。
常駐だと前のジョブの影響が次に残る:
- セキュリティ: 乗っ取られた runner が、次のジョブ(別リポジトリの秘密情報など)も受け取る
- 痕跡: 前のジョブのファイル・認証情報・インストール物が残り、次のジョブから見える / 結果が変わる
- オートスケール: 止めた常駐 runner にジョブが割り当てられることがある。使い捨ては 1 runner 1 ジョブなので起きない
補足:
- 使い捨てなら registration token +
--ephemeralでも JIT でもよい。どちらかを推す記述はない - Kubernetes 向けの公式の仕組み ARC(Actions Runner Controller)が推奨されている
参考:
- https://docs.github.com/en/actions/reference/runners/self-hosted-runners
- https://docs.github.com/en/rest/actions/self-hosted-runners
- https://docs.github.com/en/actions/concepts/runners/actions-runner-controller
- https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-json-web-token-jwt-for-a-github-app
- https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app
- https://github.com/actions/runner/blob/main/src/Runner.Listener/Configuration/ConfigurationManager.cs (config.sh の登録処理)
- https://github.com/actions/runner/blob/main/src/Runner.Listener/Runner.cs (
--jitconfigの処理)