Примечание.
GitHubразмещенные в данный момент средства выполнения не поддерживаются в GitHub Enterprise Server.
Необходимые компоненты
Требуются знания 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@v5
- 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@v5
- 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
# ...
Примечание.
Для целевых объектов сборки 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