たゆたふ。

定まる所なく揺れ動き、いろいろやってみたメモ。など

Github Actions の Self-hosted Runner をやってみた

個人的に時々更新している次の Docker イメージがある。

qiita.com

そのサイズ、約 10GB。 もちろんビルドにも時間がかかる。

これまで Github workflow でビルドし、 Github Container Registory (ghcr) に push して公開していた。
もともとビルドに1時間以上かかっていたが、x86_64 に加えて Arm64 向けにもビルドしようとしてできなくなった。Github workflow はデフォルトでは6時間でタイムアウトし、強制終了となる。その6時間の内に終わらなくなってしまったのだ。
Public なリポジトリだと無料なので少々時間がかかってもまあいいかと長過ぎるビルド時間を改善せず放置していたのだがビルドできないのは困る。

AWS CodeBuild に乗り換えようかなとも思ったのだけど、以前から気になっていた Github Actions の Self-hosted Runner を試してみた。

Self-hosted Runner を試す

まずはどんなものか知るために EC2 インスタンスを立てて試してみた。
本エントリではそれについて記す。

リポジトリでの登録

最初に Self-hosted runner を利用したいリポジトリの Setting で新たな self-hosted runner を登録する。
次の図の①②③の順でクリックするだけ。

Github Actions の Runners 管理ページ
Github Actions の Runners 管理ページ

③の緑のボタンをクリックすると次のページが表示される。

Runner の新規登録
Runner の新規登録

このページには Download 方法と Configure 方法が記載されている。 Download 方法はインストール手順、Configure 方法は起動方法と思って OK。

ちなみに macOSWindows は x64 アーキテクチャしかないが、 Linux は x64、ARM、ARM64 が選択できる。

重要なのはアンダーラインを引いた token の値1。後で必要なのでメモしておく。

インストール

EC2 インスタンスSSH で接続して前述のページに記載されている通りのコマンド2を実行するだけ。 迷うところはない。

mkdir actions-runner && cd actions-runner
curl -o actions-runner-linux-x64-2.290.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.290.1/actions-runner-linux-x64-2.290.1.tar.gz
tar xzf ./actions-runner-osx-x64-2.290.1.tar.gz

起動

tar ファイルを開いたら、前述のページの Configure に記載されているコマンドを実行する。 そのままコピー&ペーストで構わない。
./config.sh 実行後、いくつか質問されるがとりあえず全部デフォルトでいいのでリターンしていくだけ。

[ec2-user@ip-172-31-26-219 actions-runner]$ ./config.sh --url https://github.com/HeRoMo/jupyter-langs --token XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

--------------------------------------------------------------------------------
|        ____ _ _   _   _       _          _        _   _                      |
|       / ___(_) |_| | | |_   _| |__      / \   ___| |_(_) ___  _ __  ___      |
|      | |  _| | __| |_| | | | | '_ \    / _ \ / __| __| |/ _ \| '_ \/ __|     |
|      | |_| | | |_|  _  | |_| | |_) |  / ___ \ (__| |_| | (_) | | | \__ \     |
|       \____|_|\__|_| |_|\__,_|_.__/  /_/   \_\___|\__|_|\___/|_| |_|___/     |
|                                                                              |
|                       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 ip-172-31-26-219]

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 connection is good

# Runner settings

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

√ Settings Saved.

[ec2-user@ip-172-31-26-219 actions-runner]$ ./run.sh

√ Connected to GitHub

Current runner version: '2.289.3'
2022-04-23 09:34:07Z: Listening for Jobs

./run.sh 実行後、Listening for Jobs と表示されるが、これで Github に接続し、ワークフローの Job の実行を待っている状態。

先程 token を取るのに利用した Github の管理ページを確認すると次のように Self-hosted runner が idle 状態となっている。

Idle な runner
Idle な runner

ip-172.31.26.219 は runner の名前。何も指定していないので EC2 インスタンスのホスト名がそのまま使われている。
その横の 'self-hosted''Linux''X64' はこの runner を使う場合に指定するラベルでワークフローの runs-on で指定する。

タスクの実行

試しに test-workflow といブランチを作り次のようなワークフローを追加してみる。 self-hosted runner で実行するために runs-on: self-hosted と指定している。 ここはラベル 'Linux' または 'X64' を指定しても同じ。

name: Hello World
on:
  push:
    branches:
      - test-workflow
jobs:
  hello-world:
    runs-on: self-hosted
    permissions:
      contents: read
      packages: write
    steps:
      - run: echo "hello-world"
      - run: uname -a
      - run: sleep 60 # すぐに終了するとスクショが取りにくいので

これを Github に Push すると ./run.sh を実行したターミナルには Job 実行を示すログが出色される。

[ec2-user@ip-172-31-26-219 actions-runner]$ ./run.sh

√ Connected to GitHub

Current runner version: '2.290.1'
2022-04-23 10:22:54Z: Listening for Jobs
2022-04-23 10:25:48Z: Running job: hello-world # ここから実行ログ
2022-04-23 10:26:58Z: Job hello-world completed with result: Succeeded # 成功終了したことを示すメッセージ

Github の管理ページではタスクの実行中は次のように Active と表示される。

Active な runner
Active な runner

あら簡単。

ワークフローの実行が終了すると、runner は再び Idle 状態に戻る。

Runner の終了

./run.sh を実行したターミナルで ctrl + c で runner を止めることができる。 止めると管理ページでは次のように Offline となる。

Offline な runner
Offline な runner

まとめ

Github Action の Self-hosted runner を試してみた。
思ったより随分簡単だった。

Github 側から Runner への接続はしないようなので Runner からインターネットへの通信ができれば動作できる様子。
ごく簡単なワークフローしか試さなかったが、Docker を使うなら予め使える環境を用意する必要があるだろう。

運用を考えると Runner 自体も Docker で動かしたいし、次回は ECS で Runner を動かしてみるつもり。

参考


  1. の有効期限は1時間。このスクリーンショットのはとっくに無効となっている。

  2. GitHub Actions Runner のリポジトリ actions/runnerReleases にも記載されている。