{"meta":{"title":"Instalar un certificado de Apple en ejecutores de macOS para el desarrollo de Xcode","intro":"Aprenda cómo firmar aplicaciones de Xcode en un flujo de trabajo de integración continua (CI) instalando un certificado de firma de código de Apple en los runners GitHub Actions.","product":"GitHub Actions","breadcrumbs":[{"href":"/es/actions","title":"GitHub Actions"},{"href":"/es/actions/how-tos","title":"Procedimientos"},{"href":"/es/actions/how-tos/deploy","title":"Desplegar"},{"href":"/es/actions/how-tos/deploy/deploy-to-third-party-platforms","title":"Implementa en plataformas de terceros"},{"href":"/es/actions/how-tos/deploy/deploy-to-third-party-platforms/sign-xcode-applications","title":"Firma de aplicaciones de Xcode"}],"documentType":"article"},"body":"# Instalar un certificado de Apple en ejecutores de macOS para el desarrollo de Xcode\n\nAprenda cómo firmar aplicaciones de Xcode en un flujo de trabajo de integración continua (CI) instalando un certificado de firma de código de Apple en los runners GitHub Actions.\n\n## Requisitos previos\n\nDebe estar familiarizado con YAML y la sintaxis de GitHub Actions. Para más información, vea:\n\n* [Escritura de flujos de trabajo](/es/actions/how-tos/write-workflows)\n* [Sintaxis del flujo de trabajo para Acciones de GitHub](/es/actions/reference/workflows-and-actions/workflow-syntax)\n\nDebes 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](https://developer.apple.com/documentation/).\n\n## Crear secretos para tu certificado y perfil de aprovisionamiento\n\nEl 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.\n\nPara usar su certificado y su perfil de aprovisionamiento en un ejecutor, recomendamos encarecidamente que use secretos 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](/es/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).\n\nCrea secretos en tu repositorio u organización para los siguientes elementos:\n\n* Certificado de firma de Apple.\n\n  * Este es su 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](https://help.apple.com/xcode/mac/current/#/dev154b28f09).\n\n  * Deberías convertir tu certificado en Base64 cuando lo guartes como secreto. En este ejemplo, el secreto se llama `BUILD_CERTIFICATE_BASE64`.\n\n  * Utiliza el siguiente comando para convertir tu certificado en Base64 y cópialo a tu portapapeles:\n\n    ```shell\n    base64 -i BUILD_CERTIFICATE.p12 | pbcopy\n    ```\n\n* La contraseña de tu certificado de inicio de sesión de Apple.\n  * En este ejemplo, el secreto se llama `P12_PASSWORD`.\n\n* Tu perfil de aprovisionamiento de Apple.\n\n  * Para obtener más información sobre cómo exportar el perfil de aprovisionamiento desde Xcode, consulte la [documentación de Xcode](https://help.apple.com/xcode/mac/current/#/deva899b4fe5).\n\n  * Debes convertir tu perfil de aprovisionamiento a Base64 cuando lo guardas como secreto. En este ejemplo, el secreto se llama `BUILD_PROVISION_PROFILE_BASE64`.\n\n  * Utiliza el siguiente comando para convertir tu perfil de aprovisionamiento en Base64 y cópialo a tu portapapeles:\n\n    ```shell\n    base64 -i PROVISIONING_PROFILE.mobileprovision | pbcopy\n    ```\n\n* Una contraseña del llavero.\n\n  * 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`.\n\n## Agrega un paso a tu flujo de trabajo\n\nEste flujo de trabajo de ejemplo incluye un paso que importa el certificado de Apple y el perfil de aprovisionamiento desde los secretos de GitHub y los instala en el ejecutor.\n\n```yaml copy\nname: App build\non: push\n\njobs:\n  build_with_signing:\n    runs-on: macos-latest\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n      - name: Install the Apple certificate and provisioning profile\n        env:\n          BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}\n          P12_PASSWORD: ${{ secrets.P12_PASSWORD }}\n          BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}\n          KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}\n        run: |\n          # create variables\n          CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12\n          PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision\n          KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db\n\n          # import certificate and provisioning profile from secrets\n          echo -n \"$BUILD_CERTIFICATE_BASE64\" | base64 --decode -o $CERTIFICATE_PATH\n          echo -n \"$BUILD_PROVISION_PROFILE_BASE64\" | base64 --decode -o $PP_PATH\n\n          # create temporary keychain\n          security create-keychain -p \"$KEYCHAIN_PASSWORD\" $KEYCHAIN_PATH\n          security set-keychain-settings -lut 21600 $KEYCHAIN_PATH\n          security unlock-keychain -p \"$KEYCHAIN_PASSWORD\" $KEYCHAIN_PATH\n\n          # import certificate to keychain\n          security import $CERTIFICATE_PATH -P \"$P12_PASSWORD\" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH\n          security set-key-partition-list -S apple-tool:,apple: -k \"$KEYCHAIN_PASSWORD\" $KEYCHAIN_PATH\n          security list-keychain -d user -s $KEYCHAIN_PATH\n\n          # apply provisioning profile\n          mkdir -p ~/Library/MobileDevice/Provisioning\\ Profiles\n          cp $PP_PATH ~/Library/MobileDevice/Provisioning\\ Profiles\n      - name: Build app\n          # ...\n```\n\n> \\[!NOTE]\n> 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.\n\n## Limpieza requerida en los ejecutores auto-hospedados\n\nLos ejecutores hospedados de GitHub son máquinas virtuales aisladas que se destruyen automáticamente al final de la ejecución de la tarea. Esto significa que los certificados y perfil de aprovisionamiento que se utiliza en el ejecutor durante el job se destruirán con el ejecutor cuando se complete dicho job.\n\nEn 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.\n\nSi 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.\n\n```yaml\n- name: Clean up keychain and provisioning profile\n  if: ${{ always() }}\n  run: |\n    security delete-keychain $RUNNER_TEMP/app-signing.keychain-db\n    rm ~/Library/MobileDevice/Provisioning\\ Profiles/build_pp.mobileprovision\n```"}