Skip to main content
Devin hat jetzt Zugriff auf virtuelle macOS-Maschinen. Damit kann Devin nun iOS- und macOS-Anwendungen erstellen und testen.
Wenn Sie ein Dedicated-SaaS-Deployment nutzen, wenden Sie sich bitte an Ihr Account-Team, um macOS-VMs zu aktivieren.

Funktionsweise

Die macOS-Unterstützung basiert auf demselben System zur deklarativen Konfiguration wie Linux. Das Feld runs-on in Ihrem Blueprint legt fest, auf welcher Plattform Devin baut und ausführt, und jede Plattform erhält ihren eigenen Snapshot. Die wesentlichen Unterschiede zu Linux betreffen die Shell, den Aufbau des Dateisystems und den Paketmanager:

Eine macOS-Sitzung starten

Sie können macOS pro Sitzung auswählen:
  • Blueprint: Fügen Sie runs-on: macos hinzu, damit der Snapshot des Repos für macOS erstellt wird (siehe unten).
  • Slack: Verwenden Sie den Bang-Befehl !mac (Bang-Befehle), um eine Sitzung auf einer macOS-VM zu starten.
  • API: Setzen Sie beim Erstellen einer Sitzung, eines Zeitplans oder einer Automatisierung platform: "macos". Siehe API Reference.

macOS-Blueprints schreiben

Blueprint für eine einzelne Plattform

Wenn dein Repository ausschließlich auf Apple-Plattformen abzielt, verwende runs-on: macos auf oberster Ebene:

Plattformübergreifender Blueprint

Um dasselbe Repository für mehrere Plattformen zu bauen, definieren Sie jede Plattform als eigenes YAML-Dokument, getrennt durch ---. Jedes Dokument deklariert sein eigenes runs-on-Label. Hintergrundinformationen zu diesem Format finden Sie im Hinweis Multi-document YAML im Blueprint-Leitfaden.
Jedes Dokument erzeugt einen separaten Snapshot-Build für seine Plattform. Sitzungen starten vom plattformspezifischen Snapshot.
Das YAML muss auf oberster Ebene ein Mapping sein, keine Sequenz. Wird das obige Beispiel als einzelne Liste geschrieben (- runs-on: default / - runs-on: macos), weist das Backend es zurück. Verwenden Sie den oben gezeigten Trenner ---.

Das Feld runs-on

Das Feld runs-on wird einer registrierten Maschinenkonfiguration in Ihrem Konto zugeordnet: Sie können runs-on als Zeichenkette oder als Liste angeben:
Die Listensyntax führt auf jeder Plattform in der Liste dieselben Befehle aus. Verwende sie nur, wenn die Befehle tatsächlich plattformübergreifend funktionieren (z. B. npm install). Für plattformspezifische Befehle (wie apt-get unter Linux oder brew unter macOS) verwende stattdessen das Mehrdokumentformat.

Nutzung und Kosten

macOS-Sitzungen verursachen dieselbe Nutzung wie vergleichbare Linux- oder Windows-Sitzungen. Ein Aufschlag für macOS fällt nicht an. Einzelheiten zur Erfassung der Nutzung finden Sie unter Nutzung.

Was vorinstalliert ist

macOS-Sitzungs-Images werden mit bereits installierter Apple-Toolchain ausgeliefert, sodass Ihr Blueprint sie nicht erst herunterladen muss: Die Versionen ändern sich, sobald Apple neue Releases veröffentlicht und das Image aktualisiert wird. Um genau zu sehen, was in einer Sitzung vorhanden ist, bitten Sie Devin, Folgendes auszuführen:

Eine Xcode-Version auswählen

Standardmäßig wird das Xcode verwendet, auf das xcode-select verweist. Um für einen einzelnen Befehl eine andere installierte Version zu nutzen, setzen Sie DEVELOPER_DIR:
Verwenden Sie /usr/bin/xcodebuild (den Shim, der DEVELOPER_DIR berücksichtigt) und nicht ein xcodebuild, das über PATH aus dem Verzeichnis Contents/Developer/usr/bin einer bestimmten Xcode-Version bezogen wird, denn dieses meldet unabhängig von DEVELOPER_DIR seine eigene Version. Oder ändern Sie den Standard für die gesamte Sitzung:
Hinterlegen Sie die jeweils benötigte Version in Ihrem Blueprint, damit jede Sitzung mit der richtigen Toolchain startet.

Sitzungsverhalten unter macOS

Shell

macOS-Sitzungen verwenden zsh als Standard-Shell. Die meisten POSIX-Shell-Befehle funktionieren unverändert wie in Linux-Blueprints, beachten Sie jedoch das BSD-Userland: sed -i erfordert ein Argument (sed -i ''), und GNU-Tools wie gsed, gdate und greadlink stammen aus der Homebrew-Formula coreutils.

Pfade

Repositorys werden nach /Users/devin/repos/<repo-name> geklont, und Dateien, die Sie in eine Sitzung hochladen, werden unter /Users/devin/.files/ abgelegt.

Secrets

Secrets stehen während Sitzungen als Umgebungsvariablen zur Verfügung ($SECRET_NAME), genau wie unter Linux. So hinterlegen Sie App Store Connect API keys, Signing-Credentials oder Tokens für private Registries:

Schlafen und Aufwachen von Sitzungen

Beim Schlafen wird von Sitzungen ein Snapshot auf die Festplatte geschrieben. Alles, was auf der Festplatte liegt, übersteht das Aufwachen: installierte Tools, geklonte Repos, Build-Caches, abgeleitete Daten. Laufende Prozesse hingegen nicht: Dev-Server, Simulatoren und Watcher müssen nach dem Aufwachen der Sitzung neu gestartet werden.

Computer Use

Computer Use funktioniert in macOS-Sitzungen: Devin erhält einen vollständigen macOS-Desktop mit Chrome, Maus und Tastatur, kann sowohl macOS-native Apps als auch Web-Apps testen und aufzeichnen, was er dabei tut. Für macOS-Tastenkürzel verwendet Devin die Command-Taste (⌘C, ⌘V, ⌘Tab) statt Control.

iOS-Simulator

Devin kann den iOS-Simulator direkt starten und bedienen:
Der Tab iOS-Simulator im Sitzungs-Workspace streamt den gestarteten Simulator, sodass Sie in Echtzeit verfolgen können, wie Devin sich durch Ihre App tippt. Er ist das Apple-Pendant zur Unterstützung für Android-Emulatoren.

Tipps & Tricks

Build-Caches vorwärmen

Ein kalter Xcode-Build führt zu längeren Build-Zeiten und damit zu einer schlechteren Entwicklererfahrung. Verwende das Feld maintenance in environment.yml, um den Cache vorzuwärmen.
Bezogene Swift-Pakete, CocoaPods und DerivedData bleiben im Snapshot erhalten, sodass neue Sitzungen mit einem inkrementellen Build starten.

Netzwerkzugriff

Builds, die Pakete von CocoaPods, dem Swift Package Manager, Firebase oder einer privaten Registry beziehen, benötigen Zugriff auf diese Hosts. Wenn Ihre Organisation mit einer eingeschränkten Netzwerkrichtlinie arbeitet, stellen Sie sicher, dass die macOS-Allowlist dieselben Registries abdeckt wie Ihre Linux-Builds. Beide werden getrennt konfiguriert, und ein fehlender Eintrag zeigt sich meist als Fehler bei der Abhängigkeitsauflösung oder als TLS-Fehler mitten im Build.

Container ausführen

macOS-VMs bieten keine verschachtelte Hardware-Virtualisierung, weshalb eine Container-Runtime auf die Software-Emulation von QEMU (TCG) zurückgreifen muss. Colima erkennt dies und wechselt selbstständig zur Emulation:
Die VM benötigt zwei bis vier Minuten, bis sie nutzbar ist, und der erste Start kann beim Warten auf SSH in einen Timeout laufen, während der emulierte Gast das Netzwerk hochfährt – führen Sie colima start bei einem Fehlschlag daher einfach erneut aus. Container laufen anschließend auf der CPU etwa 15- bis 25-mal langsamer als nativ und brauchen jeweils einige Sekunden zum Starten; Pulls erfolgen mit der Netzwerkgeschwindigkeit des Hosts. Für einen Container zum Linting oder Packaging reicht das aus, zum Kompilieren ist es jedoch mühsam. Nutzen Sie für containerlastige Aufgaben besser eine Linux-Sitzung oder richten Sie die macOS-Sitzung auf einen entfernten Docker-Daemon aus.

Installiere Xcode nur dann in einem Blueprint, wenn es sich nicht vermeiden lässt

Xcode ist ein mehrere Gigabyte großer Download, und Apple gibt ihn nur mit einer Apple-ID frei. Verwende bevorzugt die Versionen, die bereits im Image enthalten sind, und wähle sie über DEVELOPER_DIR oder xcode-select aus. Wenn du eine andere Version oder eine Beta benötigst, kannst du eine Apple-ID als Secret hinterlegen und den Blueprint diese Version herunterladen lassen – allerdings um den Preis eines deutlich langsameren Builds.

Einschränkungen

Troubleshooting

Builds sind in der ersten Sitzung nach einem Snapshot-Rebuild deutlich langsamer. DerivedData wurde komplett neu erzeugt. Fügen Sie in maintenance einen build-for-testing-Schritt hinzu, damit der Snapshot einen warmen Build enthält. xcodebuild verwendet die falsche Toolchain. Prüfen Sie xcode-select -p und setzen Sie DEVELOPER_DIR im Blueprint-Schritt explizit. Eine Destination wird nicht gefunden. Führen Sie xcrun simctl list devices available aus, um zu sehen, welche Geräte die installierten Runtimes tatsächlich bereitstellen, und passen Sie Namen und Betriebssystem in -destination entsprechend an. Die Auflösung der Abhängigkeiten hängt oder schlägt mit einem TLS-Fehler fehl. Wahrscheinlich fehlt der Host in der Netzwerk-Allowlist Ihrer Organisation für macOS. Siehe Netzwerkzugriff.