GitHub Actions の Self hosted runner で --ephemeral オプションでの罠
GitHub Actions の Self hosted runner で設定するときに、 config.sh
に --ephemeral
オプションを指定することで、 Self hosted runner を短命にできる。
短命である とは1つのジョブを走らせたあとに self hosted runner が終了することをいう。
--ephemeral
は v2.282.0 で導入されたが、これ以前は self hosted runner は1つのジョブを走らせた後も終了することなく再度ジョブが来たらそのままジョブを走らせることしかできなかった。 このため、内部でシステムの状態を変更させるようなタスク(apt-get
でパッケージをインストールするなど)を走らせると、その後のジョブにもその影響を与えることができてしまっていた(たとえば、あるジョブでapt-get install -y python3
としてしまうと、その後に同じ self hosted runner で走るジョブでは python3 をインストールしていないのに python3 を使えてしまえていた。
self hosted runner は自動アップデートが走るのだが、その際、 self hosted runner を走らせているプロセス(run.sh
)を終了させて再度 self hosted runner を起動するというようになっているがこれと --ephemeral
との相性が悪い。
これは --ephemeral
がついてないときはこれらの処理は正常に働き、アップデートが完了したら再度 self hosted runner が走るようになっていた。
しかし、 --ephemeral
を設定して self hosted runner を起動していると、自動アップデートした際に self hosted runner を走らせているプロセス(run.sh
) が自動で終了するまではいいのだが、その後に self hosted runner が起動してこなくなる。
自動でアップデートしてくれないので、 self hosted runner を走らせているインスタンスを終了して最新バージョンをインストールしたインスタンスを起動しなおすなどしてもいいと思う。
ちなみに、 linux
かつ x64
な self hosted runner のコードを取得するには次のコマンドを実行すればよい:
$ curl -s https://api.github.com/repos/actions/runner/releases/latest \ | jq -r '.assets[]|select(.name|contains("linux-x64"))' \ | jq -r .browser_download_url
linux-x64
の部分を好きなように書き換えれば、他のアーキテクチャに置き換えられる。 サポートされているものについてはactions/runner
のリリースを見て欲しい。