Não usa GitHub? O mesmo Mac funciona com todos os grandes CIs.
Configuramos o GitHub Actions para você e damos suporte direto a ele. Mas sua máquina é um Mac mini normal com acesso SSH. GitLab, Bitbucket, Buildkite, CircleCI, Azure Pipelines e Jenkins têm agentes que rodam no macOS. Instale o que você usa. O resto da máquina é idêntico: Xcode fixado, caches quentes, uma sessão sempre aberta para os simuladores e um cliente por máquina.
Antes de começar
- +Todos os agentes desta página se conectam de dentro para fora com o seu CI. Nenhum precisa de porta de entrada, então a máquina continua fora da internet pública, como hoje.
- +Rode o agente com o usuário runner, a mesma conta que o GitHub Actions usa. Ela é dona do Xcode, dos simuladores e dos caches.
- +Mantenha o agente vivo. Inicie como serviço (brew services, svc.sh) ou dentro de uma sessão do tmux. O usuário runner faz login automático, então existe uma sessão gráfica para simuladores e testes de UI.
- +O Xcode está instalado e fixado. Escolha uma versão dentro do seu job com xcode-select ou DEVELOPER_DIR, igual no GitHub.
- +Remova o runner do GitHub se não for usar, ou deixe parado. Ele não custa nada quando não chegam jobs.
Primeiro conecte pelo Tailscale e entre por SSH como runner, igual ao passo 1 da documentação de configuração.
GitLab
Os runners macOS hospedados do GitLab cobram várias vezes a tarifa do Linux. Um Mac dedicado com GitLab Runner é a mesma coisa, mas com preço fixo.
- 01
Instale o binário oficial. O GitLab não mantém a fórmula do Homebrew e recomenda esta opção.
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
No seu projeto ou grupo, abra as configurações de CI/CD, crie um runner e copie o token dele. Depois registre no Mac.
gitlab-runner register --url https://gitlab.com --token <runner-token> --executor shell
- 03
Instale e inicie como serviço para o usuário runner. Faça isso em um terminal na sessão da área de trabalho (Compartilhamento de Tela), não por SSH.
cd ~ gitlab-runner install gitlab-runner start
- 04
Coloque tags no runner (por exemplo macos, xcode) e use a tag nos jobs do seu .gitlab-ci.yml.
Bitbucket Pipelines
A Atlassian não oferece nenhum runner macOS hospedado. Quem faz build de iOS no Bitbucket precisa hospedar o próprio Mac, e é exatamente isto.
- 01
O runner precisa de Java. Instale com o Homebrew.
brew install openjdk@17
- 02
No Bitbucket, abra Repository settings (ou Workspace settings), depois Runners, e adicione um runner do tipo macOS. O Bitbucket mostra um comando de início com os ids da sua conta, do repositório e do runner, e um cliente OAuth. Copie como aparece.
- 03
Rode esse comando no Mac dentro de uma sessão do tmux, ou coloque em um LaunchAgent para iniciar no login.
tmux new -s bitbucket # paste the start command Bitbucket gave you
- 04
No bitbucket-pipelines.yml, coloque no step runs-on: [self.hosted, macos] e qualquer label que você escolheu.
Buildkite
O Buildkite foi feito para você trazer sua própria infraestrutura. Um Mac dedicado é exatamente o que um pipeline de iOS no Buildkite espera.
- 01
Instale o agente pelo tap do Homebrew do Buildkite. Versões recentes do Homebrew pedem primeiro que você confie em um tap de terceiros.
brew tap buildkite/buildkite brew trust buildkite/buildkite brew install buildkite/buildkite/buildkite-agent
- 02
Coloque o token do seu agente no arquivo de configuração e inicie como serviço.
sed -i '' 's/xxx/<your-agent-token>/' "$(brew --prefix)/etc/buildkite-agent/buildkite-agent.cfg" brew services start buildkite/buildkite/buildkite-agent@3
- 03
Adicione regras de fila ou de tags no mesmo arquivo de configuração e aponte para elas nos steps do seu pipeline.
CircleCI
O macOS hospedado do CircleCI é cobrado por minuto, como o do GitHub. O machine runner auto-hospedado deles roda no macOS e se conecta de dentro para fora.
- 01
No CircleCI, crie uma resource class para runners auto-hospedados e gere um token de runner.
- 02
Instale o machine runner pelo tap do Homebrew do CircleCI. Siga os passos de configuração para macOS que a interface deles mostra. Esses passos colocam o token e a resource class no arquivo de configuração do runner.
- 03
Inicie o runner como serviço e aponte para a resource class nos jobs do seu config.yml.
O CircleCI muda com frequência o processo de instalação do runner. Siga os comandos exatos da página de instalação do runner auto-hospedado para macOS.
Leia o guia completo do CircleCIAzure Pipelines
Os agentes macOS hospedados da Microsoft têm paralelismo limitado. Um agente macOS auto-hospedado é uma opção de primeira classe.
- 01
No Azure DevOps, abra Organization settings, Agent pools, e adicione um agente. Baixe o pacote do agente para macOS que ele oferece.
- 02
Descompacte na home do usuário runner e configure com um personal access token que tenha o escopo Agent Pools de leitura e gerenciamento.
mkdir ~/azagent && cd ~/azagent && tar zxvf ~/Downloads/vsts-agent-osx-arm64-*.tar.gz ./config.sh
- 03
Instale e inicie como serviço.
./svc.sh install ./svc.sh start
- 04
Aponte seu pipeline para o pool: pool: { name: <your-pool> }.
Jenkins
Quem usa Jenkins já cuida dos próprios agentes. Use um agente de entrada (inbound agent) para o Mac se conectar ao seu controller sem precisar de porta de entrada.
- 01
Instale o Java 21. As versões LTS atuais do Jenkins também pedem Java 21 ou 25 nos agentes.
brew install openjdk@21
- 02
No Jenkins, adicione um novo nó com o método de início Launch agent by connecting it to the controller. O Jenkins mostra o download do agent.jar e o comando exato para rodar com o seu segredo.
- 03
Rode esse comando no Mac dentro do tmux, ou como LaunchAgent para reconectar depois de um reinício.
tmux new -s jenkins curl -sO https://<your-jenkins>/jnlpJars/agent.jar # then the java -jar agent.jar ... command Jenkins gave you
- 04
Coloque o label macos no nó e limite os jobs certos a esse label.
A mesma máquina, o mesmo preço.
Escolha seu sistema de CI no formulário de cadastro. A URL é opcional para tudo, menos para a verificação antifraude, que funciona melhor com ela.