Blog

Swift-Makros in CI/CD verwenden, ohne die Sicherheit zu beeinträchtigen

Michał Kowalski

Aktualisiert Oktober 15, 2025
3 Minuten

Während der Arbeit am RoomKeeper App, wollten wir ausprobieren XCTestParametrizedMacro um ein paar Testmethoden in Unit-Tests zu parametrisieren. Es war recht einfach, es lokal zu erstellen, aber wir sind auf ein kleines Problem bei der Erstellung in Xcode Cloud gestoßen.

Wenn Sie ein Makro eines Drittanbieters in Ihr Projekt integrieren, müssen Sie bestätigen, dass Sie ihm vertrauen und es aktivieren. Wenn Sie dies nicht tun, lässt sich das Projekt einfach nicht erstellen. Das ist kein Problem, wenn Sie auf Ihrem lokalen Rechner entwickeln, weil Sie einfach auf die Schaltfläche klicken. Ein Problem entsteht jedoch, wenn Sie ein Projekt auf einem entfernten Rechner wie in unserem Fall Xcode Cloud erstellen möchten.

Makroüberprüfung überspringen

Ich konnte in der Dokumentation von Apple keine offiziellen Informationen darüber finden, wie Sie Swift Macro in der Xcode Cloud aktivieren können. Die einzige Information, die ich gefunden habe, besagt, dass Sie den Makro-Validierungsmechanismus vollständig deaktivieren können. Sie können dies auf zwei Arten tun: indem Sie das Flag -skipMacroValidation an den Befehl xcodebuild übergeben oder indem Sie die macOS-Eingabevorgaben ändern (z.B. im Post-Clone-Skript).

defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES

Ich glaube nicht, dass das Überspringen der Fingerabdrucküberprüfung für alle Makros eine gute Praxis im Hinblick auf die Sicherheit ist. Besser wäre eine Whitelist - eine Liste mit allen Makros, die Sie im Projekt ausdrücklich zugelassen haben.

Vertrauensspezifisches Makro

Wenn Sie weitere Nachforschungen anstellen, werden Sie feststellen, dass SPM eine Liste der erlaubten Makros in einer einzigen JSON-Datei verwaltet.

Wenn Sie ein bestimmtes Makro in Xcode aktivieren, wird es zu dieser Datei hinzugefügt, die sich an einem bestimmten Ort befindet. ~/Library/org.swift.swiftpm/security/macros.json

Wenn Sie diese Datei mit einem Texteditor öffnen, werden Sie feststellen, dass jeder Makroeintrag das vorgegebene Format hat.

{ 
    "fingerprint": "5ac90d9265dc412789d277c006f4138457dd2d14", 
    "packageIdentity": "xctestparametrizedmacro", 
    "targetName": "XCTestParametrizedMacroMacros" 
} 

Beachten Sie, dass der Fingerabdruckwert ein Git-Hash-Commit ist, wenn Sie ein Makro aus dem GitHub-Repository verwenden, und dass er sich ändern kann, wenn Sie ein Makro auf die neueste Version aktualisieren. Bei Paketen, die über die Paketregistrierung verteilt werden, ist der Fingerabdruckwert eine Prüfsumme aus dem Quellarchiv. mehr Infos

PackageIdentity ist die letzte Pfadkomponente (Kleinbuchstaben) der Repository-URL.

Mit diesen Informationen können wir eine Liste der vertrauenswürdigen Makros vorbereiten und diese vor dem Build des Projekts in den internen SPM-Speicherort in der Xcode Cloud kopieren.

Sie können dies tun, indem Sie ein kleines Post-Klon-Skript ci_post_clone.sh im Verzeichnis ci_scripts erstellen. Sie sollten diesem Verzeichnis auch die Datei hinzufügen, die eine Liste der erlaubten Makros enthält. Nun sollte die Skriptdatei nur noch den Befehl cp enthalten, der die Datei in das interne SPM-Verzeichnis kopiert.

#!/bin/zsh 

cp macros.json ~/Library/org.swift.swiftpm/security/ 

Wenn Sie die Änderungen übertragen und den Build auslösen, erkennt Xcode das Makro als vertrauenswürdig und das Projekt kann erfolgreich gebaut werden.

Zusammenfassung

Obwohl diese Lösung für Swift-Makros mit der aktuellen Version von Xcode funktioniert, kann ich nicht garantieren, dass sie auch mit zukünftigen Versionen funktionieren wird. Der gleiche Ansatz kann für Swift-Paket-Plugins angewendet werden, aber statt macros.json müssen Sie plugins.json ändern.

Bleibt zu hoffen, dass Apple auf der kommenden WWDC eine Funktion vorstellt, die diesen Prozess ein wenig reibungsloser gestaltet.

Verfasst von

Michał Kowalski

He is passionate about mobile technologies, with a focus on the iOS platform. Currently programming in Swift but possesses strong Objective-C skills. While his expertise primarily lies in native technologies, he has also successfully implemented a commercial project using Flutter.

Contact

Let’s discuss how we can support your journey.