Skip to main content

Enterprise Server 3.15 в настоящее время доступен в качестве кандидата на выпуск.

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

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

Примечание. В GitHub Enterprise Server в настоящее время не поддерживаются средства выполнения тестов, размещенные в GitHub. Дополнительные сведения о планируемой поддержке в будущем см. в GitHub public roadmap.

Введение

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

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

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

У вас должно быть представление о создании и подписывании приложений в Xcode. Дополнительные сведения см. в документации Apple для разработчиков.

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

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

Для применения сертификата и профиля обеспечения в средстве выполнения настоятельно рекомендуется использовать секреты GitHub. Дополнительные сведения о создании секретов и их использовании в рабочем процессе см. в разделе "Использование секретов в GitHub Actions".

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

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

    • Это ваш файл сертификата p12. Дополнительные сведения об экспорте сертификата для подписи из Xcode см. в документации по Xcode.

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

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

      base64 -i BUILD_CERTIFICATE.p12 | pbcopy
      
  • Пароль сертификата для подписи Apple.

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

    • Дополнительные сведения об экспорте профиля обеспечения из Xcode см. в документации по Xcode.

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

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

      base64 -i PROVISIONING_PROFILE.mobileprovision | pbcopy
      
  • Пароль цепочки ключей.

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

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

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

YAML
name: App build
on: push

jobs:
  build_with_signing:
    runs-on: macos-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - 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 очищается по завершении выполнения задания, но цепочка ключей и профиль обеспечения могут по-прежнему существовать в средстве выполнения.

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

- 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