Документация

Не на GitHub? Тот же Mac работает с любой крупной CI-системой.

Мы настраиваем за вас GitHub Actions и поддерживаем его напрямую. Но ваша машина представляет собой обычный Mac mini с доступом по SSH. У GitLab, Bitbucket, Buildkite, CircleCI, Azure Pipelines и Jenkins есть агенты, которые работают на macOS. Установите тот, которым пользуетесь. Всё остальное на машине не меняется: закреплённая версия Xcode, тёплые кэши, постоянно активная сессия для симуляторов, один клиент на машину.

Перед началом

  • +Каждый из перечисленных агентов сам подключается к вашему CI. Входящие порты не нужны, поэтому машина, как и сейчас, остаётся недоступной из интернета.
  • +Запускайте агента от пользователя runner, того же, что использует GitHub Actions. Ему принадлежат Xcode, симуляторы и кэши.
  • +Агент должен работать постоянно. Запускайте его как сервис (brew services, svc.sh) или внутри сессии tmux. Для пользователя runner включён автовход, так что графическая сессия для симуляторов и UI-тестов есть.
  • +Xcode установлен и закреплён. Выбирайте версию внутри задачи через xcode-select или DEVELOPER_DIR, так же как на GitHub.
  • +Удалите раннер GitHub, если он вам не нужен, или оставьте его без дела. Когда задач нет, он ничего не стоит.

Сначала подключитесь через Tailscale и зайдите по SSH как runner, как описано в шаге 1 документации по настройке.

GitLab

Раннеры macOS от GitLab стоят в несколько раз дороже Linux. Выделенный Mac с GitLab Runner даёт то же самое по фиксированной цене.

  1. 01

    Установите официальный бинарный файл. GitLab не поддерживает формулу Homebrew и рекомендует этот вариант.

    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

    В проекте или группе откройте настройки CI/CD, создайте раннер и скопируйте его токен. Затем зарегистрируйте его на Mac.

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

    Установите и запустите его как сервис для пользователя runner. Делайте это из терминала в графической сессии (через общий экран), а не по SSH.

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

    Добавьте раннеру теги (например, macos, xcode) и укажите их в задачах в .gitlab-ci.yml.

Полное руководство по GitLab

Bitbucket Pipelines

У Atlassian вообще нет облачных раннеров macOS. Всем, кто собирает iOS на Bitbucket, нужен свой Mac. Именно это мы и предлагаем.

  1. 01

    Раннеру нужна Java. Установите её через Homebrew.

    brew install openjdk@17
  2. 02

    В Bitbucket откройте Repository settings (или Workspace settings), затем Runners, и добавьте раннер типа macOS. Bitbucket покажет команду запуска с id аккаунта, репозитория и раннера и с OAuth-клиентом. Скопируйте её в точности.

  3. 03

    Запустите эту команду на Mac внутри сессии tmux или оберните её в LaunchAgent, чтобы она стартовала при входе.

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

    В bitbucket-pipelines.yml укажите для шага runs-on: [self.hosted, macos] и любые выбранные вами метки.

Buildkite

Buildkite изначально рассчитан на ваши собственные машины. iOS-пайплайн в Buildkite как раз ожидает выделенный Mac.

  1. 01

    Установите агента из Homebrew tap от Buildkite. Свежие версии Homebrew сначала попросят разрешить сторонний tap.

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

    Пропишите токен агента в конфигурационном файле, затем запустите агента как сервис.

    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

    Добавьте правила очередей или тегов в тот же конфигурационный файл и указывайте их в шагах пайплайна.

Полное руководство по Buildkite

CircleCI

Облачный macOS в CircleCI оплачивается поминутно, как и у GitHub. Их self-hosted machine runner работает на macOS и подключается наружу сам.

  1. 01

    В CircleCI создайте resource class для self-hosted раннеров и сгенерируйте токен раннера.

  2. 02

    Установите machine runner из Homebrew tap от CircleCI. Затем выполните шаги настройки для macOS, которые показывает их интерфейс. Они прописывают токен и resource class в конфигурационный файл раннера.

  3. 03

    Запустите раннер как сервис и укажите resource class в задачах в config.yml.

CircleCI часто меняет процесс установки раннера. Используйте точные команды со страницы установки self-hosted раннера для macOS в их документации.

Полное руководство по CircleCI

Azure Pipelines

У облачных агентов macOS от Microsoft ограничена параллельность. Self-hosted агент macOS здесь полноценный вариант.

  1. 01

    В Azure DevOps откройте Organization settings, затем Agent pools, и добавьте агента. Скачайте предложенный пакет агента для macOS.

  2. 02

    Распакуйте его в домашнюю папку runner и настройте с personal access token, у которого есть доступ Agent Pools на чтение и управление.

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

    Установите и запустите его как сервис.

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

    Укажите пул в пайплайне: pool: { name: <your-pool> }.

Jenkins

Команды на Jenkins и так держат своих агентов. Используйте inbound-агента: Mac сам подключается к вашему контроллеру, и входящий порт не нужен.

  1. 01

    Установите Java 21. Текущие LTS-версии Jenkins требуют Java 21 или 25 и на агентах.

    brew install openjdk@21
  2. 02

    В Jenkins добавьте новый узел с методом запуска Launch agent by connecting it to the controller. Jenkins покажет ссылку на agent.jar и точную команду запуска с вашим секретом.

  3. 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
  4. 04

    Добавьте узлу метку macos и ограничьте нужные задачи этой меткой.

Полное руководство по Jenkins

Та же машина, та же цена.

Выберите свою CI-систему в форме регистрации. URL указывать не обязательно. Он пригодится только для проверки на мошенничество, с ним она проходит легче.