個人GitHubアカウントにGithub Actions self-hosted Runnerを立ててみた

2026年6月24日 に投稿 • 2 分 で読めます • 373 語
で共有
構築自体は簡単だったけど微妙に手がかかったから備忘録

self-hosted Runner とは  

GitHub Actionsのランナーを自前でホストできるやつ

Self-hosted runners - GitHub Docs
You can host your own runners and customize the environment used to run jobs in your GitHub Actions workflows.
GitHub Docs

GitHub-hosted Runnerとの比較  

メリット  

  • 適当な余剰マシンにインストールするだけで電気代以外のコストが発生しない
    • GitHub-hostedでよく使用されるubuntu-latestはCPU: 2コア, RAM:8GBで$0.006/分
      • 当然だがRAM不足でスペック上げたりコミットのたびにテストやらLinterやら走らせたら個人開発には手痛い出費になってくる
      • たまたまだけど今の為替レート($1=¥160)で計算すると1分¥1ぐらい
    • 無料枠も消費しないのでここぞという時に残しておける
  • スペックもハード性能限界まで使い放題
  • 追加コスト無しで永続キャッシュが使える
  • NAT裏の家庭内NWに置いてるマシンやIP制限のかかった環境へアクセスさせやすい
    • GitHub-hostedが使用してるIPレンジでIP制限かけるにしても範囲が広大すぎる&メンテも必要
  • 特殊環境への対応が可能
    • GPU周りやARM環境などGitHub-hostedで対応しにくい構成も環境さえ用意すれば使用可能

デメリット  

  • 当然だがホストしたマシンを自前で管理する必要がある
    • ハード障害やら停電やらは考えないこととする
    • 長期稼働させるとディスク使用量の管理も必要
  • パブリックリポジトリでは使いにくい
    • Workflowのコードを自分のマシンで動かしてるので任意コード実行し放題
  • 同時に複数ジョブを実行したい場合は複数ホスト用意する必要がある
    • テストとLinterなど並列実行してる場合は順番待ちになる
  • 結果が実行時のマシンの状態に依存する
    • GitHub-hostedは使い捨て環境なのでイメージが更新されない限りは結果が同一であると期待できるがself-hostedは実行環境に強く依存する
      • 直接コマンド実行せずdocker内で実行するなどの工夫で軽減は可能
      • 気軽にapt upgradeしにくい
  • GitHub-hostedだと意識しないdockerコマンドなども事前にインストールしておく必要がある(ミニマムイメージから立ち上げてると初期に導入するパッケージが増えやすい)
  • 個人アカウントの場合Runnerをリポジトリ単位で作成する必要があり複数リポジトリで使用する場合に手間がかかる(回避策は後述)

導入手順  

自己ホストランナーの追加 - GitHubドキュメント
リポジトリ、Organization、Enterpriseにセルフホステッド ランナーを追加できます。
GitHub Docs
$ apt install curl

# Runnerはrootで動かせないのでユーザー作成する
$ useradd runner -m

# ビルド中の一時ファイルなども出力されるので専用ディレクトリ作成
$ cd /opt/
$ mkdir actions-runner && cd actions-runner

# 執筆時点最新版をDL→検証→解凍
$ curl -o actions-runner-linux-x64-2.335.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.335.1/actions-runner-linux-x64-2.335.1.tar.gz
$ echo "4ef2f25285f0ae4477f1fe1e346db76d2f3ebf03824e2ddd1973a2819bf6c8cf  actions-runner-linux-x64-2.335.1.tar.gz" | shasum -a 256 -c
$ tar xzf ./actions-runner-linux-x64-2.335.1.tar.gz

# 念の為オーナー変えておく
$ chown -R runner:runner /opt/actions-runner/

# runnerユーザーでセットアップ
# Runnerの名前や付与するタグを聞かれるので任意に設定する
# 何も入力しなければホスト名とホストから取得した情報で自動設定される
$ sudo -u runner ./config.sh --url https://github.com/{username}/{repo-name} --token XXXXXXXXXX

--------------------------------------------------------------------------------
|        ____ _ _   _   _       _          _        _   _                      |
|       / ___(_) |_| | | |_   _| |__      / \   ___| |_(_) ___  _ __  ___      |
|      | |  _| | __| |_| | | | | '_ \    / _ \ / __| __| |/ _ \| '_ \/ __|     |
|      | |_| | | |_|  _  | |_| | |_) |  / ___ \ (__| |_| | (_) | | | \__ \     |
|       \____|_|\__|_| |_|\__,_|_.__/  /_/   \_\___|\__|_|\___/|_| |_|___/     |
|                                                                              |
|                       Self-hosted runner registration                        |
|                                                                              |
--------------------------------------------------------------------------------

# Authentication


√ Connected to GitHub

# Runner Registration

Enter the name of the runner group to add this runner to: [press Enter for Default] 

Enter the name of runner: [press Enter for github-selfhosted-runner] 

This runner will have the following labels: 'self-hosted', 'Linux', 'X64' 
Enter any additional labels (ex. label-1,label-2): [press Enter to skip] 

√ Runner successfully added

# Runner settings

Enter name of work folder: [press Enter for _work] 

√ Settings Saved.

# systemctlで常駐させる
$ ./svc.sh install runner
$ ./svc.sh start

横着して全てrootで作業してるので良い子は適切なユーザーで実行してネ

同じホストを複数リポジトリで共有する方法  

※ Organizationで使用する場合はRunnerが組織に紐付くのでこの問題は発生しません

self-hosted Runnerはtar.gzを展開したディレクトリで動いてるかつRunner自体がポート開けてリッスンしてるわけではないのでリポジトリごとに複数起動してあげればホストの使い回しが可能
(そんな脳筋解決でいいのかって気はするが……)
GitHubさんお願いなので個人アカウントもアカウントレベルでRunner紐付けさせてください

複数起動

/opt/actions-runner//opt/actions-runner-hattori045/でディレクトリをズラして起動させてる
試してないけど複数アカウントにも紐付けられるかも?

注意点
Organization使用時はRunnerあたり1つしか同時にジョブが走らないように制御されているが複数起動するとその制御は行われなくなるのでRAM不足などには注意してください(個人開発ではあんま問題にならないかもだけど)

使い方  

self-hosted Runnerで実行したいworkflowのruns-onself-hostedに変えるだけ

runs-on: self-hosted

# 複数OS、アーキテクチャのRunnerを使用してる場合はタグで絞り込みも可能
runs-on: [self-hosted, linux, x64]

個人的にハマったポイント  

dockerをインストール済みでもdockerコマンドが使えない  

  1. runnerユーザーがdockerグループに所属してない
    →これはdocker導入時のあるあるなのでrunnerユーザーをdockerグループに追加すれば解決

    $ usermod -a -G docker runner
  2. グループに追加してもまだ権限無いと言われる
    ERROR: permission denied while trying to connect to the docker API at unix:///var/run/docker.sock
    →Runnerが起動した状態だとグループの情報が反映されないので再起動する

    $ ./svc.sh stop
    $ ./svc.sh start

今後も発見したら追記していく

各種アカウント