GitHub Actions のセルフホストランナーを M1 Mac で動かす
GitHub Actions では、GitHub 側で Linux / Mac / Windows のランナーが実行のたびにプロビジョニングされ使用されます。通常はこれで十分ですが、オンプレの PC や AWS の EC2 インスタンスなどに自前のランナーを用意して実行することもできます。
About self-hosted runners - GitHub Docs
この記事では、M1 Mac をセルフホストランナーとしてセットアップしワークフローを実行する手順を紹介します。
セルフホストランナーのメリット・デメリット
#セルフホストランナーを使用するメリットは以下のような点があります。
- M1 Mac など現状提供されていない環境で CI を行える
- ランナーに対する料金が発生しないので、ロングランなど実行時間の長いワークフローを流せる
- 自前で用意できる強力なマシンパワー(CPU、メモリ、GPU など)を利用できる
- GitHub からアクセスできないオンプレやクラウド環境のリソースを使ったワークフローを実行できる
デメリットとしては以下が挙げられます。
- ワークフロー実行に必要なソフトウェアは(当然)自前でインストールする必要がある
- ワークフロー実行毎にクリーンな環境がプロビジョニングされない。そのため、前回実行の影響で失敗することがあり得る
セルフホストランナーの動作要件
#2022年8月現在、セルフホストランナーの動作が保証されている OS は以下です。
- Linux
- Red Hat Enterprise Linux 7 or later
- CentOS 7 or later
- Oracle Linux 7
- Fedora 29 or later
- Debian 9 or later
- Ubuntu 16.04 or later
- Linux Mint 18 or later
- openSUSE 15 or later
- SUSE Enterprise Linux (SLES) 12 SP2 or later
- Windows
- Windows 7 64-bit
- Windows 8.1 64-bit
- Windows 10 64-bit
- Windows Server 2012 R2 64-bit
- Windows Server 2019 64-bit
- macOS
- macOS 10.13 (High Sierra) or later
CPU アーキテクチャは以下です。
- x64 - Linux, macOS, Windows.
- ARM64 - Linux only.
- ARM32 - Linux only.
ARM64 は Linux only と書いてありますが、macOS (Monterey) も OK です。
Runner はクロスプラットフォームで動作する .NET Core で実装されています。
リポジトリへのセルフホストランナーの登録
#セルフホストランナーを使用するには、まずリポジトリの設定でセルフホストランナーの登録を行います。
Actions > Runners タブの New self-hosted runner
をクリックします。
Runner image で macOS を選択し、Architecture で ARM64 を選択します。
選択結果に応じて、ランナーの導入手順のコマンドが表示されます。
リポジトリの設定画面での作業は、あくまで手順と必要なトークンの払い出しです。次に行う対象マシンでのランナーのインストールと設定が完了するまで、登録は完了しません。
今回は、単独のリポジトリを対象にしましたが、オーガニゼーションレベルでも登録でき、各リポジトリのワークフローから利用可能です。各リポジトリのワークフローではランナーに付与したラベルで指定できます。
セルフホストランナーのインストールと設定
#表示された手順通りに、ランナーをインストールするマシン上でインストーラをダウンロード・展開します。
mkdir actions-runner && cd actions-runner
curl -o actions-runner-osx-arm64-2.294.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.294.0/actions-runner-osx-arm64-2.294.0.tar.gz
tar xzf ./actions-runner-osx-arm64-2.294.0.tar.gz
導入手順には、リポジトリ固有のテンポラリなトークンが生成され表示されますので、それを使って、リポジトリを指定して、config.sh を実行します。
./config.sh --url https://github.com/<account>/<repo> --token xxxxxxxxxxxxxxxxx
トークンの寿命はけっこう短いので、404 エラーになった場合はもう一度作成画面で手順を表示してトークンを再生成します。
成功すると、対話モードで設定を入力することができます。ランナーの名前、ワークフローで指定するためのラベルなどを入力します。
--------------------------------------------------------------------------------
| ____ _ _ _ _ _ _ _ _ |
| / ___(_) |_| | | |_ _| |__ / \ ___| |_(_) ___ _ __ ___ |
| | | _| | __| |_| | | | | '_ \ / _ \ / __| __| |/ _ \| '_ \/ __| |
| | |_| | | |_| _ | |_| | |_) | / ___ \ (__| |_| | (_) | | | \__ \ |
| \____|_|\__|_| |_|\__,_|_.__/ /_/ \_\___|\__|_|\___/|_| |_|___/ |
| |
| 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 kondoh-macbook] mh-local
This runner will have the following labels: 'self-hosted', 'macOS', 'ARM64'
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.
セルフホストランナーの起動
#設定が保存されたら、ランナーを起動できます。
./run.sh
ランナーのバージョンが表示された後に、ジョブの投入待ち状態に入ります。
√ Connected to GitHub
Current runner version: '2.294.0'
2022-08-05 00:48:41Z: Listening for Jobs
ランナーはアイドリング時にセルフでアップデートもしてくれます。
ランナーが無事起動したら、対象リポジトリに、登録したランナーの名前とラベル、状態が表示されます。
Runner をサービスとして実行することで、ターミナルを開いていなくても、GitHub Actions と通信して実行するようにできます。インストールしたディレクトリにサービス登録、スタート、停止、状態表示のシェルスクリプトが含まれています。利用方法は以下をご覧ください。
セルフホストランナーを利用するワークフローの作成と実行
#さっそく、セルフホストランナーを使ったワークフローを作ってみましょう。
runs-on
でセルフホストランナーに付与されたラベルを指定します。この例では、デフォルトで付与される self-hosted
を指定しました。ジョブは、メッセージをエコーするだけの内容です。
name: Self-hosted runner job
on: [workflow_dispatch]
jobs:
Build:
runs-on: self-hosted
steps:
- run: echo 'This job is running on self-hosted runner!!'
もし同じラベルの複数のランナーがあるときは、利用可能なランナーで実行されます。
通常のジョブと同様に実行されます。
Runner のコンソールにジョブの実行ログが流れます。
√ Connected to GitHub
Current runner version: '2.294.0'
2022-08-05 00:48:41Z: Listening for Jobs
2022-08-05 01:11:21Z: Running job: Build
2022-08-05 01:11:27Z: Job Build completed with result: Succeeded
セルフホストを含む複数のランナーで同じワークフローを実行する
#様々なプラットフォーム(OS / CPU)で同じワークフローを実行したいケースでは、セルフホストランナーや GitHub のランナーを複数使って実行しますが、strategy.matrix を使って、1つのワークフローファイルで実行できます。
以下のように、runs-on
を matrix にしたワークフローファイルを準備します。runner
には、GitHub Actions の utuntu-latest、macos-latest に加えてセルフホストランナーを含めています。
jobs:
Build:
runs-on: ${{ matrix.runner }}
strategy:
matrix:
runner: [ubuntu-latest, macos-latest, self-hosted]
steps:
- run: echo 'This job is running on ${{ matrix.runner }} runner!!'
これを実行すると、3つのランナーが起動して、別々にジョブが実行されます。
まとめ
#M1 Mac にセルフホストランナーを構築して、ワークフローを実行する手順を紹介しました。
冒頭のデメリットのところで挙げたクリーンな環境が用意できない件について、Docker で実行するという手段も考えられますが、GitHub Actions のメリットである手軽さが失われてしまうという問題があります。ジョブの前後にクリーンアップ処理を入れるなどの工夫で凌ぐのが現実的でしょう。そのためのフックも用意されています。