# Установка сертификата Apple в средствах выполнения macOS для разработки в Xcode

Узнайте, как подписать приложения Xcode в рабочем процессе непрерывной интеграции (CI), установив сертификат подписи кода Apple на GitHub Actions модулях выполнения.

## Необходимые компоненты

Вы должны быть знакомы с YAML и синтаксисом для GitHub Actions. Дополнительные сведения см. в разделе:

* [Написание рабочих процессов](/ru/actions/how-tos/write-workflows)
* [Синтаксис рабочего процесса для GitHub Actions](/ru/actions/reference/workflows-and-actions/workflow-syntax)

У вас должно быть представление о создании и подписывании приложений в Xcode. Дополнительные сведения см. в [документации Apple для разработчиков](https://developer.apple.com/documentation/).

## Создание секретов для сертификата и профиля обеспечения

Процесс подписывания включает сохранение сертификатов и профилей обеспечения, их передачу в средство выполнения, импорт в цепочку ключей средства выполнения и использование при сборке.

Чтобы использовать сертификат и профиль подготовки в средстве выполнения, настоятельно рекомендуется использовать GitHub секреты. Дополнительные сведения о создании секретов и их использовании в рабочем процессе см. в разделе [Использование секретов в GitHub Actions](/ru/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).

Создайте секреты в репозитории или организации для перечисленных ниже элементов.

* Сертификат для подписи Apple.

  * Это ваш файл сертификата `p12`. Дополнительные сведения об экспорте сертификата для подписи из Xcode см. в [документации по Xcode](https://help.apple.com/xcode/mac/current/#/dev154b28f09).

  * При сохранении сертификата в качестве секрета необходимо преобразовать его в формат Base64. В этом примере секрет называется `BUILD_CERTIFICATE_BASE64`.

  * Чтобы преобразовать сертификат в формат Base64 и скопировать его в буфер обмена, используйте следующую команду:

    ```shell
    base64 -i BUILD_CERTIFICATE.p12 | pbcopy
    ```

* Пароль сертификата для подписи Apple.
  * В этом примере секрет называется `P12_PASSWORD`.

* Профиль обеспечения Apple.

  * Дополнительные сведения об экспорте профиля обеспечения из Xcode см. в [документации по Xcode](https://help.apple.com/xcode/mac/current/#/deva899b4fe5).

  * При сохранении профиля обеспечения в качестве секрета необходимо преобразовать его в формат Base64. В этом примере секрет называется `BUILD_PROVISION_PROFILE_BASE64`.

  * Чтобы преобразовать профиль обеспечения в формат Base64 и скопировать его в буфер обмена, используйте следующую команду:

    ```shell
    base64 -i PROVISIONING_PROFILE.mobileprovision | pbcopy
    ```

* Пароль цепочки ключей.

  * В средстве выполнения будет создана новая цепочка ключей, поэтому ее паролем может быть любая новая случайная строка. В этом примере секрет называется `KEYCHAIN_PASSWORD`.

## Добавьте этап в рабочий процесс.

В этом примере рабочий процесс включает шаг, который импортирует сертификат Apple и профиль подготовки из GitHub секретов и устанавливает их на средство выполнения.

```yaml copy
name: App build
on: push

jobs:
  build_with_signing:
    runs-on: macos-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
      - name: Install the Apple certificate and provisioning profile
        env:
          BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
          P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
          BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
          KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
        run: |
          # create variables
          CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
          PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision
          KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db

          # import certificate and provisioning profile from secrets
          echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
          echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH

          # create temporary keychain
          security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
          security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
          security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH

          # import certificate to keychain
          security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
          security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
          security list-keychain -d user -s $KEYCHAIN_PATH

          # apply provisioning profile
          mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
          cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
      - name: Build app
          # ...
```

> \[!NOTE]
> Для целевых объектов сборки iOS профиль подготовки должен иметь расширение `.mobileprovision`. Для целевых объектов сборки macOS расширение должно быть `.provisionprofile`. Приведенный выше пример рабочего процесса должен быть обновлен, чтобы отразить целевую платформу.

## Обязательная очистка в локальных средствах выполнения

GitHub-размещенные средства запуска являются изолированными виртуальными машинами, которые автоматически уничтожаются в конце выполнения задания. Это означает, что сертификаты и профиль обеспечения, используемые в средстве выполнения во время выполнения задания, будут уничтожены вместе со средством выполнения после завершения задания.

В локальных средствах выполнения каталог `$RUNNER_TEMP` очищается по завершении выполнения задания, но цепочка ключей и профиль обеспечения могут по-прежнему существовать в средстве выполнения.

Если вы используете локальные средства выполнения, следует добавить последний этап в рабочий процесс, чтобы гарантировать удаление этих конфиденциальных файлов по завершении задания. Примером может служить показанный ниже этап рабочего процесса.

```yaml
- name: Clean up keychain and provisioning profile
  if: ${{ always() }}
  run: |
    security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
    rm ~/Library/MobileDevice/Provisioning\ Profiles/build_pp.mobileprovision
```