Docs

¿No usas GitHub? El mismo Mac funciona con todos los grandes CI.

Configuramos GitHub Actions por ti y le damos soporte directo. Pero tu máquina es un Mac mini normal con acceso SSH. GitLab, Bitbucket, Buildkite, CircleCI, Azure Pipelines y Jenkins tienen agentes que funcionan en macOS. Instala el que uses. El resto de la máquina es idéntico: Xcode fijado, cachés calientes, una sesión iniciada siempre activa para los simuladores y un cliente por máquina.

Antes de empezar

  • +Todos los agentes de esta página se conectan hacia fuera con tu CI. Ninguno necesita un puerto de entrada, así que la máquina sigue fuera de internet, igual que ahora.
  • +Ejecuta el agente con el usuario runner, la misma cuenta que usa GitHub Actions. Es la dueña de Xcode, los simuladores y las cachés.
  • +Mantenlo vivo. Arráncalo como servicio (brew services, svc.sh) o dentro de una sesión de tmux. El usuario runner inicia sesión automáticamente, así que hay una sesión gráfica para simuladores y tests de UI.
  • +Xcode está instalado y fijado. Elige una versión dentro de tu job con xcode-select o DEVELOPER_DIR, igual que en GitHub.
  • +Quita el runner de GitHub si no lo vas a usar, o déjalo inactivo. No cuesta nada si no llegan jobs.

Primero conéctate por Tailscale y entra por SSH como runner, igual que en el paso 1 de la documentación de configuración.

GitLab

Los runners macOS alojados de GitLab cobran varias veces la tarifa de Linux. Un Mac dedicado con GitLab Runner es lo mismo, pero con precio fijo.

  1. 01

    Instala el binario oficial. GitLab no mantiene la fórmula de Homebrew y recomienda esta opción.

    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
  2. 02

    En tu proyecto o grupo, abre los ajustes de CI/CD, crea un runner y copia su token. Después regístralo en el Mac.

    gitlab-runner register --url https://gitlab.com --token <runner-token> --executor shell
  3. 03

    Instálalo y arráncalo como servicio para el usuario runner. Hazlo desde un terminal en la sesión de escritorio (pantalla compartida), no por SSH.

    cd ~
    gitlab-runner install
    gitlab-runner start
  4. 04

    Ponle etiquetas al runner (por ejemplo macos, xcode) y usa esa etiqueta en los jobs de tu .gitlab-ci.yml.

Lee la guía completa de GitLab

Bitbucket Pipelines

Atlassian no ofrece ningún runner macOS alojado. Quien compila para iOS en Bitbucket tiene que alojar su propio Mac, y eso es justo esto.

  1. 01

    El runner necesita Java. Instálalo con Homebrew.

    brew install openjdk@17
  2. 02

    En Bitbucket, abre Repository settings (o Workspace settings), luego Runners, y añade un runner de tipo macOS. Bitbucket te muestra un comando de arranque con los ids de tu cuenta, repositorio y runner, y un cliente OAuth. Cópialo tal cual.

  3. 03

    Ejecuta ese comando en el Mac dentro de una sesión de tmux, o envuélvelo en un LaunchAgent para que arranque al iniciar sesión.

    tmux new -s bitbucket
    # paste the start command Bitbucket gave you
  4. 04

    En bitbucket-pipelines.yml, pon en el step runs-on: [self.hosted, macos] más cualquier etiqueta que hayas elegido.

Buildkite

Buildkite está pensado para que pongas tu propia infraestructura. Un Mac dedicado es justo lo que espera un pipeline de iOS en Buildkite.

  1. 01

    Instala el agente desde el tap de Homebrew de Buildkite. Las versiones recientes de Homebrew te piden primero que confíes en un tap de terceros.

    brew tap buildkite/buildkite
    brew trust buildkite/buildkite
    brew install buildkite/buildkite/buildkite-agent
  2. 02

    Pon el token de tu agente en el archivo de configuración y arráncalo como servicio.

    sed -i '' 's/xxx/<your-agent-token>/' "$(brew --prefix)/etc/buildkite-agent/buildkite-agent.cfg"
    brew services start buildkite/buildkite/buildkite-agent@3
  3. 03

    Añade reglas de cola o de etiquetas en el mismo archivo de configuración y apúntalas desde los steps de tu pipeline.

Lee la guía completa de Buildkite

CircleCI

El macOS alojado de CircleCI se cobra por minuto, como el de GitHub. Su machine runner self-hosted funciona en macOS y se conecta hacia fuera.

  1. 01

    En CircleCI, crea una resource class para runners self-hosted y genera un token de runner.

  2. 02

    Instala el machine runner desde el tap de Homebrew de CircleCI. Sigue los pasos de configuración para macOS que muestra su interfaz. Esos pasos ponen el token y la resource class en el archivo de configuración del runner.

  3. 03

    Arranca el runner como servicio y apunta a la resource class desde los jobs de tu config.yml.

CircleCI cambia a menudo el proceso de instalación del runner. Sigue los comandos exactos de su página de instalación del runner self-hosted para macOS.

Lee la guía completa de CircleCI

Azure Pipelines

Los agentes macOS alojados de Microsoft tienen un paralelismo limitado. Un agente macOS self-hosted es una opción de primera clase.

  1. 01

    En Azure DevOps, abre Organization settings, Agent pools, y añade un agente. Descarga el paquete del agente para macOS que te ofrece.

  2. 02

    Descomprímelo en el home del usuario runner y configúralo con un personal access token que tenga el permiso Agent Pools de lectura y gestión.

    mkdir ~/azagent && cd ~/azagent && tar zxvf ~/Downloads/vsts-agent-osx-arm64-*.tar.gz
    ./config.sh
  3. 03

    Instálalo y arráncalo como servicio.

    ./svc.sh install
    ./svc.sh start
  4. 04

    Apunta tu pipeline al pool: pool: { name: <your-pool> }.

Jenkins

Quien usa Jenkins ya gestiona sus propios agentes. Usa un agente de entrada (inbound agent) para que el Mac se conecte a tu controller y no necesite un puerto de entrada.

  1. 01

    Instala Java 21. Las versiones LTS actuales de Jenkins también piden Java 21 o 25 en los agentes.

    brew install openjdk@21
  2. 02

    En Jenkins, añade un nodo nuevo con el método de arranque Launch agent by connecting it to the controller. Jenkins muestra la descarga de agent.jar y el comando exacto para ejecutarlo con tu secreto.

  3. 03

    Ejecuta ese comando en el Mac dentro de tmux, o como LaunchAgent para que se reconecte después de un reinicio.

    tmux new -s jenkins
    curl -sO https://<your-jenkins>/jnlpJars/agent.jar
    # then the java -jar agent.jar ... command Jenkins gave you
  4. 04

    Ponle al nodo la etiqueta macos y limita los jobs correspondientes a esa etiqueta.

Lee la guía completa de Jenkins

La misma máquina, el mismo precio.

Elige tu sistema de CI en el formulario de registro. La URL es opcional para todo menos para la comprobación antifraude, que funciona mejor con ella.