Github Actions の Self-hosted Runner をやってみた
個人的に時々更新している次の Docker イメージがある。
そのサイズ、約 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 を登録する。
次の図の①②③の順でクリックするだけ。
③の緑のボタンをクリックすると次のページが表示される。
このページには Download 方法と Configure 方法が記載されている。 Download 方法はインストール手順、Configure 方法は起動方法と思って OK。
ちなみに macOS と Windows は 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
状態となっている。
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
と表示される。
あら簡単。
ワークフローの実行が終了すると、runner は再び Idle
状態に戻る。
Runner の終了
./run.sh
を実行したターミナルで ctrl + c
で runner を止めることができる。
止めると管理ページでは次のように Offline
となる。
まとめ
Github Action の Self-hosted runner を試してみた。
思ったより随分簡単だった。
Github 側から Runner への接続はしないようなので Runner からインターネットへの通信ができれば動作できる様子。
ごく簡単なワークフローしか試さなかったが、Docker を使うなら予め使える環境を用意する必要があるだろう。
運用を考えると Runner 自体も Docker で動かしたいし、次回は ECS で Runner を動かしてみるつもり。