🐦Codemagic Yaml + SHOREBIRD
Documentação do Codemagic.yaml para Workflows Flutter
Introdução
Este documento descreve a estrutura do arquivo codemagic.yaml
para configurar workflows de build e publicação de aplicativos Flutter no Codemagic CI/CD. O YAML fornecido abrange dois workflows: um para construir e publicar no Android e outro para construir e publicar no iOS.
Estrutura do Arquivo
O arquivo codemagic.yaml
possui a seguinte estrutura geral:
workflows:
android-workflow:
name: Android Workflow
instance_type: mac_mini_m1
environment:
groups:
- env # Expõe as variáveis definidas do grupo env no codemagic
android_signing:
- keystore-token # Adicione a referência para a keystore do app no codemagic
flutter: 3.19.5 # Versão do flutter para rodar a build
scripts:
- name: Set up local.properties
script: |
echo "flutter.sdk=$HOME/programs/flutter" > "$CM_BUILD_DIR/android/local.properties"
- name: Pre-build script # Passo de configuração pre build, onde os envs serão atribuídos e as dependências serão obtidas
script: |
echo $ENV | base64 --decode > .env.staging &&
echo $ENV | base64 --decode > .env.production &&
flutter clean &&
flutter pub get
- name: Build Release # Comando para gerar o .aab do app
script: |
flutter build appbundle --release --flavor staging
artifacts: # Define quais artefatos serão expostos após o final da build
- build/**/outputs/**/*.aab
- build/**/outputs/**/*.apk
- build/**/outputs/**/mapping.txt
- flutter_drive.log
publishing:
email: # Define quais email receberão notificações do sucesso ou falha da build
recipients:
- dev@loomi.com.br
notify:
success: true # Define se deve notificar no sucesso da build
failure: false # Define se deve notificar na falha da build
ios-workflow:
name: iOS Workflow
instance_type: mac_mini_m1
integrations:
app_store_connect: Reference # Adiciona a referência para a API key do projeto do Apple Developer Portal
environment:
groups:
- env # Expõe as variáveis definidas do grupo env no codemagic
ios_signing:
distribution_type: app_store # Define o tipo de distribuição do app
bundle_identifier: br.com.loomi.example # Bundle ID do app
flutter: 3.19.5 # Versão do flutter para rodar a build
xcode: latest # Versão do xcode para rodar a build
cocoapods: default # Versão dos cocoapods
scripts:
- name: Set up code signing settings on Xcode project
script: |
xcode-project use-profiles
- name: Pre-build script # Passo de configuração pre build, onde os envs serão atribuídos e as dependências serão obtidas
script: |
echo $ENV | base64 --decode > .env.staging &&
echo $ENV | base64 --decode > .env.production &&
flutter clean &&
flutter pub upgrade &&
flutter pub get && cd ios &&
flutter precache --ios &&
pod update && pod install --repo-update
- name: Build Release # Comando para gerar o .ipa do app
script: |
flutter build ipa --release --flavor staging --export-options-plist=/Users/builder/export_options.plist
artifacts:
- build/ios/ipa/*.ipa
- tmp/xcodebuild_logs/*.log
- flutter_drive.log
publishing:
email: # Define quais email receberão notificações do sucesso ou falha da build
recipients:
- dev@loomi.com.br
notify:
success: true # Define se deve notificar no sucesso da build
failure: false # Define se deve notificar na falha da build
app_store_connect:
auth: integration
# Configuração relacionada ao TestFlight (opcional)
# Obs: Essa ação é executada durante o pós processamento.
submit_to_testflight: true # Define se o app deve ser publicado no TestFlight
# Configuração relacionada à AppStore (opcional)
# Obs: Essa ação é executada durante o pós processamento.
submit_to_app_store: false # Define se o app deve ser submetido para revisão na AppStore
Android Workflow
Nome: Android Workflow
instance_type: Tipo da instância de build (no exemplo:
mac_mini_m1
).environment:
groups: Grupos de variáveis do ambiente expostas para o Codemagic. Para definir essas variáveis você pode ir até as configurações de build do app > Environment variables no Codemagic. (CODEMAGIC_ENV_VAR)
android_signing: Configurações de assinatura para o Android.
Adicione a keystore do app em Teams > Personal Account > Code Signing Identities > Android keystores. O nome definido para a chave nesse passo será a referência a ser utilizada no yaml. (CODEMAGIC_KEYSTORE)
No build.gradle do app, em signingConfigs, adicione as informações da chave que serão utilizadas no processo de CI.
if (System.getenv()["CI"]) { // CI=true is exported by Codemagic storeFile file(System.getenv()["CM_KEYSTORE_PATH"]) storePassword System.getenv()["CM_KEYSTORE_PASSWORD"] keyAlias System.getenv()["CM_KEY_ALIAS"] keyPassword System.getenv()["CM_KEY_PASSWORD"] } else { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword keystoreProperties['storePassword'] }
flutter: Versão do Flutter para executar a build.
scripts:
Set up local.properties: Configuração do arquivo
local.properties
.Pre-build script: Configurações pré-build, decodificação de variáveis de ambiente e obtenção de dependências.
Build Release: Comando para gerar o arquivo
.aab
do aplicativo.
artifacts: Artefatos a serem expostos após a conclusão da build.
publishing: Configurações para notificação por e-mail.
iOS Workflow
Nome: iOS Dev
instance_type: Tipo da instância de build (no exemplo:
mac_mini_m1
).integrations: Configurações específicas da integração, como a chave da API do Apple Developer Portal.
A chave pode ser adicionada em Teams > Personal Account > Integrations > Manage keys (Developer Portal) > Add another key. O nome definido para a chave nesse passo será a referência a ser utilizada no yaml. (CODEMAGIC_ADP_API_KEY)
Após a adição da chave, para que o app seja publicado no TestFlight é necessário adicionar também os iOS certificates e iOS provisioning profiles no codemagic. Acesse Teams > Personal Account > Code signing identities, e faça um fetch do certificado e dos profiles a partir da chave adicionada. (CODEMAGIC_CERT) (CODEMAGIC_PROV_PROF)
environment:
groups: Grupos de variáveis do ambiente expostas para o Codemagic.
ios_signing: Configurações de assinatura para o iOS.
flutter: Versão do Flutter para executar a build.
xcode: Versão do Xcode para executar a build.
cocoapods: Versão do CocoaPods para executar a build.
scripts:
Set up code signing settings on Xcode project: Configurações de assinatura no projeto Xcode.
Pre-build script: Configurações pré-build, decodificação de variáveis de ambiente e obtenção de dependências.
Build Release: Comando para gerar o arquivo
.ipa
do aplicativo.
artifacts: Artefatos a serem expostos após a conclusão da build.
publishing: Configurações para notificação por e-mail e publicação no App Store Connect.
Integração ao Code Push Shorebird
A documentação fornecida pelo Shorebird já é suficientemente robusta para configurar a integração contínua do serviço. No entanto, existem algumas observações a serem notadas no passo a passo desse processo.
Em versões mais recentes do shorebird, durante a build do iOS pode ocorrer o seguinte erro:
Exception: Export options plist /Users/builder/export_options.plist does not set manageAppVersionAndBuildNumber to false. This is required for shorebird to work.
Build failed :|
Step 7 script `🚀 Shorebird Release` exited with status code 64
Para resolvê-lo, basta modificar o passo Set up code signing settings on Xcode project
para que fique da seguinte maneira:
- name: Set up code signing settings on Xcode project
script: |
xcode-project use-profiles
/usr/libexec/PlistBuddy -c 'Add :manageAppVersionAndBuildNumber bool false' /Users/builder/export_options.plist
É importante notar também que o Shorebird não usa a versão do flutter definida no codemagic.yaml para gerar a build do app. Para definir uma versão específica para executar a build adicione --flutter-version <VERSÃO>
ao comando shorebird release
. As versões suportadas podem ser encontradas aqui.
> Para o Android, é necessário o Flutter 3.10.0 ou posterior.
> Para o iOS, é necessário o Flutter 3.19.5 ou posterior.
Abaixo segue um exemplo de codemagic.yaml com a adição do Shorebird aos workflows.
workflows:
android-workflow:
name: Android Workflow
instance_type: mac_mini_m1
environment:
groups:
- shorebird # Expõe o SHOREBIRD_TOKEN
- env # Expõe as variáveis definidas do grupo env no codemagic
android_signing:
- keystore-token # Adicione a referência para a keystore do app no codemagic
flutter: 3.19.5 # Versão do flutter para rodar a build
scripts:
- name: Set up local.properties
script: |
echo "flutter.sdk=$HOME/programs/flutter" > "$CM_BUILD_DIR/android/local.properties"
- name: Pre-build script # Passo de configuração pre build, onde os envs serão atribuídos e as dependências serão obtidas
script: |
echo $ENV | base64 --decode > .env.staging &&
echo $ENV | base64 --decode > .env.production &&
flutter clean &&
flutter pub get
- name: 🐦 Setup Shorebird # Instalação do Shorebird
script: |
# Install Shorebird
curl --proto '=https' --tlsv1.2 https://raw.githubusercontent.com/shorebirdtech/install/main/install.sh -sSf | bash
# Add Shorebird to PATH
echo PATH="$HOME/.shorebird/bin:$PATH" >> $CM_ENV
- name: 🚀 Shorebird Release # Comando para gerar o .aab do app
script: |
shorebird release android --flavor staging --flutter-version 3.16.9
artifacts: # Define quais artefatos serão expostos após o final da build
- build/**/outputs/**/*.aab
- build/**/outputs/**/*.apk
- build/**/outputs/**/mapping.txt
- flutter_drive.log
publishing:
email: # Define quais email receberão notificações do sucesso ou falha da build
recipients:
- dev@loomi.com.br
notify:
success: true # Define se deve notificar no sucesso da build
failure: false # Define se deve notificar na falha da build
ios-workflow:
name: iOS Workflow
instance_type: mac_mini_m1
integrations:
app_store_connect: Reference # Adiciona a referência para a API key do projeto do Apple Developer Portal
environment:
groups:
- shorebird # Expõe o SHOREBIRD_TOKEN
- env # Expõe as variáveis definidas do grupo env no codemagic
ios_signing:
distribution_type: app_store # Define o tipo de distribuição do app
bundle_identifier: br.com.loomi.example # Bundle ID do app
flutter: 3.19.5 # Versão do flutter para rodar a build
xcode: latest # Versão do xcode para rodar a build
cocoapods: default # Versão dos cocoapods
scripts:
- name: Set up code signing settings on Xcode project
script: |
xcode-project use-profiles
/usr/libexec/PlistBuddy -c 'Add :manageAppVersionAndBuildNumber bool false' /Users/builder/export_options.plist
- name: Pre-build script # Passo de configuração pre build, onde os envs serão atribuídos e as dependências serão obtidas
script: |
echo $ENV | base64 --decode > .env.staging &&
echo $ENV | base64 --decode > .env.production &&
flutter clean &&
flutter pub upgrade &&
flutter pub get && cd ios &&
flutter precache --ios &&
pod update && pod install --repo-update
- name: 🐦 Setup Shorebird # Instalação do Shorebird
script: |
# Install Shorebird
curl --proto '=https' --tlsv1.2 https://raw.githubusercontent.com/shorebirdtech/install/main/install.sh -sSf | bash
# Add Shorebird to PATH
echo PATH="$HOME/.shorebird/bin:$PATH" >> $CM_ENV
- name: 🚀 Shorebird Release # Comando para gerar o .ipa do app
script: |
shorebird release ios --flavor staging --export-options-plist=/Users/builder/export_options.plist --flutter-version 3.16.9
artifacts:
- build/ios/ipa/*.ipa
- tmp/xcodebuild_logs/*.log
- flutter_drive.log
publishing:
email: # Define quais email receberão notificações do sucesso ou falha da build
recipients:
- dev@loomi.com.br
notify:
success: true # Define se deve notificar no sucesso da build
failure: false # Define se deve notificar na falha da build
app_store_connect:
auth: integration
# Configuração relacionada ao TestFlight (opcional)
# Obs: Essa ação é executada durante o pós processamento.
submit_to_testflight: true # Define se o app deve ser publicado no TestFlight
# Configuração relacionada à AppStore (opcional)
# Obs: Essa ação é executada durante o pós processamento.
submit_to_app_store: false # Define se o app deve ser submetido para revisão na AppStore
Conclusão
Este é um exemplo básico do arquivo codemagic.yaml
para workflows Flutter no Codemagic. Certifique-se de adaptar as configurações de acordo com as necessidades específicas do seu projeto e dos ambientes de build.
Last updated