{"meta":{"title":"Installieren eines Apple-Zertifikats auf macOS-Runnern für die Xcode-Entwicklung","intro":"Erfahren Sie, wie Sie Xcode-Apps in einem CI-Workflow (Continuous Integration) signieren, indem Sie ein Apple-Codesignaturzertifikat auf GitHub Actions Läufern installieren.","product":"GitHub Actions","breadcrumbs":[{"href":"/de/actions","title":"GitHub Actions"},{"href":"/de/actions/how-tos","title":"Anleitungen"},{"href":"/de/actions/how-tos/deploy","title":"Bereitstellen"},{"href":"/de/actions/how-tos/deploy/deploy-to-third-party-platforms","title":"Bereitstellen auf Drittanbieterplattformen"},{"href":"/de/actions/how-tos/deploy/deploy-to-third-party-platforms/sign-xcode-applications","title":"Signieren von Xcode-Anwendungen"}],"documentType":"article"},"body":"# Installieren eines Apple-Zertifikats auf macOS-Runnern für die Xcode-Entwicklung\n\nErfahren Sie, wie Sie Xcode-Apps in einem CI-Workflow (Continuous Integration) signieren, indem Sie ein Apple-Codesignaturzertifikat auf GitHub Actions Läufern installieren.\n\n## Voraussetzungen\n\nSie sollten mit YAML und der Syntax für GitHub Actions vertraut sein. Weitere Informationen finden Sie unter:\n\n* [Schreiben von Workflows](/de/actions/how-tos/write-workflows)\n* [Workflowsyntax für GitHub Actions](/de/actions/reference/workflows-and-actions/workflow-syntax)\n\nDu solltest sich mit dem Erstellen und Signieren von Xcode-Apps auskennen. Weitere Informationen findest du in der [Apple-Entwicklerdokumentation](https://developer.apple.com/documentation/).\n\n## Erstellen von Geheimnissen für dein Zertifikat und das Bereitstellungsprofil\n\nDer Signaturprozess umfasst das Speichern von Zertifikaten und Bereitstellungsprofilen, das Übertragen an den Runner, das Importieren in die Keychain des Runners und das Verwenden in deinem Build.\n\nUm Ihr Zertifikat und Bereitstellungsprofil auf einem Runner zu verwenden, empfehlen wir dringend, GitHub-Geheimnisse zu verwenden. Weitere Informationen zum Erstellen von Geheimnissen und ihrer Verwendung in einem Workflow findest du unter [Verwenden von Geheimnissen in GitHub-Aktionen](/de/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).\n\nErstelle Geheimnisse für die folgenden Elemente in deinem Repository oder deiner Organisation:\n\n* Dein Apple-Signaturzertifikat\n\n  * Dies ist deine `p12`-Zertifikatdatei. Weitere Informationen zum Exportieren ihres Signaturzertifikats aus Xcode findest du in der [Xcode-Dokumentation](https://help.apple.com/xcode/mac/current/#/dev154b28f09).\n\n  * Du solltest dein Zertifikat in Base64 konvertieren, wenn du es als Geheimnis speicherst. In diesem Beispiel heißt das Geheimnis `BUILD_CERTIFICATE_BASE64`.\n\n  * Verwende den folgenden Befehl, um dein Zertifikat in Base64 zu konvertieren und in deine Zwischenablage zu kopieren:\n\n    ```shell\n    base64 -i BUILD_CERTIFICATE.p12 | pbcopy\n    ```\n\n* Das Kennwort für dein Apple-Signaturzertifikat\n  * In diesem Beispiel heißt das Geheimnis `P12_PASSWORD`.\n\n* Dein Apple-Bereitstellungsprofil\n\n  * Weitere Informationen zum Exportieren ihres Bereitstellungsprofils aus Xcode findest du in der [Xcode-Dokumentation](https://help.apple.com/xcode/mac/current/#/deva899b4fe5).\n\n  * Du solltest dein Bereitstellungsprofil in Base64 konvertieren, wenn du es als Geheimnis speicherst. In diesem Beispiel heißt das Geheimnis `BUILD_PROVISION_PROFILE_BASE64`.\n\n  * Verwende den folgenden Befehl, um dein Bereitstellungsprofil in Base64 zu konvertieren und in deine Zwischenablage zu kopieren:\n\n    ```shell\n    base64 -i PROVISIONING_PROFILE.mobileprovision | pbcopy\n    ```\n\n* Ein Keychainkennwort\n\n  * Auf dem Runner wird eine neue Keychain erstellt, sodass das Kennwort für die neue Keychain eine beliebige neue, zufällige Zeichenfolge sein kann. In diesem Beispiel heißt das Geheimnis `KEYCHAIN_PASSWORD`.\n\n## Hinzufügen eines Schritts zu deinem Workflow\n\nDieser Beispielworkflow enthält einen Schritt, der das Apple-Zertifikat und das Bereitstellungsprofil aus den GitHub Secrets importiert und auf dem Runner installiert.\n\n```yaml copy\nname: App build\non: push\n\njobs:\n  build_with_signing:\n    runs-on: macos-latest\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n      - name: Install the Apple certificate and provisioning profile\n        env:\n          BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}\n          P12_PASSWORD: ${{ secrets.P12_PASSWORD }}\n          BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}\n          KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}\n        run: |\n          # create variables\n          CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12\n          PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision\n          KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db\n\n          # import certificate and provisioning profile from secrets\n          echo -n \"$BUILD_CERTIFICATE_BASE64\" | base64 --decode -o $CERTIFICATE_PATH\n          echo -n \"$BUILD_PROVISION_PROFILE_BASE64\" | base64 --decode -o $PP_PATH\n\n          # create temporary keychain\n          security create-keychain -p \"$KEYCHAIN_PASSWORD\" $KEYCHAIN_PATH\n          security set-keychain-settings -lut 21600 $KEYCHAIN_PATH\n          security unlock-keychain -p \"$KEYCHAIN_PASSWORD\" $KEYCHAIN_PATH\n\n          # import certificate to keychain\n          security import $CERTIFICATE_PATH -P \"$P12_PASSWORD\" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH\n          security set-key-partition-list -S apple-tool:,apple: -k \"$KEYCHAIN_PASSWORD\" $KEYCHAIN_PATH\n          security list-keychain -d user -s $KEYCHAIN_PATH\n\n          # apply provisioning profile\n          mkdir -p ~/Library/MobileDevice/Provisioning\\ Profiles\n          cp $PP_PATH ~/Library/MobileDevice/Provisioning\\ Profiles\n      - name: Build app\n          # ...\n```\n\n> \\[!NOTE]\n> Für iOS-Buildziele sollte dein Bereitstellungsprofil die Endung `.mobileprovision` aufweisen. Für macOS-Buildziele sollte die Erweiterung `.provisionprofile` sein. Der obige Beispielworkflow sollte aktualisiert werden, um deine Zielplattform widerzuspiegeln.\n\n## Erforderliche Bereinigung auf selbstgehosteten Runnern\n\nGitHub-gehostete Runner sind isolierte virtuelle Maschinen, die am Ende der Jobausführung automatisch zerstört werden. Dies bedeutet, dass die Zertifikate und Bereitstellungsprofile, die während des Auftrags auf dem Runner verwendet werden, nach Abschluss des Auftrags mit dem Runner zerstört werden.\n\nBei selbstgehosteten Runnern wird das `$RUNNER_TEMP`-Verzeichnis am Ende der Auftragsausführung bereinigt, doch die Keychain und das Bereitstellungsprofil können noch auf dem Runner vorhanden sein.\n\nWenn du selbstgehostete Runner verwendest, solltest du deinem Workflow einen letzten Schritt hinzufügen, um sicherzustellen, dass diese vertraulichen Dateien am Ende des Auftrags gelöscht werden. Ein Beispiel für diese Vorgehensweise siehst du im unten gezeigten Workflowschritt.\n\n```yaml\n- name: Clean up keychain and provisioning profile\n  if: ${{ always() }}\n  run: |\n    security delete-keychain $RUNNER_TEMP/app-signing.keychain-db\n    rm ~/Library/MobileDevice/Provisioning\\ Profiles/build_pp.mobileprovision\n```"}