Введение
В этом руководстве показано, как добавить в рабочий процесс непрерывной интеграции (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 и устанавливаются в средстве выполнения.
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 # ...
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