GitHubを使っていなくても大丈夫。同じMacが主要なCIすべてで動きます。
GitHub Actionsは私たちがセットアップし、直接サポートします。ただし、あなたのマシンはSSHでアクセスできる普通のMac miniです。GitLab、Bitbucket、Buildkite、CircleCI、Azure Pipelines、Jenkinsには、どれもmacOSで動くエージェントがあります。お使いのものをインストールすれば、それ以外の環境はまったく同じです。Xcodeのバージョン固定、温まったキャッシュ、シミュレーター用に維持されたログインセッション、1台につき1社のお客様。
始める前に
- +上記のエージェントはすべて、CIへ外向きに接続します。受信ポートは不要です。マシンは今と同じく、公開インターネットから切り離されたままです。
- +エージェントはrunnerユーザーで動かしてください。GitHub Actionsと同じアカウントです。Xcode、シミュレーター、キャッシュはこのユーザーが所有しています。
- +動かし続けてください。サービスとして起動するか(brew services、svc.sh)、tmuxセッションの中で起動します。runnerユーザーは自動ログインするので、シミュレーターやUIテストに必要なGUIセッションがあります。
- +Xcodeはインストール済みで、バージョンが固定されています。ジョブの中でxcode-selectかDEVELOPER_DIRを使ってバージョンを選んでください。GitHubと同じ方法です。
- +GitHubのランナーを使わないなら削除してください。そのまま待機させておいても構いません。ジョブが来なければ何もコストはかかりません。
まずTailscaleで接続し、runnerとしてSSHでログインします。手順は セットアップのドキュメントのステップ1と同じです。
GitLab
GitLabのホステッドmacOSランナーは、Linuxの数倍の単価で課金されます。GitLab Runnerを入れた専用Macは、同じことを固定料金で実現します。
- 01
公式のバイナリをインストールします。GitLabはHomebrewのformulaを保守しておらず、こちらを推奨しています。
sudo mkdir -p /usr/local/bin sudo curl --output /usr/local/bin/gitlab-runner \ "https://s3.dualstack.us-east-1.amazonaws.com/gitlab-runner-downloads/latest/binaries/gitlab-runner-darwin-arm64" sudo chmod +x /usr/local/bin/gitlab-runner
- 02
プロジェクトかグループでCI/CDの設定を開き、ランナーを作成してトークンをコピーします。次にMac上で登録します。
gitlab-runner register --url https://gitlab.com --token <runner-token> --executor shell
- 03
runnerユーザーのサービスとしてインストールし、起動します。SSHではなく、デスクトップセッション(画面共有)のターミナルから実行してください。
cd ~ gitlab-runner install gitlab-runner start
- 04
ランナーにタグ(たとえばmacos、xcode)を付け、.gitlab-ci.ymlのジョブでそのタグを指定します。
Bitbucket Pipelines
AtlassianはホステッドのmacOSランナーを一切提供していません。BitbucketでiOSをビルドするなら、Macをセルフホストするしかありません。まさにこれがその方法です。
- 01
ランナーにはJavaが必要です。Homebrewでインストールします。
brew install openjdk@17
- 02
Bitbucketで「Repository settings」(または「Workspace settings」)から「Runners」を開き、macOSタイプのランナーを追加します。Bitbucketが起動コマンドを表示します。アカウント、リポジトリ、ランナーのIDとOAuthクライアントが含まれています。表示されたとおりにコピーしてください。
- 03
Mac上のtmuxセッションの中でそのコマンドを実行します。ログイン時に起動するよう、LaunchAgentにまとめても構いません。
tmux new -s bitbucket # paste the start command Bitbucket gave you
- 04
bitbucket-pipelines.ymlで、ステップに runs-on: [self.hosted, macos] と、選んだラベルを指定します。
Buildkite
Buildkiteはもともと、実行環境を自分で用意する設計です。専用MacこそBuildkiteのiOSパイプラインが想定する環境です。
- 01
BuildkiteのHomebrew tapからエージェントをインストールします。最近のHomebrewでは、先にサードパーティのtapを信頼するよう求められます。
brew tap buildkite/buildkite brew trust buildkite/buildkite brew install buildkite/buildkite/buildkite-agent
- 02
設定ファイルにエージェントトークンを書き込み、サービスとして起動します。
sed -i '' 's/xxx/<your-agent-token>/' "$(brew --prefix)/etc/buildkite-agent/buildkite-agent.cfg" brew services start buildkite/buildkite/buildkite-agent@3
- 03
同じ設定ファイルにキューやタグのルールを追加し、パイプラインのステップからそれを指定します。
CircleCI
CircleCIのホステッドmacOSは、GitHubと同じく従量課金です。CircleCIのセルフホスト用machine runnerはmacOSで動き、外向きに接続します。
- 01
CircleCIでセルフホストランナー用のリソースクラスを作成し、ランナートークンを発行します。
- 02
CircleCIのHomebrew tapからmachine runnerをインストールします。UIに表示されるmacOS用の設定手順に従ってください。ランナーの設定ファイルにトークンとリソースクラスを設定する手順です。
- 03
ランナーをサービスとして起動し、config.ymlのジョブからリソースクラスを指定します。
CircleCIはランナーのインストール手順を頻繁に変更します。macOS向けセルフホストランナーのインストールページにある、正確なコマンドに従ってください。
CircleCIの完全なガイドを読むAzure Pipelines
MicrosoftのホステッドmacOSエージェントは、並列実行数に制限があります。セルフホストのmacOSエージェントは、正式にサポートされた選択肢です。
- 01
Azure DevOpsで「Organization settings」から「Agent pools」を開き、エージェントを追加します。表示されるmacOS用エージェントのパッケージをダウンロードします。
- 02
runnerのホームディレクトリに展開します。Agent Poolsの読み取りと管理のスコープを持つ個人用アクセストークンで設定します。
mkdir ~/azagent && cd ~/azagent && tar zxvf ~/Downloads/vsts-agent-osx-arm64-*.tar.gz ./config.sh
- 03
サービスとしてインストールし、起動します。
./svc.sh install ./svc.sh start
- 04
パイプラインでそのプールを指定します: pool: { name: <your-pool> }。
Jenkins
Jenkinsを使うチームは、すでに自前のエージェントを運用しています。インバウンドエージェントを使えば、Macからコントローラーへ外向きに接続するので、受信ポートは不要です。
- 01
Java 21をインストールします。現在のJenkins LTSでは、エージェントにもJava 21か25が必要です。
brew install openjdk@21
- 02
Jenkinsで新しいノードを追加し、起動方法に「Launch agent by connecting it to the controller」を選びます。Jenkinsがagent.jarのダウンロード先と、シークレット付きの正確な実行コマンドを表示します。
- 03
Mac上のtmuxの中でそのコマンドを実行します。再起動後に再接続するよう、LaunchAgentとして動かしても構いません。
tmux new -s jenkins curl -sO https://<your-jenkins>/jnlpJars/agent.jar # then the java -jar agent.jar ... command Jenkins gave you
- 04
ノードにmacosというラベルを付け、対象のジョブをそのラベルに限定します。
同じマシン、同じ料金。
申し込みフォームでお使いのCIシステムを選んでください。URLは任意です。ただし不正利用チェックだけは、URLがあるほうがスムーズに通ります。