Doku

Nicht auf GitHub? Derselbe Mac funktioniert mit jeder großen CI.

Wir richten GitHub Actions für Sie ein und unterstützen es direkt. Ihre Maschine ist aber ein normaler Mac mini mit SSH-Zugang. GitLab, Bitbucket, Buildkite, CircleCI, Azure Pipelines und Jenkins haben alle Agents, die unter macOS laufen. Installieren Sie den, den Sie nutzen. Der Rest der Maschine bleibt gleich: fest eingestelltes Xcode, warme Caches, eine dauerhaft angemeldete Sitzung für Simulatoren und ein Kunde pro Maschine.

Bevor Sie anfangen

  • +Jeder der genannten Agents baut die Verbindung zu Ihrer CI von sich aus auf. Kein eingehender Port ist nötig. Die Maschine bleibt also genau wie heute vom öffentlichen Internet getrennt.
  • +Betreiben Sie den Agent als Benutzer runner, also mit demselben Konto wie GitHub Actions. Ihm gehören Xcode, die Simulatoren und die Caches.
  • +Halten Sie ihn am Laufen. Starten Sie ihn als Dienst (brew services, svc.sh) oder in einer tmux-Sitzung. Der Benutzer runner wird automatisch angemeldet. So gibt es eine GUI-Sitzung für Simulatoren und UI-Tests.
  • +Xcode ist installiert und fest eingestellt. Wählen Sie eine Version in Ihrem Job mit xcode-select oder DEVELOPER_DIR, genau wie bei GitHub.
  • +Entfernen Sie den GitHub-Runner, wenn Sie ihn nicht nutzen, oder lassen Sie ihn untätig. Ohne Jobs kostet er nichts.

Verbinden Sie sich zuerst über Tailscale und melden Sie sich per SSH als runner an, genau wie in Schritt 1 der Setup-Doku.

GitLab

Die gehosteten macOS-Runner von GitLab kosten ein Vielfaches des Linux-Preises. Ein dedizierter Mac mit GitLab Runner ist dasselbe zum Festpreis.

  1. 01

    Installieren Sie das offizielle Binary. GitLab pflegt die Homebrew-Formel nicht und empfiehlt stattdessen diesen Weg.

    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

    Öffnen Sie in Ihrem Projekt oder Ihrer Gruppe die CI/CD-Einstellungen, legen Sie einen Runner an und kopieren Sie sein Token. Registrieren Sie ihn dann auf dem Mac.

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

    Installieren und starten Sie ihn als Dienst für den Benutzer runner. Nutzen Sie dafür ein Terminal in der Desktop-Sitzung (Bildschirmfreigabe), nicht SSH.

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

    Geben Sie dem Runner Tags (zum Beispiel macos, xcode) und nutzen Sie diese Tags in den Jobs Ihrer .gitlab-ci.yml.

Den vollständigen Ratgeber zu GitLab lesen

Bitbucket Pipelines

Atlassian bietet überhaupt keine gehosteten macOS-Runner an. Wer auf Bitbucket für iOS baut, muss einen Mac selbst betreiben. Genau das ist dieses Angebot.

  1. 01

    Der Runner braucht Java. Installieren Sie es mit Homebrew.

    brew install openjdk@17
  2. 02

    Öffnen Sie in Bitbucket die Repository settings (oder Workspace settings), dann Runners, und fügen Sie einen Runner vom Typ macOS hinzu. Bitbucket zeigt Ihnen einen Startbefehl mit den IDs für Konto, Repository und Runner sowie einem OAuth-Client. Kopieren Sie ihn genau so.

  3. 03

    Führen Sie diesen Befehl auf dem Mac in einer tmux-Sitzung aus, oder verpacken Sie ihn in einen LaunchAgent, damit er bei der Anmeldung startet.

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

    Geben Sie dem Schritt in bitbucket-pipelines.yml runs-on: [self.hosted, macos] und dazu jedes Label, das Sie gewählt haben.

Buildkite

Bei Buildkite bringen Sie die Rechenleistung grundsätzlich selbst mit. Eine iOS-Pipeline auf Buildkite erwartet genau so einen dedizierten Mac.

  1. 01

    Installieren Sie den Agent aus dem Homebrew-Tap von Buildkite. Aktuelle Homebrew-Versionen fragen zuerst, ob Sie einem Tap eines Drittanbieters vertrauen.

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

    Tragen Sie Ihr Agent-Token in die Konfigurationsdatei ein und starten Sie den Agent dann als Dienst.

    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

    Legen Sie in derselben Konfigurationsdatei Queue- oder Tag-Regeln fest und sprechen Sie diese aus Ihren Pipeline-Schritten an.

Den vollständigen Ratgeber zu Buildkite lesen

CircleCI

Das gehostete macOS von CircleCI wird wie bei GitHub nach Verbrauch abgerechnet. Der self-hosted Machine Runner läuft unter macOS und verbindet sich ausgehend.

  1. 01

    Legen Sie in CircleCI eine Resource Class für self-hosted Runner an und erzeugen Sie ein Runner-Token.

  2. 02

    Installieren Sie den Machine Runner aus dem Homebrew-Tap von CircleCI. Folgen Sie den Konfigurationsschritten, die die Oberfläche für macOS zeigt. Sie tragen das Token und die Resource Class in die Konfigurationsdatei des Runners ein.

  3. 03

    Starten Sie den Runner als Dienst und sprechen Sie die Resource Class aus den Jobs Ihrer config.yml an.

CircleCI ändert den Installationsablauf des Runners oft. Folgen Sie den genauen Befehlen auf der Installationsseite für self-hosted Runner unter macOS.

Den vollständigen Ratgeber zu CircleCI lesen

Azure Pipelines

Die gehosteten macOS-Agents von Microsoft sind bei der Parallelität begrenzt. Ein self-hosted macOS-Agent ist eine vollwertige Option.

  1. 01

    Öffnen Sie in Azure DevOps die Organization settings, dann Agent pools, und fügen Sie einen Agent hinzu. Laden Sie das angebotene macOS-Agent-Paket herunter.

  2. 02

    Entpacken Sie es im Home-Verzeichnis des Benutzers runner. Konfigurieren Sie es mit einem Personal Access Token mit dem Scope Agent Pools read and manage.

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

    Installieren und starten Sie es als Dienst.

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

    Richten Sie Ihre Pipeline auf den Pool aus: pool: { name: <your-pool> }.

Jenkins

Wer Jenkins nutzt, betreibt seine Agents ohnehin selbst. Nutzen Sie einen Inbound-Agent. Dann verbindet sich der Mac selbst mit Ihrem Controller und braucht keinen eingehenden Port.

  1. 01

    Installieren Sie Java 21. Aktuelle Jenkins-LTS-Versionen brauchen auch auf den Agents Java 21 oder 25.

    brew install openjdk@21
  2. 02

    Legen Sie in Jenkins einen neuen Node mit der Startmethode Launch agent by connecting it to the controller an. Jenkins zeigt den Download von agent.jar und den genauen Startbefehl mit Ihrem Secret.

  3. 03

    Führen Sie diesen Befehl auf dem Mac in tmux aus, oder als LaunchAgent, damit er sich nach einem Neustart wieder verbindet.

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

    Geben Sie dem Node das Label macos und beschränken Sie die passenden Jobs auf dieses Label.

Den vollständigen Ratgeber zu Jenkins lesen

Gleiche Maschine, gleicher Preis.

Wählen Sie Ihr CI-System im Anmeldeformular. Die URL ist für alles optional außer für die Betrugsprüfung. Die funktioniert mit URL besser.