Introducción
Esta guía te muestra cómo agregar un paso a tu flujo de trabajo de integración continua (IC), el cual instale un certificado de firma de código de Apple y perfil de aprovisionamiento en los ejecutores de GitHub Actions. Esto te permitirá firmar tus apps de Xcode para publicarlas en la App Store de Apple o distribuirlas a los grupos de prueba.
Requisitos previos
Deberías estar familiarizado con YAML y la sintaxis para las GitHub Actions. Para más información, vea:
Debes entender la forma en la que la app de Xcode crea y firma las apps. Para más información, consulte la documentación para desarrolladores de Apple.
Crear secretos para tu certificado y perfil de aprovisionamiento
El proceso de inicio de sesión involucra almacenar certificados y perfiles de aprovisionamiento, transferirlos al ejecutor, importarlos en el keychain del ejecutor y utilizarlos en tu compilación.
Para utilizar tu certificado y perfil de aprovisionamiento en un ejecutor, te recomendamos fuertemente que utilices los secretos de GitHub. Para más información sobre cómo crear secretos y usarlos en un flujo de trabajo, consulta Uso de secretos en Acciones de GitHub.
Crea secretos en tu repositorio u organización para los siguientes elementos:
-
Tu certificado de inicio de sesión de Apple.
-
Es el archivo de certificado
p12
. Para obtener más información sobre cómo exportar el certificado de firma desde Xcode, consulte la documentación de Xcode. -
Deberías convertir tu certificado en Base64 cuando lo guartes como secreto. En este ejemplo, el secreto se llama
BUILD_CERTIFICATE_BASE64
. -
Utiliza el siguiente comando para convertir tu certificado en Base64 y cópialo a tu portapapeles:
base64 -i BUILD_CERTIFICATE.p12 | pbcopy
-
-
La contraseña de tu certificado de inicio de sesión de Apple.
- En este ejemplo, el secreto se llama
P12_PASSWORD
.
- En este ejemplo, el secreto se llama
-
Tu perfil de aprovisionamiento de Apple.
-
Para obtener más información sobre cómo exportar el perfil de aprovisionamiento desde Xcode, consulte la documentación de Xcode.
-
Debes convertir tu perfil de aprovisionamiento a Base64 cuando lo guardas como secreto. En este ejemplo, el secreto se llama
BUILD_PROVISION_PROFILE_BASE64
. -
Utiliza el siguiente comando para convertir tu perfil de aprovisionamiento en Base64 y cópialo a tu portapapeles:
base64 -i PROVISIONING_PROFILE.mobileprovision | pbcopy
-
-
Una contraseña de keychain.
- Se creará una keychain nueva en el ejecutor para que la contraseña de esta pueda ser cualquier secuencia aleatoria. En este ejemplo, el secreto se llama
KEYCHAIN_PASSWORD
.
- Se creará una keychain nueva en el ejecutor para que la contraseña de esta pueda ser cualquier secuencia aleatoria. En este ejemplo, el secreto se llama
Agrega un paso a tu flujo de trabajo
Este flujo de trabajo de ejemplo incluye un paso que importa el certificado de Apple y perfil de aprovisionamiento desde los secretos de GitHub y los instala en el ejecutor.
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
En los destinos de compilación de iOS, el perfil de aprovisionamiento debe tener la extensión .mobileprovision
. En los destinos de compilación de macOS, la extensión debe ser .provisionprofile
. El flujo de trabajo de ejemplo anterior debe actualizarse para reflejar la plataforma de destino.
Limpieza requerida en los ejecutores auto-hospedados
Los ejecutores hospedados en GitHub son máquinas virtuales aisladas que se destruyen automáticamente al final de la ejecución del job. Esto significa que los certificados y prefil de aprovisionamiento que se utiliza en el ejecutor durante el job se destruirán con el ejecutor cuando se complete dicho job.
En los ejecutores autohospedados, el directorio $RUNNER_TEMP
se limpia al final de la ejecución del trabajo, pero es posible que la cadena de claves y el perfil de aprovisionamiento sigan existiendo en el ejecutor.
Si utilizas ejecutores auto-programados, deberás agregar un paso final a tu flujo de trabajo para ayudar a asegurarte que estos archivos sensibles se borren al final del job. El paso de flujo de trabajo que se muestra a continuación es un ejemplo de como hacer esto.
- 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