{"meta":{"title":"Установка сертификата Apple в средствах выполнения macOS для разработки в Xcode","intro":"Узнайте, как подписать приложения Xcode в рабочем процессе непрерывной интеграции (CI), установив сертификат подписи кода Apple на GitHub Actions модулях выполнения.","product":"GitHub Actions","breadcrumbs":[{"href":"/ru/actions","title":"GitHub Actions"},{"href":"/ru/actions/how-tos","title":"Инструкции"},{"href":"/ru/actions/how-tos/deploy","title":"Развернуть"},{"href":"/ru/actions/how-tos/deploy/deploy-to-third-party-platforms","title":"Развертывание на сторонних платформах"},{"href":"/ru/actions/how-tos/deploy/deploy-to-third-party-platforms/sign-xcode-applications","title":"Подписывание приложений Xcode"}],"documentType":"article"},"body":"# Установка сертификата Apple в средствах выполнения macOS для разработки в Xcode\n\nУзнайте, как подписать приложения Xcode в рабочем процессе непрерывной интеграции (CI), установив сертификат подписи кода Apple на GitHub Actions модулях выполнения.\n\n## Необходимые компоненты\n\nВы должны быть знакомы с YAML и синтаксисом для GitHub Actions. Дополнительные сведения см. в разделе:\n\n* [Написание рабочих процессов](/ru/actions/how-tos/write-workflows)\n* [Синтаксис рабочего процесса для GitHub Actions](/ru/actions/reference/workflows-and-actions/workflow-syntax)\n\nУ вас должно быть представление о создании и подписывании приложений в Xcode. Дополнительные сведения см. в [документации Apple для разработчиков](https://developer.apple.com/documentation/).\n\n## Создание секретов для сертификата и профиля обеспечения\n\nПроцесс подписывания включает сохранение сертификатов и профилей обеспечения, их передачу в средство выполнения, импорт в цепочку ключей средства выполнения и использование при сборке.\n\nЧтобы использовать сертификат и профиль подготовки в средстве выполнения, настоятельно рекомендуется использовать GitHub секреты. Дополнительные сведения о создании секретов и их использовании в рабочем процессе см. в разделе [Использование секретов в GitHub Actions](/ru/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).\n\nСоздайте секреты в репозитории или организации для перечисленных ниже элементов.\n\n* Сертификат для подписи Apple.\n\n  * Это ваш файл сертификата `p12`. Дополнительные сведения об экспорте сертификата для подписи из Xcode см. в [документации по Xcode](https://help.apple.com/xcode/mac/current/#/dev154b28f09).\n\n  * При сохранении сертификата в качестве секрета необходимо преобразовать его в формат Base64. В этом примере секрет называется `BUILD_CERTIFICATE_BASE64`.\n\n  * Чтобы преобразовать сертификат в формат Base64 и скопировать его в буфер обмена, используйте следующую команду:\n\n    ```shell\n    base64 -i BUILD_CERTIFICATE.p12 | pbcopy\n    ```\n\n* Пароль сертификата для подписи Apple.\n  * В этом примере секрет называется `P12_PASSWORD`.\n\n* Профиль обеспечения Apple.\n\n  * Дополнительные сведения об экспорте профиля обеспечения из Xcode см. в [документации по Xcode](https://help.apple.com/xcode/mac/current/#/deva899b4fe5).\n\n  * При сохранении профиля обеспечения в качестве секрета необходимо преобразовать его в формат Base64. В этом примере секрет называется `BUILD_PROVISION_PROFILE_BASE64`.\n\n  * Чтобы преобразовать профиль обеспечения в формат Base64 и скопировать его в буфер обмена, используйте следующую команду:\n\n    ```shell\n    base64 -i PROVISIONING_PROFILE.mobileprovision | pbcopy\n    ```\n\n* Пароль цепочки ключей.\n\n  * В средстве выполнения будет создана новая цепочка ключей, поэтому ее паролем может быть любая новая случайная строка. В этом примере секрет называется `KEYCHAIN_PASSWORD`.\n\n## Добавьте этап в рабочий процесс.\n\nВ этом примере рабочий процесс включает шаг, который импортирует сертификат Apple и профиль подготовки из GitHub секретов и устанавливает их на средство выполнения.\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> Для целевых объектов сборки iOS профиль подготовки должен иметь расширение `.mobileprovision`. Для целевых объектов сборки macOS расширение должно быть `.provisionprofile`. Приведенный выше пример рабочего процесса должен быть обновлен, чтобы отразить целевую платформу.\n\n## Обязательная очистка в локальных средствах выполнения\n\nGitHub-размещенные средства запуска являются изолированными виртуальными машинами, которые автоматически уничтожаются в конце выполнения задания. Это означает, что сертификаты и профиль обеспечения, используемые в средстве выполнения во время выполнения задания, будут уничтожены вместе со средством выполнения после завершения задания.\n\nВ локальных средствах выполнения каталог `$RUNNER_TEMP` очищается по завершении выполнения задания, но цепочка ключей и профиль обеспечения могут по-прежнему существовать в средстве выполнения.\n\nЕсли вы используете локальные средства выполнения, следует добавить последний этап в рабочий процесс, чтобы гарантировать удаление этих конфиденциальных файлов по завершении задания. Примером может служить показанный ниже этап рабочего процесса.\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```"}