|
Me complace anunciar la disponibilidad de Fastlano En su AWS CodeBuild para entornos MacOS. AWS CodeBuild es un servicio de integración continua totalmente administrado que compila el código fuente, ejecuta pruebas y produce paquetes de software listos para depender.
FastLane es un conjunto de herramientas de código abierto diseñada para automatizar varios aspectos del desarrollo de aplicaciones móviles. Proporciona a los desarrolladores de aplicaciones móviles un conjunto centralizado de herramientas para administrar tareas como firma de código, generación de capturas de captura, distribución beta y envíos de App Store. Se integra con la popular integración continua y plataformas de implementación continua (CI/CD) y admite flujos de trabajo de desarrollo de iOS y Android. Aunque Fastlane ofrece capacidades de automatización significativas, los desarrolladores pueden encontrar desafíos durante su configuración y mantenimiento. La configuración de Fastlane puede ser complejo, particularmente para equipos que no están familiarizados con la sintaxis y el sistema de gestión de paquetes de Ruby. Mantener a Fastlane y sus dependencias actualizadas requiere un esfuerzo continuo, porque las actualizaciones de plataformas móviles o servicios de terceros pueden requerir ajustes a los flujos de trabajo existentes.
Cuando presentamos CodeBuild para MacOS en agosto de 2024, sabíamos que uno de sus desafíos era instalar y mantener Fastlane en su entorno de compilación. Aunque era posible instalar manualmente FastLane en un entorno de compilación personalizado, en AWS, eliminamos el levantamiento inodificado de su infraestructura para que pueda pasar más tiempo en los aspectos que importan para su negocio. A partir de hoy, FastLane se instala de forma predeterminada y puede usar el comando familiar fastlane build
en tu buildspec.yaml
archivo.
Fastlane y firma de código
Para distribuir una aplicación en la App Store, los desarrolladores deben firmar su binario con una clave privada generada en el portal de desarrolladores de Apple. Esta clave privada, junto con el certificado que lo valida, debe ser accesible durante el proceso de compilación. Esto puede ser un desafío para los equipos de desarrollo porque necesitan compartir la clave privada de desarrollo (que permite la implementación en dispositivos de prueba seleccionados) entre los miembros del equipo. Además, la clave privada de distribución (que permite la publicación en la App Store) debe estar disponible durante el proceso de firma antes de cargar el binario en la App Store.
Fastlane es un sistema de construcción versátil en el sentido de que también ayuda a los desarrolladores con la gestión de las claves y certificados de desarrollo y distribución. Los desarrolladores pueden usar fastlane match
Para compartir materiales de firma en un equipo y hacerlos de manera segura y fácilmente accesible en máquinas de desarrolladores individuales y en el entorno CI. match
Permite el almacenamiento de claves privadas, los certificados y los perfiles de aprovisionamiento móvil en un almacenamiento de acciones seguras. Se asegura de que el entorno de compilación local, ya sea una computadora portátil de desarrollador o una máquina de servidor en la nube, permanezca sincronizado con el almacenamiento compartido. A la hora de compilación, descarga de forma segura los certificados requeridos para firmar su aplicación y configura la máquina de compilación para permitir la codesign
utilidad para recogerlos.
match
Permite el intercambio de secretos de firma a través de GitHub, GitLab, Google Cloud Storage, Azure DevOps y Amazon Simple Storage Service (Amazon S3).
Si ya usa uno de estos y está migrando sus proyectos a CodeBuild, no tiene mucho que hacer. Solo necesita asegurarse de que su entorno de compilación de CodeBuild tenga acceso al almacenamiento compartido (consulte el paso 3 en la demostración).
Veamos cómo funciona
Si eres nuevo en Fastlane o CodeBuild, veamos cómo funciona.
Para esta demostración, empiezo con Un proyecto iOS existente. El proyecto ya está configurado para construir en CodeBuild. Puede consultar mi publicación de blog anterior, agregar macOS a sus tuberías de integración continua con AWS CodeBuild, para obtener más detalles.
Te mostraré cómo comenzar en tres pasos:
- Importar sus materiales de firma existentes a un repositorio de GitHub privado compartido
- Configurar
fastlane
Para construir y firmar su proyecto - Usar
fastlane
con CodeBuild
Paso 1: importe sus materiales de firma
La mayor parte del fastlane
documentación Leí Explica cómo crear un nuevo par de claves y un nuevo certificado para comenzar. Aunque esto es ciertamente cierto para nuevos proyectos, en la vida real, probablemente ya tenga su proyecto y sus claves de firma. Entonces, el primer paso es importar estos materiales de firma existentes.
Apple App Store utiliza diferentes claves y certificados para el desarrollo y distribución (también hay certificados AD HOC y Enterprise, pero están fuera del alcance de esta publicación). Debe tener tres archivos para cada uso (eso es un total de seis archivos):
- A
.mobileprovision
Archivo que puede crear y descargar desde la consola de desarrollador de Apple. El perfil de aprovisionamiento vincula su identidad, la identidad de la aplicación y los derechos que la aplicación podría tener. - A
.cer
Archivo, que es el certificado emitido por Apple para validar su clave privada. Puedes descargar esto desde el Portal de desarrolladores de Apple. Seleccione el certificado, luego seleccione Descargar. - A
.p12
archivo, que contiene su clave privada. Puede descargar la clave cuando la cree en el Portal de desarrolladores de Apple. Si no lo descargó pero lo tiene en su máquina, puede exportarlo desde la aplicación Apple Keychain. Tenga en cuenta que el KeyChain.App está oculto en MacOS 15.x. Puedes abrirlo conopen /System/Library/CoreServices/Applications/Keychain\ Access.app
. Seleccione la clave que desea exportar y haga clic derecho para seleccionar Exportar.
![]() |
![]() |
Cuando tenga estos archivos, cree un fastlane/Matchfile
Archivo con el siguiente contenido:
git_url("https://github.com/sebsto/secret.git")
storage_mode("git")
type("development")
# or use appstore to use the distribution signing key and certificate
# type("appstore")
Asegúrese de reemplazar la URL de su repositorio de GitHub y Asegúrese de que este repositorio sea privado. Servirá como almacenamiento para su clave de firma y certificado.
Luego, importo mis archivos existentes con el fastlane match import --type appstore
dominio. Repito el comando para cada entorno: appstore
y development
.
La primera vez, fastlane
Me solicita mi nombre de usuario y contraseña de ID de Apple. Se conecta a App Store Connect para verificar la validez de los certificados o para crear otros nuevos cuando sea necesario. La cookie de la sesión se almacena en ~/.fastlane/spaceship/
.
fastlane match
También pide una contraseña. Utiliza esta contraseña para generar una clave para criptar los materiales de firma en el almacenamiento. No olvide esta contraseña porque se utilizará en la hora de compilación para importar los materiales de firma en la máquina de compilación.
Aquí está el comando y su salida en su totalidad:
fastlane match import --type appstore
[
]
[16:43:54]: Successfully loaded '~/amplify-ios-getting-started/code/fastlane/Matchfile'
+-----------------------------------------------------+
| Detected Values from './fastlane/Matchfile' |
+--------------+--------------------------------------+
| git_url. | https://github.com/sebsto/secret.git |
| storage_mode | git |
| type | development |
+--------------+--------------------------------------+
[16:43:54]: Certificate (.cer) path:
./secrets/sebsto-apple-dist.cer
[16:44:07]: Private key (.p12) path:
./secrets/sebsto-apple-dist.p12
[16:44:12]: Provisioning profile (.mobileprovision or .provisionprofile) path or leave empty to skip
this file:
./secrets/amplifyiosgettingstarteddist.mobileprovision
[16:44:25]: Cloning remote git repo...
[16:44:25]: If cloning the repo takes too long, you can use the `clone_branch_directly` option in match.
[16:44:27]: Checking out branch master...
[16:44:27]: Enter the passphrase that should be used to encrypt/decrypt your certificates
[16:44:27]: This passphrase is specific per repository and will be stored in your local keychain
[16:44:27]: Make sure to remember the password, as you'll need it when you run match on a different machine
[16:44:27]: Passphrase for Match storage: ********
[16:44:30]: Type passphrase again: ********
security: SecKeychainAddInternetPassword : The specified item already exists in the keychain.
[16:44:31]:
Successfully decrypted certificates repo
[16:44:31]: Repo is at: '/var/folders/14/nwpsn4b504gfp02_mrbyd2jr0000gr/T/d20250131-41830-z7b4ic'
[16:44:31]: Login to App Store Connect (sebsto@mac.com)
[16:44:33]: Enter the passphrase that should be used to encrypt/decrypt your certificates
[16:44:33]: This passphrase is specific per repository and will be stored in your local keychain
[16:44:33]: Make sure to remember the password, as you'll need it when you run match on a different machine
[16:44:33]: Passphrase for Match storage: ********
[16:44:37]: Type passphrase again: ********
security: SecKeychainAddInternetPassword : The specified item already exists in the keychain.
[16:44:39]:
Successfully encrypted certificates repo
[16:44:39]: Pushing changes to remote git repo...
[16:44:40]: Finished uploading files to Git Repo [https://github.com/sebsto/secret.git]
Verifico que Fastlane importó mi material de firma a mi repositorio Git.
También puedo configurar mi máquina local para usar estos materiales de firma durante la próxima compilación:
» fastlane match appstore
[
]
[17:39:08]: Successfully loaded '~/amplify-ios-getting-started/code/fastlane/Matchfile'
+-----------------------------------------------------+
| Detected Values from './fastlane/Matchfile' |
+--------------+--------------------------------------+
| git_url | https://github.com/sebsto/secret.git |
| storage_mode | git |
| type | development |
+--------------+--------------------------------------+
+-------------------------------------------------------------------------------------------+
| Summary for match 2.226.0 |
+----------------------------------------+--------------------------------------------------+
| type | appstore |
| readonly | false |
| generate_apple_certs | true |
| skip_provisioning_profiles | false |
| app_identifier | ["com.amazonaws.amplify.mobile.getting-started"] |
| username | xxxx@xxxxxxxxx |
| team_id | XXXXXXXXXX |
| storage_mode | git |
| git_url | https://github.com/sebsto/secret.git |
| git_branch | master |
| shallow_clone | false |
| clone_branch_directly | false |
| skip_google_cloud_account_confirmation | false |
| s3_skip_encryption | false |
| gitlab_host | https://gitlab.com |
| keychain_name | login.keychain |
| force | false |
| force_for_new_devices | false |
| include_mac_in_profiles | false |
| include_all_certificates | false |
| force_for_new_certificates | false |
| skip_confirmation | false |
| safe_remove_certs | false |
| skip_docs | false |
| platform | ios |
| derive_catalyst_app_identifier | false |
| fail_on_name_taken | false |
| skip_certificate_matching | false |
| skip_set_partition_list | false |
| force_legacy_encryption | false |
| verbose | false |
+----------------------------------------+--------------------------------------------------+
[17:39:08]: Cloning remote git repo...
[17:39:08]: If cloning the repo takes too long, you can use the `clone_branch_directly` option in match.
[17:39:10]: Checking out branch master...
[17:39:10]: Enter the passphrase that should be used to encrypt/decrypt your certificates
[17:39:10]: This passphrase is specific per repository and will be stored in your local keychain
[17:39:10]: Make sure to remember the password, as you'll need it when you run match on a different machine
[17:39:10]: Passphrase for Match storage: ********
[17:39:13]: Type passphrase again: ********
security: SecKeychainAddInternetPassword : The specified item already exists in the keychain.
[17:39:15]:
Successfully decrypted certificates repo
[17:39:15]: Verifying that the certificate and profile are still valid on the Dev Portal...
[17:39:17]: Installing certificate...
+-------------------------------------------------------------------------+
| Installed Certificate |
+-------------------+-----------------------------------------------------+
| User ID | XXXXXXXXXX |
| Common Name | Apple Distribution: Sebastien Stormacq (XXXXXXXXXX) |
| Organisation Unit | XXXXXXXXXX |
| Organisation | Sebastien Stormacq |
| Country | US |
| Start Datetime | 2024-10-29 09:55:43 UTC |
| End Datetime | 2025-10-29 09:55:42 UTC |
+-------------------+-----------------------------------------------------+
[17:39:18]: Installing provisioning profile...
+-------------------------------------------------------------------------------------------------------------------+
| Installed Provisioning Profile |
+---------------------+----------------------------------------------+----------------------------------------------+
| Parameter | Environment Variable | Value |
+---------------------+----------------------------------------------+----------------------------------------------+
| App Identifier | | com.amazonaws.amplify.mobile.getting-starte |
| | | d |
| Type | | appstore |
| Platform | | ios |
| Profile UUID | sigh_com.amazonaws.amplify.mobile.getting-s | 4e497882-d80f-4684-945a-8bfec1b310b9 |
| | tarted_appstore | |
| Profile Name | sigh_com.amazonaws.amplify.mobile.getting-s | amplify-ios-getting-started-dist |
| | tarted_appstore_profile-name | |
| Profile Path | sigh_com.amazonaws.amplify.mobile.getting-s | /Users/stormacq/Library/MobileDevice/Provis |
| | tarted_appstore_profile-path | ioning |
| | | Profiles/4e497882-d80f-4684-945a-8bfec1b310 |
| | | b9.mobileprovision |
| Development Team ID | sigh_com.amazonaws.amplify.mobile.getting-s | XXXXXXXXXX |
| | tarted_appstore_team-id | |
| Certificate Name | sigh_com.amazonaws.amplify.mobile.getting-s | Apple Distribution: Sebastien Stormacq |
| | tarted_appstore_certificate-name | (XXXXXXXXXX) |
+---------------------+----------------------------------------------+----------------------------------------------+
[17:39:18]: All required keys, certificates and provisioning profiles are installed 
Paso 2: Configure Fastlane para firmar su proyecto
Creo un archivo de configuración de compilación de FastLane en fastlane/Fastfile
(Puedes usar fastlane init
comandar para comenzar):
default_platform(:ios)
platform :ios do
before_all do
setup_ci
end
desc "Build and Sign the binary"
lane :build do
match(type: "appstore", readonly: true)
gym(
scheme: "getting started",
export_method: "app-store"
)
end
end
Asegúrese de que el setup_ci
la acción se agrega al before_all
sección de Fastfile
para el match
acción para funcionar correctamente. Esta acción crea un llavero de Fastlane temporal con permisos correctos. Sin este paso, puede encontrar fallas de construcción o resultados inconsistentes.
Y pruebo una compilación local con el comando fastlane build
. Introgo la contraseña que usé al importar mis claves y certificado, luego dejo que el sistema construya y firmé mi proyecto. Cuando todo está configurado correctamente, produce una salida similar.
...
[17:58:33]: Successfully exported and compressed dSYM file
[17:58:33]: Successfully exported and signed the ipa file:
[17:58:33]: ~/amplify-ios-getting-started/code/getting started.ipa
+---------------------------------------+
| fastlane summary |
+------+------------------+-------------+
| Step | Action | Time (in s) |
+------+------------------+-------------+
| 1 | default_platform | 0 |
| 2 | setup_ci | 0 |
| 3 | match | 36 |
| 4 | gym | 151 |
+------+------------------+-------------+
[17:58:33]: fastlane.tools finished successfully 
Paso 3: Configure CodeBuild para usar FastLane
A continuación, creo un proyecto en CodeBuild. No voy a entrar en la guía paso a paso para ayudarte a hacerlo. Puede consultar mi publicación anterior o a la documentación de CodeBuild.
Solo hay una configuración específica de Fastlane. Para acceder a los materiales de firma, Fastlane requiere acceso a tres valores secretos que pasaré como variables de entorno:
MATCH_PASSWORD
la contraseña que ingresé al importar el material de firma. FastLane usa esta contraseña para descifrar los archivos cifrados en el repositorio de GitHubFASTLANE_SESSION
el valor de la cookie de la sesión de ID de Apple, ubicada en~/.fastlane/spaceship/
. La sesión es válida de un par de horas a varios días. Cuando expira la sesión, reautenicate con el comando/cookie fastlane spaceauth
desde su computadora portátil y actualice el valor deFASTLANE_SESSION
con el nuevo valor de la galleta.MATCH_GIT_BASIC_AUTHORIZATION
Una codificación de la base 64 de su nombre de usuario GitHub, seguido de un colon, seguido de un token de autenticación personal (PAT) para acceder a su repositorio privado de GitHub. Puedes generar Pat en la consola Github En su perfil> Configuración> Configuración de desarrolladores> Token de acceso personal. Utilizo este comando para generar el valor de esta variable de entorno:echo -n my_git_username:my_git_pat | base64
.
Tenga en cuenta que para cada uno de estos tres valores, puedo ingresar el nombre del recurso de Amazon (ARN) del secreto en AWS Secrets Manager o el valor de texto sin formato. Recomendamos encarecidamente usar Secrets Manager para almacenar valores sensibles a la seguridad.
Soy un usuario consciente de la seguridad, así que almaceno los tres secretos en Secrets Manager con estos comandos:
aws --region $REGION secretsmanager create-secret --name /CodeBuild/MATCH_PASSWORD --secret-string MySuperSecretPassword
aws --region $REGION secretsmanager create-secret --name /CodeBuild/FASTLANE_SESSION --secret-string $(cat ~/.fastlane/spaceship/my_appleid_username/cookie)
aws --region $REGION secretsmanager create-secret --name /CodeBuild/MATCH_GIT_BASIC_AUTHORIZATION --secret-string $(echo -n my_git_username:my_git_pat | base64)
Si su proyecto de compilación se refiere a secretos almacenados en Secrets Manager, el papel de servicio del proyecto de compilación debe permitir el secretsmanager:GetSecretValue
acción. Si eliges Nuevo rol de servicio Cuando creó su proyecto, CodeBuild incluye esta acción en el rol de servicio predeterminado para su proyecto de compilación. Sin embargo, si eliges Rol de servicio existentedebe incluir esta acción a su rol de servicio por separado.
Para esta demostración, utilizo esta política de gestión de identidad y acceso de AWS (IAM):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": [
"arn:aws:secretsmanager:us-east-2:012345678912:secret:/CodeBuild/*"
]
}
]
}
Después de crear el proyecto en la sección CodeBuild de la consola de administración de AWS, ingreso las tres variables de entorno. Observe que el valor es el nombre del secreto en Secrets Manager.
También puede definir las variables de entorno y su nombre secreto de Secrets Manager en su buildpsec.yaml
archivo.
A continuación, modifico el buildspec.yaml
Archivo en la raíz de mi proyecto para usar fastlane
para construir y firmar el binario. Mi buildspec.yaml
El archivo ahora se ve así:
# buildspec.yml
version: 0.2
phases:
install:
commands:
- code/ci_actions/00_install_rosetta.sh
pre_build:
commands:
- code/ci_actions/02_amplify.sh
build:
commands:
- (cd code && fastlane build)
artifacts:
name: getting-started-$(date +%Y-%m-%d).ipa
files:
- 'getting started.ipa'
base-directory: 'code'
Se requieren los scripts de Rosetta y Amplify para recibir la configuración de Amplify para el backend. Si no usas AWS amplifica En su proyecto, no los necesita.
Observe que no hay nada en el archivo de compilación que descargue la clave de firma o prepare el llavero en el entorno de compilación; fastlane match
haré eso por mí.
Agrego el nuevo buildspec.yaml
archivo y mi ./fastlane
Directorio a Git. Comprometo y presiono estos archivos. git commit -m "add fastlane support" && git push
Cuando todo va bien, puedo ver la compilación que se ejecuta en CodeBuild y el Tener éxito mensaje.
Precios y disponibilidad
Fastlane ahora se preinstalan sin costo adicional en todas las imágenes de MacOS que CodeBuild usa, en todas las regiones donde CodeBuild para MacOS está disponible. Al momento de escribir este escrito, estos son US East (Ohio, N. Virginia), US West (Oregon), Asia Pacífico (Sydney) y Europa (Frankfurt).
En mi experiencia, se necesita un poco de tiempo para configurar fastlane match
correctamente. Cuando está configurado, tenerlo funcionando en CodeBuild es bastante sencillo. Antes de probar esto en CodeBuild, asegúrese de que funcione en su máquina local. Cuando algo sale mal en CodeBuild, verifique los valores de las variables de entorno y asegúrese de que CodeBuild tenga acceso a sus secretos en AWS Secrets Manager.
¡Ahora ve a construir (en macOS)!