AWS CodeBuild para MacOS adiciona suporte para fastlane


AWS CodeBuild para MacOS adiciona suporte para fastlane

Tenho o prazer de anunciar a disponibilidade de Fastlane em seu AWS CodeBuild Para ambientes macos. O AWS CodeBuild é um serviço de integração contínuo totalmente gerenciado que compila código-fonte, executa testes e produz pacotes de software program prontos para implantar.

O Fastlane é um conjunto de ferramentas de código aberto projetado para automatizar vários aspectos do desenvolvimento de aplicativos móveis. Ele fornece aos desenvolvedores de aplicativos móveis um conjunto centralizado de ferramentas para gerenciar tarefas como assinatura de código, geração de captura de tela, distribuição beta e envios da App Retailer. Ele se integra às plataformas populares de integração contínua e implantação contínua (CI/CD) e suporta fluxos de trabalho de desenvolvimento de iOS e Android. Embora o Fastlane ofereça recursos de automação significativos, os desenvolvedores podem enfrentar desafios durante sua configuração e manutenção. Configurar o Fastlane pode ser complexo, principalmente para as equipes não familiarizadas com o sistema de gerenciamento de sintaxe e pacotes do Ruby. Manter o Fastlane e suas dependências atualizadas requer esforço contínuo, porque as atualizações para plataformas móveis ou serviços de terceiros podem exigir ajustes nos fluxos de trabalho existentes.

Quando Introduzimos o CodeBuild para MacOS em agosto de 2024Sabíamos que um dos seus desafios period instalar e manter o Fastlane em seu ambiente de construção. Embora fosse possível instalar manualmente o Fastlane em um ambiente de construção personalizado, na AWS, Removemos o levantamento de peso indiferenciado de sua infraestrutura Assim, você pode gastar mais tempo nos aspectos que importam para o seu negócio. A partir de hoje, o fastlane é instalado por padrão e você pode usar o comando acquainted fastlane constructem seu buildspec.yaml arquivo.

Fastlane e assinatura de código
Para distribuir um aplicativo na App Retailer, os desenvolvedores devem assinar seu binário com uma chave privada gerada no portal do desenvolvedor da Apple. Essa chave privada, juntamente com o certificado que a valida, deve estar acessível durante o processo de construção. Isso pode ser um desafio para as equipes de desenvolvimento, porque elas precisam compartilhar a chave privada do desenvolvimento (que permite a implantação em dispositivos de teste selecionados) entre os membros da equipe. Além disso, a chave privada de distribuição (que permite a publicação na App Retailer) deve estar disponível durante o processo de assinatura antes de enviar o binário para a App Retailer.

O Fastlane é um sistema de construção versátil, pois também ajuda os desenvolvedores com o gerenciamento de chaves e certificados de desenvolvimento e distribuição. Os desenvolvedores podem usar fastlane match compartilhar materiais de assinatura em uma equipe e torná -los de forma segura e facilmente acessíveis nas máquinas de desenvolvedores individuais e no ambiente de IC. match Permite o armazenamento de chaves privadas, os certificados e os perfis de provisionamento móvel em um armazenamento de compartilhamento seguro. Ele garante que o ambiente de construção native, seja um laptop computer de desenvolvedor ou uma máquina de servidor na nuvem, permaneça sincronizada com o armazenamento compartilhado. No momento da construção, baixa com segurança os certificados necessários para assinar seu aplicativo e configurar a máquina de construção para permitir o codesign utilidade para buscá -los.

match Permite o compartilhamento de assinar segredos através do Github, Gitlab, Google Cloud Storage, Azure DevOps e Amazon Easy Storage Service (Amazon S3).

Se você já usa um desses e está migrando seus projetos para o CodeBuild, não tem muito o que fazer. Você só precisa garantir que seu ambiente de construção de código de código tenha acesso ao armazenamento compartilhado (consulte a Etapa 3 na demonstração).

Vamos ver como funciona
Se você é novo no Fastlane ou CodeBuild, vamos ver como funciona.

Para esta demonstração, eu começo com um projeto iOS existente. O projeto já está configurado para ser construído no CodeBuild. Você pode se referir à minha postagem anterior no weblog, Adicione o macOS aos seus pipelines de integração contínua com o AWS CodeBuildpara saber mais detalhes.

Vou mostrar como começar em três etapas:

  • Importe seus materiais de assinatura existentes para um repositório privado compartilhado do GitHub
  • Configure fastlane Para construir e assinar seu projeto
  • Usar fastlanecom CodeBuild

Etapa 1: importe seus materiais de assinatura

A maior parte do fastlane documentação Eu li explica como criar um novo par de chaves e um novo certificado para começar. Embora isso certamente seja verdade para novos projetos, na vida actual, você provavelmente já tem seu projeto e suas chaves de assinatura. Portanto, o primeiro passo é importar esses materiais de assinatura existentes.

A Apple App Retailer usa diferentes chaves e certificados para desenvolvimento e distribuição (também existem certificados advert hoc e corporativos, mas estes estão fora do escopo desta postagem). Você deve ter três arquivos para cada uso (isso é um whole de seis arquivos):

  • UM .mobileprovision Arquivo que você pode criar e baixar no console do desenvolvedor da Apple. O perfil de provisionamento vincula sua identidade, a identidade do aplicativo e os direitos que o aplicativo pode ter.
  • UM .cer Arquivo, que é o certificado emitido pela Apple para validar sua chave privada. Você pode baixar isso do Portal de desenvolvedores da Apple. Selecione o certificado e selecione Obtain.
  • UM .p12 arquivo, que contém sua chave privada. Você pode baixar a chave quando a cria no Portal de desenvolvedores da Apple. Se você não o baixar, mas o possui em sua máquina, poderá exportá -lo do aplicativo Apple Keychain. Observe que o chaveiro.App está oculto no macOS 15.x. Você pode abri -lo com open /System/Library/CoreServices/Purposes/Keychain Entry.app. Selecione a chave que deseja exportar e clique com o botão direito para selecionar Exportar.
Exportar arquivos P12 do chaveiro

Quando você tiver esses arquivos, crie um fastlane/Matchfile Arquivo com o seguinte conteúdo:

git_url("https://github.com/sebsto/secret.git")
storage_mode("git")
kind("improvement")
# or use appstore to make use of the distribution signing key and certificates
# kind("appstore")

Certifique -se de substituir o URL do seu repositório do GitHub e Verifique se este repositório é privado. Servirá como um armazenamento para sua chave de assinatura e certificado.

Então, eu importo meus arquivos existentes com o fastlane match import --type appstore comando. Repito o comando para cada ambiente: appstore e improvement.

A primeira vez, fastlane me leva ao meu nome de usuário e senha do Apple ID. Ele se conecta à App Retailer Join para verificar a validade dos certificados ou criar novos quando necessário. O cookie da sessão é armazenado em ~/.fastlane/spaceship//cookie.

fastlane match Também pede uma senha. Ele usa essa senha para gerar uma chave para criar os materiais de assinatura no armazenamento. Não se esqueça dessa senha, pois será usada no horário de construção para importar os materiais de assinatura na máquina de construção.

Aqui está o comando e sua saída na íntegra:

 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                                  |
| kind         | improvement                          |
+--------------+--------------------------------------+

(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 go away 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 utilize the `clone_branch_directly` possibility in match.
(16:44:27): Trying out department grasp...
(16:44:27): Enter the passphrase that must be used to encrypt/decrypt your certificates
(16:44:27): This passphrase is particular per repository and can be saved in your native keychain
(16:44:27): Make sure that to recollect the password, as you will want it while you run match on a unique machine
(16:44:27): Passphrase for Match storage: ********
(16:44:30): Kind 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 must be used to encrypt/decrypt your certificates
(16:44:33): This passphrase is particular per repository and can be saved in your native keychain
(16:44:33): Make sure that to recollect the password, as you will want it while you run match on a unique machine
(16:44:33): Passphrase for Match storage: ********
(16:44:37): Kind 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)

Verifiquei que o Fastlane importou meu materials de assinatura para o meu repositório Git.

Fastlane Match - Repo Github após importação

Também posso configurar minha máquina native para usar esses materiais de assinatura durante a próxima compilação:

» 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                                  |
| kind         | improvement                          |
+--------------+--------------------------------------+


+-------------------------------------------------------------------------------------------+
|                                 Abstract for match 2.226.0                                 |
+----------------------------------------+--------------------------------------------------+
| kind                                   | 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                                   |
| drive                                  | 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 utilize the `clone_branch_directly` possibility in match.
(17:39:10): Trying out department grasp...
(17:39:10): Enter the passphrase that must be used to encrypt/decrypt your certificates
(17:39:10): This passphrase is particular per repository and can be saved in your native keychain
(17:39:10): Make sure that to recollect the password, as you will want it while you run match on a unique machine
(17:39:10): Passphrase for Match storage: ********
(17:39:13): Kind 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                          |
+-------------------+-----------------------------------------------------+
| Consumer ID           | XXXXXXXXXX                                          |
| Widespread 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           | Surroundings Variable                         | Worth                                        |
+---------------------+----------------------------------------------+----------------------------------------------+
| App Identifier      |                                              | com.amazonaws.amplify.cellular.getting-starte  |
|                     |                                              | d                                            |
| Kind                |                                              | 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                           |
| Improvement Group 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 🙌

Etapa 2: Configure o Fastlane para assinar seu projeto

Eu crio um arquivo de configuração de construção fastlane em fastlane/Fastfile (você pode usar fastlane init comando para começar):

default_platform(:ios)

platform :ios do
  before_all do
    setup_ci
  finish

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

Certifique -se de que o setup_ci ação é adicionada ao before_all seção de Fastfile para o match ação para funcionar corretamente. Esta ação cria um chaveiro fastlano temporário com permissões corretas. Sem esta etapa, você pode encontrar falhas de construção ou resultados inconsistentes.

E eu testo uma construção native com o comando fastlane construct. Digitei a senha que usei ao importar minhas chaves e certificados, deixei o sistema construir e assinar meu projeto. Quando tudo está configurado corretamente, produz uma saída semelhante.

...
(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    | gymnasium              | 151         |
+------+------------------+-------------+

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

Etapa 3: Configure o CodeBuild para usar o Fastlane

Em seguida, crio um projeto no CodeBuild. Não vou entrar no guia passo a passo para ajudá-lo a fazê-lo. Você pode se referir a meu submit anterior ou para a documentação do código.

Há apenas uma configuração específica do Fastlane. Para acessar os materiais de assinatura, o Fastlane requer acesso a três valores secretos que passarei como variáveis ​​de ambiente:

  • MATCH_PASSWORDa senha que digitei ao importar o materials de assinatura. Fastlane usa esta senha para decifrar os arquivos criptografados no repositório do GitHub
  • FASTLANE_SESSIONo valor do cookie da sessão de ID da Apple, localizado em ~/.fastlane/spaceship//cookie. A sessão é válida de algumas horas a vários dias. Quando a sessão expirar, reautentique com o comando fastlane spaceauth do seu laptop computer e atualize o valor de FASTLANE_SESSION com o novo valor do cookie.
  • MATCH_GIT_BASIC_AUTHORIZATIONuma codificação base 64 do seu nome de usuário do github, seguido por um cólon, seguido de um token de autenticação pessoal (PAT) para acessar seu repositório explicit do GitHub. Você pode gerar Pat on o console do github Em seu perfil> Configurações> Configurações de desenvolvedores> Token de acesso pessoal. Eu uso este comando para gerar o valor dessa variável de ambiente: echo -n my_git_username:my_git_pat | base64.

Observe que para cada um desses três valores, posso entrar no nome do recurso da Amazon (ARN) do segredo Gerente de segredos da AWS ou o valor do texto simples. Nós fortemente Recomenda o uso do Secrets and techniques Supervisor para armazenar valores sensíveis à segurança.

Sou um usuário preocupado com a segurança, então eu armazenei os três segredos no gerente de segredos com estes 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)

Se o seu projeto de compilação referir -se a segredos armazenados no gerente de segredos, a função de serviço do projeto de construção deve permitir secretsmanager:GetSecretValue Ação. Se você escolheu Nova função de serviço Quando você criou seu projeto, o CodeBuild inclui essa ação na função de serviço padrão do seu projeto de compilação. No entanto, se você escolher Função de serviço existentevocê deve incluir esta ação à sua função de serviço separadamente.

Para esta demonstração, eu uso isso AWS Identification and Entry Administration (IAM) política:

{
	"Model": "2012-10-17",
	"Assertion": (
		{
			"Impact": "Enable",
			"Motion": (
				"secretsmanager:GetSecretValue"
			),
			"Useful resource": (
				"arn:aws:secretsmanager:us-east-2:012345678912:secret:/CodeBuild/*"
			)
		}
	)
}

Depois que eu criei o projeto na seção CodeBuild do Console de gerenciamento da AWSEntro nas três variáveis ​​do ambiente. Observe que o valor é o nome do Secret no Secrets and techniques Supervisor.

CodeBuild - Variáveis ​​de ambiente para correspondência fastlane

Você também pode definir as variáveis ​​do ambiente e o nome secreto do gerente de segredos em seu buildpsec.yaml arquivo.

Em seguida, modifico o buildspec.yaml arquivo na raiz do meu projeto para usar fastlane Para construir e assinar o binário. Meu buildspec.yaml O arquivo agora se parece com este:

# 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:
  identify: getting-started-$(date +%Y-%m-%d).ipa
  recordsdata:
    - 'getting began.ipa'
  base-directory: 'code'

Os scripts Rosetta e Amplify são necessários para receber a configuração do Amplify para o again -end. Se você não usa AWS Amplify No seu projeto, você não precisa disso.

Observe que não há nada no arquivo de compilação que baixe a tecla de assinatura ou put together o chaveiro no ambiente de construção; fastlane match fará isso por mim.

Eu adiciono o novo buildspec.yaml arquivo e meu ./fastlane diretório para git. Eu comprometo e pressiono esses arquivos. git commit -m "add fastlane help" && git push

Quando tudo corre bem, eu posso ver a construção em execução no CodeBuild e o Conseguiu mensagem.

CodeBuild - Mensagem de sucesso

Preços e disponibilidade
Fastlane agora está pré-instalado sem nenhum custo further em todas as imagens do macOS que o CodeBuild usa, em todos Regiões Onde o CodeBuild para MacOS está disponível. No momento da redação deste artigo, estes são nós, leste (Ohio, N. Virgínia), US West (Oregon), Ásia -Pacífico (Sydney) e Europa (Frankfurt).

Na minha experiência, leva um pouco de tempo para configurar fastlane match corretamente. Quando está configurado, o trabalho no CodeBuild é bem direto. Antes de tentar isso no CodeBuild, verifique se ele funciona na sua máquina native. Quando algo dá errado no CodeBuild, verifique triplique os valores das variáveis ​​de ambiente e verifique se o CodeBuild tem acesso aos seus segredos no AWS Secrets and techniques Supervisor.

Agora vá construir (no macOS)!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *