Не на 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 даёт то же самое по фиксированной цене.
- 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
- 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. Всем, кто собирает iOS на Bitbucket, нужен свой 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 изначально рассчитан на ваши собственные машины. iOS-пайплайн в Buildkite как раз ожидает выделенный Mac.
- 01
Установите агента из Homebrew tap от Buildkite. Свежие версии 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
Облачный macOS в CircleCI оплачивается поминутно, как и у GitHub. Их self-hosted machine runner работает на macOS и подключается наружу сам.
- 01
В CircleCI создайте resource class для self-hosted раннеров и сгенерируйте токен раннера.
- 02
Установите machine runner из Homebrew tap от CircleCI. Затем выполните шаги настройки для macOS, которые показывает их интерфейс. Они прописывают токен и resource class в конфигурационный файл раннера.
- 03
Запустите раннер как сервис и укажите resource class в задачах в config.yml.
CircleCI часто меняет процесс установки раннера. Используйте точные команды со страницы установки self-hosted раннера для macOS в их документации.
Полное руководство по CircleCIAzure Pipelines
У облачных агентов macOS от Microsoft ограничена параллельность. Self-hosted агент macOS здесь полноценный вариант.
- 01
В Azure DevOps откройте Organization settings, затем Agent pools, и добавьте агента. Скачайте предложенный пакет агента для macOS.
- 02
Распакуйте его в домашнюю папку runner и настройте с personal access token, у которого есть доступ 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 и так держат своих агентов. Используйте inbound-агента: Mac сам подключается к вашему контроллеру, и входящий порт не нужен.
- 01
Установите Java 21. Текущие LTS-версии Jenkins требуют 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 указывать не обязательно. Он пригодится только для проверки на мошенничество, с ним она проходит легче.