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 construct
em 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
fastlane
com 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 comopen /System/Library/CoreServices/Purposes/Keychain Entry.app
. Selecione a chave que deseja exportar e clique com o botão direito para selecionar Exportar.
![]() | ![]() |
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/
.
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.
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_PASSWORD
a senha que digitei ao importar o materials de assinatura. Fastlane usa esta senha para decifrar os arquivos criptografados no repositório do GitHubFASTLANE_SESSION
o valor do cookie da sessão de ID da Apple, localizado em~/.fastlane/spaceship/
. A sessão é válida de algumas horas a vários dias. Quando a sessão expirar, reautentique com o comando/cookie fastlane spaceauth
do seu laptop computer e atualize o valor deFASTLANE_SESSION
com o novo valor do cookie.MATCH_GIT_BASIC_AUTHORIZATION
uma 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.
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.
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)!