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