Kotlin 2.4.10 iOS-Build: Remote-Mac-CI 2026 bereitstellen

Diese Anleitung richtet sich an Entwickler und DevOps-Teams, die Kotlin Multiplatform unter Windows oder Linux entwickeln, aber einen echten macOS-Knoten für iOS benötigen. Sie erhalten ein Szenario-Modell für Frameworks, Xcode-Tests, Signierung, Archive, Caches und Wiederanlauf.

Kotlin 2.4.10 iOS-Build: Remote-Mac-CI 2026 bereitstellen

Inhaltsverzeichnis

Kotlin 2.4.10 iOS-Builds sollten Sie 2026 nicht auf Windows oder Linux erzwingen: Lassen Sie gemeinsame Kotlin- und Gradle-Aufgaben dort laufen und routen Sie Framework-Integration, Simulator, Xcode-Test, Signierung und Archive auf einen echten Mac mit installiertem Xcode. Prüfen Sie diese Architektur in dieser Woche mit einem neuen Klon, einem reproduzierbaren XCFramework, einem vollständigen Archive und einem kontrollierten Neustart des Knotens.

Diese Anleitung ist für Sie gedacht, wenn Sie Kotlin Multiplatform überwiegend unter Windows oder Linux entwickeln, einen Apple-Build für Ihre iOS-App benötigen oder als DevOps-Verantwortlicher einen gemeinsam genutzten Mac verwalten. Sie ist außerdem relevant, wenn Signaturgeheimnisse, Caches und Wiederanlauf nicht dem Zufall eines einzelnen Entwicklerarbeitsplatzes überlassen werden sollen.

Letzte Aktualisierung: 27.08.2026. Die Versions- und Zielprüfung wurde anhand der aktuellen Kotlin-Dokumentation zu Apple-Zielen, Frameworks und iOS-Integration sowie der Xcode-Dokumentation zur Build-Ausführung vorgenommen. Die Einordnung von Kotlin 2.4.10 als stabile Version bezieht sich auf den genannten Redaktionsstand; Vorabversionen werden nicht als stabile Grundlage behandelt.

Die Verantwortungsgrenze zwischen Hauptsystem und Remote Mac

Windows oder Linux bleibt der bessere Ort für Quelltextarbeit, Code-Review, allgemeine Gradle-Prüfungen und viele Aufgaben, die keine Apple-Toolchain benötigen. Der Remote Mac übernimmt dagegen nur die Apple-spezifischen Schritte. Diese Trennung reduziert Wartezeiten und verhindert, dass Ihre Pipeline stillschweigend von einer lokalen Xcode-Konfiguration abhängt.

Der wichtigste Grenztest ist nicht, ob ein Entwicklerprojekt auf seinem Rechner funktioniert. Klonen Sie das Repository in ein neues Arbeitsverzeichnis und prüfen Sie, ob der Prozess bis zum Apple-Build gelangt. Fehlen danach Framework-Einstellungen, ein Scheme, ein Simulatorziel oder Signaturdaten, ist die Übergabe nicht reproduzierbar.

Der Datenfluss sollte ausdrücklich dokumentiert werden:

Kotlin dokumentiert die Konfiguration von Multiplatform-Projekten und die Zuordnung von Apple-Zielen; verwenden Sie diese Zieldefinitionen als technische Grundlage, statt eine beliebige macOS-VM als gleichwertig anzunehmen. Die offizielle Übersicht zur Kotlin-Multiplatform-iOS-Integration beschreibt, wie der gemeinsame Kotlin-Code mit dem nativen iOS-Projekt verbunden wird.

Hinweis: Ein SSH-Zugang beweist nur, dass Sie den Rechner erreichen. Er beweist nicht, dass Xcode, Simulator, Scheme, Zertifikat und Arbeitsverzeichnis für einen unbeaufsichtigten Build korrekt eingerichtet sind.

Die drei Ausführungsmodelle im Vergleich

Die folgende Bewertung ist ein redaktionelles Entscheidungsmodell auf einer Skala von 1 bis 5: 5 bedeutet für den jeweiligen CI-Zweck besonders geeignet, 1 bedeutet ungeeignet oder mit erheblichem Zusatzaufwand verbunden. Sie ersetzt keine Prüfung Ihres konkreten Projekts.

Modell Gemeinsamer Kotlin-Code Apple-Ziele und Frameworks Xcode-Test und Archive Reproduzierbarkeit Geeigneter Einsatz
Windows- oder Linux-Hauptsystem 5/5 1/5 1/5 3/5 Entwicklung, Review, allgemeine Gradle-Prüfungen
macOS-VM oder nichtstandardisierte Umgebung 3/5 3/5 2/5 2/5 Labortests, wenn Lizenzierung und Hardwarepfad geklärt sind
Echter Remote Mac mit Xcode 3/5 5/5 5/5 4/5 Dedizierter iOS-Build, Test, Signierung und Veröffentlichung

Das echte Gerät ist nicht automatisch die billigste oder bequemste Lösung. Es ist aber die klarste Wahl, wenn Ihr Ergebnis von Apple-SDKs, Simulatoren, Xcode-Buildphasen oder Signaturwerkzeugen abhängt. Eine virtuelle Umgebung kann für isolierte Experimente ausreichen, darf aber nicht ohne dokumentierte Prüfung als Produktionsknoten gelten.

Bei einem gemeinsam genutzten Mac kommen weitere Kosten hinzu: konkurrierende Arbeitsverzeichnisse, blockierte Simulatoren, veraltete Derived Data, belegte Signaturressourcen und schwer nachvollziehbare Umgebungsvariablen. Die Apple-Dokumentation zu Xcode-Umgebungsvariablen ist deshalb beim Aufbau des Runner-Skripts wichtiger als eine manuelle Einstellung im Xcode-Dialog.

Wenn Sie die Erreichbarkeit und geplante Region eines solchen Knotens vorab vergleichen, können Sie die VPSMAC-Übersicht für verfügbare Mac-Knoten als Ausgangspunkt verwenden. Für die technische Entscheidung bleiben jedoch Xcode-Version, Zielunterstützung, Signaturmodell und Wiederanlauftest maßgeblich, nicht allein der Standort.

Framework-Szenarien für Geräte, Simulatoren und Verteilung

Bei Kotlin/Native müssen Sie unterscheiden, ob Sie unmittelbar in ein Xcode-Projekt integrieren, ein einzelnes Framework für eine interne Struktur erzeugen oder ein verteilbares XCFramework aus mehreren Zielvarianten erstellen. Der Fehler liegt häufig nicht im Kotlin-Code, sondern in der Annahme, ein erfolgreich erzeugtes Einzel-Framework sei bereits ein auslieferbares Produkt.

Planen Sie die Apple-Ziele nach ihrer Verwendung:

Die genauen Zielunterstützungen ändern sich mit Kotlin-, Xcode- und SDK-Versionen. Prüfen Sie daher die Kotlin-Tabelle zur Unterstützung nativer Ziele, bevor Sie die Zielmatrix festschreiben. Aus der Existenz eines Gradle-Tasks darf nicht abgeleitet werden, dass jede Kombination aus SDK, Simulator und Xcode automatisch für die Veröffentlichung geeignet ist.

Für die Abnahme speichern Sie mindestens vier Nachweise:

  1. Den vollständigen Gradle-Task einschließlich Rückgabestatus.
  2. Die Liste der im Framework oder XCFramework enthaltenen Varianten.
  3. Einen erfolgreichen Import in das Xcode-Projekt mit dem vorgesehenen Scheme.
  4. Einen zweiten Lauf aus einem sauberen Arbeitsverzeichnis mit identischem Commit.

Die Kotlin-Anleitung zum Erzeugen nativer Binaries liefert die relevanten Build-Mechanismen. Ihre CI sollte daraus konkrete Aufgaben machen, etwa :shared:linkDebugFrameworkIosSimulatorArm64 oder einen projektspezifischen XCFramework-Task. Verwenden Sie keine Befehle ungeprüft aus diesem Beispiel; Modulname und Task hängen von Ihrer Projektstruktur ab.

Xcode-Integration anhand des Repository-Aufbaus

Direkte Integration, CocoaPods und ein remote erzeugtes Binärartefakt lösen unterschiedliche Probleme. Entscheiden Sie nicht nach Gewohnheit, sondern nach der Frage, wo die gemeinsame Quelle gebaut und wie sie im Team verteilt werden soll.

Bei direkter Integration wird das Kotlin-Modul eng mit dem nativen Projekt gekoppelt. Das ist übersichtlich, wenn ein Repository gemeinsam versioniert wird und jeder iOS-Build das Framework aus demselben Commit erzeugen soll. CocoaPods kann in Projekten sinnvoll sein, die bereits darauf ausgerichtet sind, bringt aber eine zusätzliche Auflösungs- und Installationsphase in die Pipeline. Ein XCFramework oder ein anderes binäres Artefakt eignet sich eher, wenn der Kotlin-Build und das Xcode-Projekt getrennt versioniert oder von verschiedenen Teams verwendet werden.

Unabhängig vom Modell prüfen Sie im Repository:

Der letzte Punkt ist der wichtigste Ende-zu-Ende-Test. Ändern Sie eine kontrollierbare API oder einen eindeutig sichtbaren Build-Marker im gemeinsamen Modul, erzeugen Sie das Framework neu und lassen Sie Xcode daraus bauen. Wenn Xcode weiterhin ein altes Artefakt verwendet, haben Sie zwar einen grünen Gradle-Schritt, aber keine funktionierende Integration.

Die Kotlin-Dokumentation zur iOS-Integration sollte dabei Ihre Entscheidung über den Integrationsweg stützen. Für Swift Package Manager können Sie zusätzlich die offizielle Export-Dokumentation für Kotlin Multiplatform heranziehen. Beide Wege benötigen dennoch eine Prüfung im echten Xcode-Projekt.

Tests werden nach Fehlerquelle und nicht nach Werkzeug sortiert

Ein belastbarer Kotlin-iOS-Build enthält mehrere Testklassen. Sie sollten nicht alle Fehler dem Remote Mac zuschreiben, aber auch nicht versuchen, Apple-spezifische Fehler auf dem Hauptsystem zu simulieren.

Gemeinsame Tests prüfen Geschäftslogik, Serialisierung und plattformunabhängige Module. Sie können gewöhnlich auf Windows oder Linux laufen, sofern Ihre Projektabhängigkeiten dies zulassen. Ein Fehler in diesem Abschnitt gehört zur gemeinsamen Codebasis und sollte vor dem kostenintensiveren Apple-Lauf gestoppt werden.

Kotlin/Native-Tests prüfen die Übersetzung und das Laufzeitverhalten des nativen Zieles. Hier müssen Sie den Zielnamen, Compileroptionen und die erzeugte Variante kontrollieren. Ein grüner Test für eine andere Plattform ist kein Nachweis für das iOS-Ziel.

Xcode-Tests prüfen die native Anwendung, Build Phases, Ressourcen, Framework-Import und das Zusammenspiel mit dem Simulator oder Gerät. Führen Sie sie mit einem expliziten Scheme und einer definierten Destination aus. Apple beschreibt die grundlegenden Abläufe zum Bauen und Ausführen einer App mit Xcode; übernehmen Sie insbesondere die Trennung zwischen Build-Konfiguration und Ausführungsziel in Ihr CI-Skript.

Ein Remote-Simulator ist für automatisierte Tests geeignet, aber nicht jeder Knoten eignet sich für interaktive Fehlersuche. Prüfen Sie, ob der Simulator startet, ob das erwartete Ziel verfügbar ist und ob die grafische Sitzung für die verwendete Xcode-Ausführung funktioniert. Ein SSH-Prozess ohne geeignete Benutzer- oder GUI-Sitzung kann an einer anderen Stelle scheitern als ein lokal gestarteter Test.

Speichern Sie neben dem Exit-Code die Testprotokolle und xcresult-Pakete. Ein Fehlerstatus „1“ sagt Ihnen nicht, ob Framework-Import, Simulatorstart oder ein Testfall fehlgeschlagen ist. Maschinenlesbare Ergebnisse ermöglichen Wiederholung, Trendanalyse und eine nachvollziehbare Übergabe an die zuständige Person.

Archive und Signierung erhalten eigene Stopppunkte

Die Veröffentlichung sollte nicht als ein einziger undurchsichtiger CI-Befehl laufen. Teilen Sie den Prozess in Abhängigkeiten, Framework-Build, Xcode-Test, Archive und Export auf. Für jede Phase definieren Sie Eingaben, Ausgaben und einen Grund, warum der nächste Schritt nicht starten darf.

Eine mögliche Struktur sieht so aus:

  1. Checkout: Commit, Submodule und Konfigurationsdateien werden in einem neuen Arbeitsverzeichnis geladen.
  2. Abhängigkeiten: Gradle- und Xcode-Abhängigkeiten werden aufgelöst; Versionen und Auflösungsfehler werden protokolliert.
  3. Framework: Die benötigten Geräte- und Simulatorvarianten werden gebaut und als Artefakt registriert.
  4. Xcode-Test: Das festgelegte Scheme läuft gegen die festgelegte Destination; xcresult wird archiviert.
  5. Archive: xcodebuild archive erzeugt das Archive nur bei erfolgreich bestandenen Vorstufen.
  6. Export und Prüfung: Das Exportprofil wird explizit angegeben, die Ausgabe wird auf Bundle-ID, Signatur und erwartete Dateien geprüft.

Platzhalter gehören in die Beispiele, nicht echte Geheimnisse:

xcodebuild \
  -workspace "<WORKSPACE>.xcworkspace" \
  -scheme "<SCHEME>" \
  -configuration "<CONFIGURATION>" \
  -destination "generic/platform=iOS" \
  -archivePath "<ARCHIVE_PATH>" \
  archive

Ersetzen Sie <WORKSPACE>, <SCHEME>, <CONFIGURATION> und <ARCHIVE_PATH> in geschützten CI-Variablen oder im versionierten Pipeline-Code. Team-ID, Zertifikatsname, Profilkennung und Schlüsselmaterial dürfen weder im Repository noch in gewöhnlichen Build-Logs erscheinen. Trennen Sie den Account für CI von Ihrem täglichen Entwicklungsaccount und begrenzen Sie seine Rechte.

Apple beschreibt den Workflow für Builds zur Verteilung sowie die Verteilung an registrierte Geräte. Nutzen Sie diese Vorgaben, um Export und Signatur zu prüfen, aber speichern Sie keine geheimen Dateien unverschlüsselt im Arbeitsverzeichnis.

Erfahrungshinweis: Ein erfolgreiches Archive ist noch keine erfolgreiche Veröffentlichung. Prüfen Sie zusätzlich Bundle-ID, enthaltene Signatur, Exporttyp und die Möglichkeit, bei einem fehlgeschlagenen Export das vorherige Artefakt kontrolliert wiederzuverwenden.

Runner-Routing, Caches und Wiederanlauf

Ein CI-System sollte iOS-Aufgaben nicht zufällig auf jedem verfügbaren Runner ausführen. Kennzeichnen Sie den Remote Mac mit einem eindeutigen Label, etwa macos-ios-kotlin, und routen Sie nur Apple-spezifische Jobs dorthin. Für selbstverwaltete Runner beschreibt die Dokumentation zu Runner-Labels, wie Jobs gezielt zugeordnet werden. Die konkrete CI-Syntax hängt von Ihrer Plattform ab.

Isolieren Sie mindestens diese Cache-Gruppen:

Bewahren Sie nicht automatisch Derived Data zwischen inkompatiblen Xcode- oder Kotlin-Konfigurationen auf. Ein Cache-Treffer ist nur dann nützlich, wenn er schneller zum richtigen Artefakt führt. Erfassen Sie Schlüssel, Trefferstatus, Commit, Toolchain und Löschgrund. Bei unerklärlichen Framework- oder Linkerfehlern muss ein kontrollierter Lauf ohne die betreffende Cache-Gruppe möglich sein.

Auf gemeinsam genutzten Knoten darf kein paralleler Auftrag dasselbe Arbeitsverzeichnis, denselben Simulator oder dieselbe Signaturressource verwenden. Verwenden Sie pro Auftrag einen isolierten Checkout und eindeutige Pfade. Begrenzen Sie Parallelität dort, wo Xcode oder der Simulator instabil wird, statt einen grünen Status durch zufällige Wiederholungen vorzutäuschen.

Führen Sie die Betriebsprüfung in dieser Reihenfolge durch:

  1. SSH-Verbindung trennen, während ein nichtinteraktiver Build läuft.
  2. Prüfen, ob der Prozess und seine Logs unabhängig von der Sitzung weiterlaufen.
  3. Den Mac kontrolliert neu starten.
  4. Nach dem Neustart Runner, Xcode-Lizenzstatus, verfügbare Ziele und Arbeitsverzeichnisse prüfen.
  5. Einen neuen Auftrag in einem frischen Checkout einplanen.
  6. Framework, Xcode-Test und Archive erneut ausführen.
  7. Bei einem Fehler anhand der gespeicherten Logs entscheiden, ob Bereinigung, Neuplanung oder Rollback nötig ist.

Erst wenn alle Schritte ohne manuelle Klicks funktionieren, ist der Knoten für einen dauerhaften CI-Betrieb geeignet. Für kurze Projekte oder eine einmalige Release-Serie kann eine zeitweise gemietete Maschine wirtschaftlicher sein als ein dauerhaft reservierter Mac. Wenn Sie mehrere Standorte vergleichen, können Sie beispielsweise die verfügbaren Mac-Knoten von VPSMAC nach Erreichbarkeit und geplanter Nutzung prüfen; die technische Abnahme bleibt trotzdem Ihre Aufgabe.

Die Abnahme als klare Entscheidungsmatrix

Setzen Sie den Knoten nicht produktiv ein, solange eine dieser Bedingungen offen ist:

Erfüllt Ihr Projekt dagegen den sauberen Klon, den Framework-Import, den Testnachweis, das Archive und den Wiederanlauf, können Sie den Remote Mac als unabhängigen Apple-Build-Knoten betreiben. Das entspricht der sinnvollen Zuständigkeitsverteilung: Windows oder Linux bleibt der Hauptarbeitsplatz, während der Mac nur die Aufgaben übernimmt, für die macOS und Xcode tatsächlich erforderlich sind.

Häufige Fragen zur Kotlin-iOS-CI

Kein lokaler Mac bedeutet nicht automatisch kein iOS-Build

Sie können den größten Teil der Kotlin-Multiplatform-Entwicklung ohne lokalen Mac erledigen. Für einen vollständigen iOS-Build brauchen Sie aber einen realen oder anderweitig zulässigen macOS-Ausführungspfad. Der Remote Mac muss nicht Ihre gesamte Desktopumgebung ersetzen; er muss den Apple-Teil vom sauberen Checkout bis zum signierten Archive zuverlässig und unbeaufsichtigt ausführen.

macOS-Aufgaben sollten explizit im Pipeline-Modell stehen

Kotlin/Native-Apple-Ziele, Framework-Generierung für iOS, Simulator-Tests, Xcode-Tests und Archive gehören auf den macOS-Runner. Gemeinsame Kotlin-Tests, statische Prüfungen und viele Gradle-Aufgaben können vorher auf Windows oder Linux laufen. Diese Aufteilung verkürzt den Fehlerpfad: Ein Log zeigt dann, ob die gemeinsame Logik oder die Apple-Integration verantwortlich ist.

XCFrameworks brauchen mehr als einen grünen Gradle-Task

Erzeugen Sie zunächst die im Projekt benötigten Geräte- und Simulatorvarianten. Prüfen Sie danach die enthaltenen Architekturen, den Import in das Xcode-Scheme und einen zweiten Lauf aus einem neuen Checkout. Wenn Ihr Team das Artefakt verteilt, versionieren Sie zusätzlich den Commit, die Toolchain und den Erzeugungsparameter. So bleibt erkennbar, welche Ausgabe tatsächlich getestet wurde.

Automatische Archive benötigen geschützte Eingaben

Für eine CI-Archivierung müssen Workspace, Scheme, Konfiguration, Destination und Exportweg feststehen. Zertifikate, Profile, Team-ID und Schlüssel werden zur Laufzeit aus geschützten Variablen oder einem Geheimnisspeicher bezogen. Nach dem Export prüfen Sie Bundle-ID und Signatur. Ein manueller Xcode-Klick darf kein versteckter Bestandteil des Freigabeprozesses sein.

Caches müssen messbar und projektbezogen sein

Gradle-, Kotlin/Native- und Xcode-Caches können Wiederholungen beschleunigen, dürfen aber nicht zwischen inkompatiblen Toolchains oder Projekten vermischt werden. Verwenden Sie getrennte Schlüssel und Arbeitsverzeichnisse, protokollieren Sie Treffer und testen Sie regelmäßig einen Lauf ohne Cache. Wenn nur der Cache-Lauf funktioniert, ist Ihr Build nicht reproduzierbar.

Die sinnvolle nächste Entscheidung

Wenn Sie den gemeinsamen Kotlin-Code bereits unter Windows oder Linux entwickeln können, aber für Frameworks, Simulatoren, Xcode-Tests und Archive keinen stabilen Apple-Ausgang besitzen, ist ein echter Remote Mac zunächst die pragmatischere Zwischenlösung als ein sofortiger Hardwarekauf. Eine lokale oder virtuelle Ersatzumgebung kann bei Apple-Zielen, grafischen Sitzungen, Signierung und reproduzierbaren Xcode-Versionen zusätzliche Unsicherheit erzeugen; ein dauerhaft eigener Mac ist dagegen für kurze Projekte, wechselnde Kapazität oder einzelne Release-Zyklen oft unnötig gebunden.

Mieten Sie bei VPSMAC zunächst einen Remote Mac für einen begrenzten Prüfzeitraum, führen Sie den sauberen Klon und die vollständige Abnahmematrix aus und entscheiden Sie erst danach über einen länger laufenden CI-Knoten. So bezahlen Sie nicht für eine vermeintliche Lösung, bevor Framework-Erzeugung, Xcode CI, Signierung und Neustart-Wiederherstellung in Ihrem eigenen Repository nachgewiesen sind.

Häufige Fragen

Kann ein Kotlin-Multiplatform-Projekt ohne lokalen Mac für iOS gebaut werden?

Ja, die gemeinsame Kotlin-Entwicklung und viele Gradle-Prüfungen können unter Windows oder Linux laufen. Für den vollständigen iOS-Pfad benötigen Sie jedoch einen macOS-Knoten mit Xcode: Dort werden Apple-Ziele, Simulatoren, Xcode-Tests, Signierung und Archive ausgeführt. Ein Remote Mac ersetzt dabei nicht zwingend Ihren lokalen Arbeitsplatz, sondern stellt den reproduzierbaren Apple-Build-Ausgang bereit.

Welche Kotlin-Multiplatform-Aufgaben müssen auf macOS ausgeführt werden?

Auf macOS gehören vor allem Kotlin/Native-Builds für Apple-Ziele, die Framework-Übergabe an Xcode, Simulator- und Gerätetests sowie Archive und Export mit Xcode. Gemeinsame Quelltextprüfungen und plattformunabhängige Gradle-Aufgaben können getrennt davon laufen. Entscheidend ist, dass die Pipeline die Grenze technisch erzwingt und nicht nur auf der Entwicklerdokumentation beschreibt.

Wie erzeugt und prüft man ein Kotlin-XCFramework auf einem Remote Mac?

Definieren Sie die benötigten Apple-Ziele, erzeugen Sie das XCFramework mit dem vorgesehenen Kotlin-Gradle-Task und prüfen Sie anschließend die enthaltenen Architekturen sowie den Import in das Xcode-Projekt. Ein erfolgreicher Einzel-Build reicht nicht aus: Die Abnahme sollte zusätzlich eine Geräte- und Simulatorvariante, einen sauberen Klon und eine wiederholbare Erzeugung dokumentieren.

Wie bindet man ein Kotlin-Multiplatform-iOS-Projekt in CI für automatische Archive ein?

Trennen Sie Abhängigkeiten, Framework-Erzeugung, Xcode-Test, Archive und Export in beobachtbare CI-Schritte. Der Runner muss anhand eines Labels auf den macOS-Knoten geleitet werden. Zertifikate, Profile und Schlüssel gehören in einen geschützten Geheimnisspeicher. Als Freigabekriterium gilt ein Archive ohne manuelle Klicks, dessen Ausgabe und Signatur anschließend maschinell geprüft werden.

Welche Gradle- und Xcode-Dateien sollte ein Kotlin-iOS-Build-Knoten zwischenspeichern?

Typische Kandidaten sind Gradle-Abhängigkeiten, Kotlin/Native-Artefakte, Xcode Derived Data und projektspezifische Paketquellen. Bewahren Sie jedoch nicht automatisch alles dauerhaft auf. Messen Sie zunächst Cache-Treffer, Laufzeit und Speicherverbrauch, isolieren Sie die Verzeichnisse pro Projekt und löschen Sie sie nach einem definierten Fehler- oder Versionswechsel kontrolliert.

Weiterführende Artikel