10.2 C
Madrid
martes, marzo 4, 2025

AWS CodeBuild para MacOS agrega soporte para FastLane


Expresado por Polly

Me complace anunciar la disponibilidad de Fastlano en tu AWS CodeBuild para entornos de 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 program 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 Retailer. Se integra con la well-liked 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 2024sabíamos que uno de sus desafíos period instalar y mantener Fastlane en su entorno de compilación. Aunque period posible instalar manualmente FastLane en un entorno de compilación personalizado, en AWS, Eliminamos el levantamiento de agitación indiferenciado de su infraestructura Por lo tanto, puede 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 acquainted fastlane constructen tu buildspec.yaml archivo.

Fastlane y firma de código
Para distribuir una aplicación en la App Retailer, 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 Retailer) debe estar disponible durante el proceso de firma antes de cargar el binario en la App Retailer.

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 native, 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 compartir secretos de firma a través de GitHub, GitLab, Google Cloud Storage, Azure DevOps y Amazon Easy 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. Puedes consultar mi publicación de weblog anterior, Agregue macOS a sus tuberías de integración continua con AWS CodeBuildpara 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 fastlanecon 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 actual, probablemente ya tenga su proyecto y sus claves de firma. Entonces, el primer paso es importar estos materiales de firma existentes.

Apple App Retailer utiliza diferentes claves y certificados para el desarrollo y distribución (también hay certificados Advert Hoc y Enterprise, pero están fuera del alcance de esta publicación). Debe tener tres archivos para cada uso (eso es un complete 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 con open /System/Library/CoreServices/Functions/Keychain Entry.app. Seleccione la clave que desea exportar y haga clic derecho para seleccionar Exportar.
Exportar archivos P12 desde llavero

Cuando tenga estos archivos, cree un fastlane/Matchfile Archivo con el siguiente contenido:

git_url("https://github.com/sebsto/secret.git")
storage_mode("git")
sort("growth")
# or use appstore to make use of the distribution signing key and certificates
# sort("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 growth.

La primera vez, fastlane Me solicita mi nombre de usuario y contraseña de ID de Apple. Se conecta a App Retailer Join 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//cookie.

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): Efficiently loaded '~/amplify-ios-getting-started/code/fastlane/Matchfile' 📄

+-----------------------------------------------------+
| Detected Values from './fastlane/Matchfile'         |
+--------------+--------------------------------------+
| git_url.     | https://github.com/sebsto/secret.git |
| storage_mode | git                                  |
| sort         | growth                          |
+--------------+--------------------------------------+

(16:43:54): Certificates (.cer) path:
./secrets and techniques/sebsto-apple-dist.cer
(16:44:07): Personal key (.p12) path:
./secrets and techniques/sebsto-apple-dist.p12
(16:44:12): Provisioning profile (.mobileprovision or .provisionprofile) path or depart empty to skip
this file:
./secrets and techniques/amplifyiosgettingstarteddist.mobileprovision
(16:44:25): Cloning distant git repo...
(16:44:25): If cloning the repo takes too lengthy, you should use the `clone_branch_directly` possibility in match.
(16:44:27): Testing department grasp...
(16:44:27): Enter the passphrase that ought to be used to encrypt/decrypt your certificates
(16:44:27): This passphrase is restricted per repository and will likely be saved in your native keychain
(16:44:27): Make sure that to recollect the password, as you may want it whenever you run match on a special machine
(16:44:27): Passphrase for Match storage: ********
(16:44:30): Sort passphrase once more: ********
safety: SecKeychainAddInternetPassword : The required merchandise already exists within the keychain.
(16:44:31): 🔓 Efficiently decrypted certificates repo
(16:44:31): Repo is at: '/var/folders/14/nwpsn4b504gfp02_mrbyd2jr0000gr/T/d20250131-41830-z7b4ic'
(16:44:31): Login to App Retailer Join (sebsto@mac.com)
(16:44:33): Enter the passphrase that ought to be used to encrypt/decrypt your certificates
(16:44:33): This passphrase is restricted per repository and will likely be saved in your native keychain
(16:44:33): Make sure that to recollect the password, as you may want it whenever you run match on a special machine
(16:44:33): Passphrase for Match storage: ********
(16:44:37): Sort passphrase once more: ********
safety: SecKeychainAddInternetPassword : The required merchandise already exists within the keychain.
(16:44:39): 🔒 Efficiently encrypted certificates repo
(16:44:39): Pushing adjustments to distant git repo...
(16:44:40): Completed importing recordsdata to Git Repo (https://github.com/sebsto/secret.git)

Verifico que Fastlane importó mi materials de firma a mi repositorio Git.

Fastlane Match - Repo de Github después de la importación

También puedo configurar mi máquina native para usar estos materiales de firma durante la próxima compilación:

» fastlane match appstore 

(✔) 🚀 
(17:39:08): Efficiently loaded '~/amplify-ios-getting-started/code/fastlane/Matchfile' 📄

+-----------------------------------------------------+
|   Detected Values from './fastlane/Matchfile'       |
+--------------+--------------------------------------+
| git_url      | https://github.com/sebsto/secret.git |
| storage_mode | git                                  |
| sort         | growth                          |
+--------------+--------------------------------------+


+-------------------------------------------------------------------------------------------+
|                                 Abstract for match 2.226.0                                 |
+----------------------------------------+--------------------------------------------------+
| sort                                   | appstore                                         |
| readonly                               | false                                            |
| generate_apple_certs                   | true                                             |
| skip_provisioning_profiles             | false                                            |
| app_identifier                         | ("com.amazonaws.amplify.cellular.getting-started") |
| username                               | xxxx@xxxxxxxxx                                   |
| team_id                                | XXXXXXXXXX                                       |
| storage_mode                           | git                                              |
| git_url                                | https://github.com/sebsto/secret.git             |
| git_branch                             | grasp                                           |
| 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                                   |
| power                                  | 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 distant git repo...
(17:39:08): If cloning the repo takes too lengthy, you should use the `clone_branch_directly` possibility in match.
(17:39:10): Testing department grasp...
(17:39:10): Enter the passphrase that ought to be used to encrypt/decrypt your certificates
(17:39:10): This passphrase is restricted per repository and will likely be saved in your native keychain
(17:39:10): Make sure that to recollect the password, as you may want it whenever you run match on a special machine
(17:39:10): Passphrase for Match storage: ********
(17:39:13): Sort passphrase once more: ********
safety: SecKeychainAddInternetPassword : The required merchandise already exists within the keychain.
(17:39:15): 🔓  Efficiently decrypted certificates repo
(17:39:15): Verifying that the certificates and profile are nonetheless legitimate on the Dev Portal...
(17:39:17): Putting in certificates...

+-------------------------------------------------------------------------+
|                          Put in Certificates                          |
+-------------------+-----------------------------------------------------+
| Person ID           | XXXXXXXXXX                                          |
| Frequent Title       | Apple Distribution: Sebastien Stormacq (XXXXXXXXXX) |
| Organisation Unit | XXXXXXXXXX                                          |
| Organisation      | Sebastien Stormacq                                  |
| Nation           | US                                                  |
| Begin Datetime    | 2024-10-29 09:55:43 UTC                             |
| Finish Datetime      | 2025-10-29 09:55:42 UTC                             |
+-------------------+-----------------------------------------------------+

(17:39:18): Putting in provisioning profile...

+-------------------------------------------------------------------------------------------------------------------+
|                                          Put in Provisioning Profile                                           |
+---------------------+----------------------------------------------+----------------------------------------------+
| Parameter           | Setting Variable                         | Worth                                        |
+---------------------+----------------------------------------------+----------------------------------------------+
| App Identifier      |                                              | com.amazonaws.amplify.cellular.getting-starte  |
|                     |                                              | d                                            |
| Sort                |                                              | appstore                                     |
| Platform            |                                              | ios                                          |
| Profile UUID        | sigh_com.amazonaws.amplify.cellular.getting-s  | 4e497882-d80f-4684-945a-8bfec1b310b9         |
|                     | tarted_appstore                              |                                              |
| Profile Title        | sigh_com.amazonaws.amplify.cellular.getting-s  | amplify-ios-getting-started-dist             |
|                     | tarted_appstore_profile-name                 |                                              |
| Profile Path        | sigh_com.amazonaws.amplify.cellular.getting-s  | /Customers/stormacq/Library/MobileDevice/Provis  |
|                     | tarted_appstore_profile-path                 | ioning                                       |
|                     |                                              | Profiles/4e497882-d80f-4684-945a-8bfec1b310  |
|                     |                                              | b9.mobileprovision                           |
| Growth Crew ID | sigh_com.amazonaws.amplify.cellular.getting-s  | XXXXXXXXXX                                   |
|                     | tarted_appstore_team-id                      |                                              |
| Certificates Title    | sigh_com.amazonaws.amplify.cellular.getting-s  | Apple Distribution: Sebastien Stormacq       |
|                     | tarted_appstore_certificate-name             | (XXXXXXXXXX)                                 |
+---------------------+----------------------------------------------+----------------------------------------------+

(17:39:18): All required keys, certificates and provisioning profiles are put in 🙌

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
  finish

  desc "Construct and Signal the binary"
  lane :construct do
    match(sort: "appstore", readonly: true)
    fitness center(
      scheme: "getting began",
      export_method: "app-store"
    )
  finish
finish

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 native con el comando fastlane construct. 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 related.

...
(17:58:33): Efficiently exported and compressed dSYM file
(17:58:33): Efficiently exported and signed the ipa file:
(17:58:33): ~/amplify-ios-getting-started/code/getting began.ipa

+---------------------------------------+
|           fastlane abstract            |
+------+------------------+-------------+
| Step | Motion           | Time (in s) |
+------+------------------+-------------+
| 1    | default_platform | 0           |
| 2    | setup_ci         | 0           |
| 3    | match            | 36          |
| 4    | fitness center              | 151         |
+------+------------------+-------------+

(17:58:33): fastlane.instruments completed efficiently 🎉

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. Puedes referirte a mi publicación anterior o 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_PASSWORDla contraseña que ingresé al importar el materials de firma. FastLane usa esta contraseña para descifrar los archivos cifrados en el repositorio de GitHub
  • FASTLANE_SESSIONel valor de la cookie de la sesión de ID de Apple, ubicada en ~/.fastlane/spaceship//cookie. La sesión es válida de un par de horas a varios días. Cuando expira la sesión, reautenicate con el comando fastlane spaceauth desde su computadora portátil y actualice el valor de FASTLANE_SESSION con el nuevo valor de la galleta.
  • MATCH_GIT_BASIC_AUTHORIZATIONUna codificación de la base 64 de su nombre de usuario GitHub, seguido de un colon, seguido de un token de autenticación private (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 private. 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 and techniques Supervisor o el valor de texto plano. Nosotros fuertemente Recomendar usar Secrets and techniques Supervisor para almacenar valores sensibles a la seguridad.

Soy un usuario consciente de la seguridad, así que almaceno los tres secretos en Secrets and techniques Supervisor 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 and techniques Supervisor, 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, uso esto AWS Id and Entry Administration (IAM) política:

{
	"Model": "2012-10-17",
	"Assertion": (
		{
			"Impact": "Permit",
			"Motion": (
				"secretsmanager:GetSecretValue"
			),
			"Useful 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 gestión de AWSEntro en las tres variables de entorno. Observe que el valor es el nombre del secreto en Secrets and techniques Supervisor.

CodeBuild - Variables de entorno para FastLane Match

También puede definir las variables de entorno y su nombre secreto de Secrets and techniques Supervisor 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
model: 0.2
phases:
  set up:
    instructions:
      - code/ci_actions/00_install_rosetta.sh
  pre_build:
    instructions:
      - code/ci_actions/02_amplify.sh
  construct:
    instructions:
      - (cd code && fastlane construct)
artifacts:
  title: getting-started-$(date +%Y-%m-%d).ipa
  recordsdata:
    - 'getting began.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 put together 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 help" && git push

Cuando todo va bien, puedo ver la compilación que se ejecuta en CodeBuild y el Tener éxito mensaje.

CodeBuild - Mensaje de éxito

Precios y disponibilidad
Fastlane ahora se está preinstalado sin costo adicional en todas las imágenes de MacOS que CodeBuild usa, en todos Regiones Donde CodeBuild para MacOS está disponible. En el momento de 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 native. 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 and techniques Supervisor.

¡Ahora ve a construir (en macOS)!

Related Articles

DEJA UNA RESPUESTA

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí

Stay Connected

0SeguidoresSeguir
0SuscriptoresSuscribirte
- Advertisement -spot_img

Latest Articles