xcodebuild en una VM de macOS y se autentica con una clave de API de App Store Connect que guardas como secretos de Devin.
Antes de que Devin pueda subir una compilación, debes:
- Configurar tu app en App Store Connect.
- Crear una clave de API de App Store Connect.
- Agregar la clave y tu Team ID a Devin como secretos.
- Asegurarte de que Devin pueda acceder a los servidores de Apple.
Subir a TestFlight requiere sesiones de macOS. Si usas un despliegue de SaaS dedicado, contacta a tu account team para habilitar las VM de macOS.
Requisitos
Configurar App Store Connect
1
Aceptar los acuerdos más recientes
El Account Holder inicia sesión en App Store Connect y acepta los acuerdos pendientes en Business. Las subidas fallan mientras quede algún acuerdo obligatorio pendiente.
2
Registrar el bundle ID
En el portal de Apple Developer, ve a Certificates, Identifiers & Profiles → Identifiers y registra un App ID que coincida con el bundle ID del target de tu app. Omite este paso si el identificador ya existe.
3
Crear el registro de la app
En App Store Connect, ve a Apps, haz clic en + y selecciona New App. Elige la plataforma, el nombre, el idioma principal, el bundle ID del paso anterior y un SKU. Las subidas a TestFlight fallan si no existe un registro de app para ese bundle ID.
4
Crear un grupo beta
Abre la app, ve a TestFlight y crea un grupo:
- Internal testing: los testers deben ser usuarios de tu equipo de App Store Connect. Las compilaciones están disponibles en cuanto termina el procesamiento.
- External testing: los testers pueden ser cualquier persona con una dirección de correo electrónico o un enlace público. Primero completa Test Information (descripción de la app beta, correo para feedback y datos de contacto para la revisión). La primera compilación de cada versión pasa por Beta App Review.
5
Responder al cumplimiento de exportación
Cada compilación debe responder a la pregunta de cumplimiento de exportación antes de que los testers puedan instalarla. Para omitir esa pregunta en cada compilación, define
ITSAppUsesNonExemptEncryption en el Info.plist de tu app. Establécelo en NO si la app solo usa cifrado exento, como HTTPS.Crear una clave de API de App Store Connect
1
Habilitar el acceso a la API
En App Store Connect, ve a Users and Access → Integrations → App Store Connect API. Si el acceso a la API aún no está habilitado, el Account Holder debe hacer clic en Request Access y aceptar los términos.
2
Generar una clave de equipo
En Team Keys, haz clic en +. Escribe un nombre, como
Devin TestFlight, y selecciona el rol App Manager. Necesitas el rol Admin para generar una clave. Si Xcode no puede crear un certificado de distribución con una clave de App Manager, genera una clave con el rol Admin.3
Descargar la clave privada
Haz clic en Download junto a la nueva clave para guardar
AuthKey_<KEY_ID>.p8. Apple solo permite descargar el archivo una vez. Si lo pierdes, revoca la clave y genera una nueva.4
Copiar el Issuer ID y el Key ID
El Issuer ID aparece encima de la tabla de claves. El Key ID está en la fila de la clave.
5
Encontrar tu Team ID
En el portal de Apple Developer, ve a Membership details y copia el Team ID. Es una cadena de 10 caracteres, como
A1B2C3D4E5.Agregar secretos a Devin
Para copiar la clave privada en una Mac, ejecuta:
- Organization: cualquier sesión de tu organización puede usar la clave. Usa este ámbito cuando el equipo publique compilaciones con Devin.
- Personal: solo pueden usar la clave las sesiones que tú inicies.
Permitir acceso a la red
api.appstoreconnect.apple.com y los demás hosts de Apple que xcodebuild usa para firmar y subir. Permitir *.apple.com los cubre todos.
Un host bloqueado suele aparecer como un error de autenticación, no como un error de red. Consulta Solución de problemas.
Subir una compilación
- Escribir
ASC_PRIVATE_KEYen~/.appstoreconnect/private_keys/AuthKey_$ASC_KEY_ID.p8con permisos0600. - Consultar el número de compilación más reciente con la API de App Store Connect y elegir uno superior.
- Archivar la app con
xcodebuild archive. - Firmar y subir la compilación con
xcodebuild -exportArchive. - Esperar a que termine el procesamiento y luego agregar la compilación al grupo beta con la API de App Store Connect.
destination configurado como upload:
-allowProvisioningUpdates permite que Xcode cree el certificado de distribución y el perfil de aprovisionamiento con la clave de API, de modo que la VM no necesita tener instalados los recursos de firma.
Si tu repositorio ya cuenta con un script de publicación, como un lane de fastlane o un target de make, indícale a Devin que lo use. fastlane acepta esa misma clave mediante app_store_connect_api_key.
Guarda los pasos en tu blueprint
knowledge del blueprint de tu repositorio:
Solución de problemas
No Accounts with App Store Connect Access o Failed to Use Accounts durante la exportación. Revisa primero el acceso a la red. Si la VM no puede comunicarse con los servidores de Apple, xcodebuild informa este error incluso cuando la clave es válida. Busca ITunesConnectFoundationErrorDomain Code=-1003 en las líneas anteriores. Si la red funciona correctamente, verifica que la clave tenga el rol App Manager.
No profiles for '<bundle ID>' were found. El bundle ID no está registrado para el team indicado en APPLE_TEAM_ID, o no existe un registro de app asociado en App Store Connect.
The provided entity includes an attribute with a value that has already been used. El número de compilación ya se usó para esta versión. Vuelve a subirla con un número de compilación mayor.
La compilación se sube, pero los testers no pueden instalarla. Revisa la compilación en App Store Connect → TestFlight. Puede que aún esté procesándose, que le falte la información de cumplimiento de exportación o que esté esperando la Beta App Review.
Xcode no puede crear un certificado de distribución. El rol de la clave no permite gestionar certificados. Genera una clave con el rol Admin o pide a un Admin que cree el certificado de distribución en el portal de Apple Developer.
Las environment variables están vacías en la sesión. Los secretos solo están disponibles en las sesiones que se inician después de agregarlos. Inicia una nueva sesión.
