GitHub Actionsでセルフホストランナーを使う
AWS EC2でちゃんとしたセルフホストランナーを構築する手順を説明します。
? 以降の手順はベストプラクティスではなく、一例として説明しています。手動でやること大杉なのでもっといい方法ありそう
onuma.icon 個人的にCIは手動で設定するもんじゃないと思うんですよね。折角自動化して楽しているのに、CIをメンテしなくちゃいけなくて、本末転倒だなって気がしています😓
Step 1. EC2インスタンスを作成する
好きなインスタンスタイプでEC2インスタンスを作ります。
特別な手続きなどはないので詳細は省きます。
Step 2. リポジトリの情報を取得する
リポジトリの Settings → Actions → Add runner からセルフホストランナーのセットアップに必要なコマンドが確認できます。
https://gyazo.com/8a824f7144597f1503d9945047c9c49e
この中に、セルフホストランナーをリポジトリで稼働させるためのトークンなどが含まれているので確認してください。
https://gyazo.com/286d164f6d8646f24917567b9280e894
onuma.icon
トークンどこで作るんだろうと思ったらここに書いている通りにやるだけでいいから結構楽ですよね😄
また、MACとかでも使えるので、自分のPCでも試せますよね。
Step 3. セルフホストランナーのセットアップ
セルフホストランナーをマシンへセットアップします。
Step 2 で表示されている各種コマンドをインスタンス上で実行します。
code:bash
$ mkdir actions-runner && cd actions-runner
$ tar xzf ./actions-runner-linux-x64-2.165.2.tar.gz
ここまでで actions-runner ディレクトリ内にセルフホストランナーの実行ファイルがセットアップされます。
Step 4. リポジトリへ接続
セルフホストランナーをリポジトリへ接続します。
config.sh から続くコマンドをインスタンス上で実行します。
code:bash
ここで、ランナー名を入力します。ランナー名はリポジトリ内で重複させられません。
接続に成功したら、リポジトリ上に ● Offline としてランナーが表示されます。
https://gyazo.com/c68fcc60c466b86fd23f8ea82da0c9ea
Step 5. ランナーの起動
run.sh を実行するとランナーが起動し、アイドル状態となります。
code:bash
$ ./run.sh
https://gyazo.com/250e8f9d2c92d8e505ca0c81ccda2a37
Step 6. ランナーのサービス化
./run.sh ではランナーを永続化できないため、ランナーをサービス化して永続化します。
次のコマンドをインスタンス上で実行します。
code:bash
$ sudo ./svc.sh install
$ sudo ./svc.sh start
これで、サービスとしてランナーが起動します。
onuma.icon svc.shでデーモン化するんですね!よく分からなかったからscreenコマンドで別スクリーン作ってました😅
Step 7. ワークフローのランナーを変更する
ワークフローに記載されたランナーを self-hosted に変更します。
code:push.yml
jobs:
build:
runs-on: self-hosted
プリインストールソフトウェアについて
セルフホストランナーにはGitHubがホストするランナーのようなプリインストールがありません。
たとえば、 yarn や git はインストールされていないので、ワークフローで使用しているなら、手動でインスタンスへインストールする必要があります。
onuma.icon
ちなみにgit入れないとspawn上でこんなエラーが起きて、原因の特定に相当苦しみました・・・。gitがないってシンプルに言って欲しかったです・・・。
##[error]spawn ENOMEM
余談
1つのランナーは1つのジョブしかこなせないため、いくつかランナーを起動しておく必要があります。
ただし、同名のランナーは作成できないため、Step 1〜Step 6 の手順で複数のランナーを作成・起動させなければいけません。
ここの運用、どうにかならんだろうか・・・
onuma.icon セルフホストだからどうしようもない気がしますねぇ。。。
ハマったところ
actions-runnerにある_workが作業ディレクトリだが、これがどんどん容量が肥大化していく。。。
https://gyazo.com/f7ffc92dcd0944ab126627ed54271113
具体的に中に入っていくと.git/objectsがどんどん増えてくる。スクショを撮り忘れたが、一時は7.5Gにもなってしまった😰
容量が一杯になってしまうとActionが動かなくなるので注意。
https://gyazo.com/acaa06a29e1327a60b84d8af8645aab6
objectsの中身をみるとidxとpackがたくさんあってゴミがたまっているのが分かる。
https://gyazo.com/000dff1c85e85322de7053a389962e20
そこで$ git gcをすると不要なオブジェクトを消してくれるのでスッキリする。
※ただしgcするためにも作業領域が必要そうで、ストレージがいっぱいの時は諦めて_workごと消すしかなさそう・・・
tamuraryoya.icon
早速、インスタンスの容量オーバーでワークフローが動かなくなりました
挙動を見てみると、1度でもジョブが実行されたランナーは1GBくらいのサイズになるようでした
https://gyazo.com/f763320500beed2257565233202edcd0
onuma.icon これ実行するActionによるんじゃないかなぁって思っています。自分が試したやつはプリレンダリングもするやつですが、これはt2.smallくらいじゃないとダメでした(t2.microだとメモリ足りないエラーが出る)。憶測ですが、yarn installはできていたので、ものによって必要なスペックが変わってくるんだと思います😓
onuma.icon いや、どんなジョブでも結局1Gいっちゃうのかな・・・?ローカルで試したやつも確かに1GBくらいなってました
しばらく運用してわかったこと
AWS EC2のt3.xlargeインスタンス(ボリューム 16GB)に6ランナー登録しても動いたし、フロントエンド開発なら困らない程度に渋滞も発生していない。
https://gyazo.com/6a6b208a35f239bf1258b2ea991f79eb
▲GitHub上のアクション登録状況
オンデマンドで 0.1670USD/hour 、GitHub ActionsのLinuxランナーでの追加料金は 0.48USD/CPU hour 。GitHub Actionsのホストランナーは従量課金なのでイマイチ見積もれないのが辛いところ。
https://gyazo.com/a35ab7b89e4e37200238654dc4a4fd13
▲ T3インスタンスのスペックと料金
ちなみに、10ランナー登録したらメモリが足らずに無言で死ぬ事象が発生した。
このとき実行中だったジョブがFailureではなくPendingのままとなるので、後続のジョブが大渋滞を起こすので注意。
ワークフロー復旧させても渋滞したジョブが流れ込むのでしばらく解消されない。
手間が大変だが、Organization全体に影響するレベルだとビビってEC2に移行したくなるもの。
まとめとしては、 フロントエンドの開発に使うなら、4 Core / メモリ16GB 以上のインスタンスで複数ランナーを動かす のが手軽でいいかもです。
ちなみに、GitHub Actionsのホストランナーのスペックは次の通り
2 Core CPU
7GB RAMメモリ
14 GBのSSDディスク容量
参考ページ
👍 onuma onuma.icon がいいねしました on 2020/3/10