Build e Distribuição de Apps Flutter com Azure DevOps e App Center — Parte 1
Aqui no UOL Edtech acreditamos que definir e ter um processo de build e distribuição automatizado logo no começo do desenvolvimento traz benefícios e agilidade nas entregas no decorrer do projeto.
Falando de desenvolvimento mobile infelizmente é bem comum que esse processo seja feito somente no final do desenvolvimento isso quando não acabam fazendo de forma manual.
Vou contar aqui um pouco de como fazemos a definição do nosso build usando o pipeline do Azure DevOps e release das versões para o App Center podendo assim distribuir para um grupo de testes ou para as lojas.
Porque escolhemos o Azure DevOps
Existem várias ferramentas para build e release no mercado, falando de App temos o próprio App Center da Microsoft (concorrência interna rs…), porém esse também não atende de forma “nativa” o Flutter.
O Azure DevOps tem uma grande versatilidade de plugins e se necessário existe a possibilidade de executar um script customizado.
Em termos de custo o App Center e Azure DevOps se igualam, porém no Azure DevOps esse custo pode ser compartilhado com outras aplicações de outras stacks, não só Apps, mas também aplicações Web.
Porque escolhemos o App Center
O App Center possuiu um gerenciamento de releases, testes de interface automatizados, controle de analytics e events muito bem organizados fora uma interface bem bacana.
Apesar de ele também não ter de forma “nativa” o envio de Analytics e Events para o Flutter, existem alguns plugins que resolvem esse problema e funcionam perfeitamente.
Em termos de custo todas essas features, menos a parte de build e testes, não tem nenhum custo.
Processo de build
Para desenvolver o processo de build é preciso entender o que vai iniciar o processo, o que precisamos executar e qual o resultado.
A origem do processamento normalmente é bem definido em um processo de GitFlow onde dai saberemos em que ponto precisaremos ligar o processo de build para que possa gerar os arquivos necessários para a nossa publicação.
É importante ressaltar que o processo de build é o que está mais próximo do código fonte, sendo assim nele podemos incluir a execução de testes unitários, checagens de segurança, entre outros. Nele, precisamos garantir que o executável gerado deve estar funcionando e que poderá ser aplicado em vários ambientes (queremos manter aqui o conceito de o que foi gerado e testado é o que vai subir até o ambiente de produção).
Criando o pipeline para efetuar o build
Para realizar essa atividade, primeiro foi necessário adicionar uma extensão do Flutter ao Azure DevOps. A extensão encontra-se no link:
https://marketplace.visualstudio.com/items?itemName=Hey24sheep.flutter
Para criar um novo pipeline de compilação no Azure DevOps precisamos conectar o repositório ao projeto Azure DevOps e em seguida, clicar no menu Pipelines para criar um novo pipeline de compilação. Em seguida, precisamos conectar o repositório ao pipeline. Pode-se escolher Azure Repos git, GitHub, Bitbucket.
Foi escolhido Azure Repos Git, pois o código está hospedado no Azure e utilizado a forma YAML (azure-pipelines.yml).
Ao selecionar o arquivo YAML do Azure Pipelines existente, ele solicita o caminho no repositório, onde podemos especificar o arquivo.
O arquivo YAML do pipeline do Azure contém todas as configurações que o serviço de compilação deve utilizar para compilar e testar o aplicativo, bem como gerar os artefatos de saída que serão usados para implantar o pipeline de lançamento posterior do aplicativo (CD).
Após adicionar o plugin Flutter Tasks, no arquivo azure-pipelines.yml poderão ser vistas as tarefas relacionadas ao Flutter que podem ser adicionadas ao pipeline.
No arquivo azure-pipelines, cada vez que algo é enviado para as branches main, feature/pipeline ou release/*, uma nova compilação será iniciada em uma máquina virtual com a versão mais recente do MacOS.
No pipeline, foram adicionados dois jobs: Job Android e Job iOS. Ambos apresentam similaridades e diferenças relacionadas às tarefas definidas.
Job Android
Nesse job foi realizado o build da aplicação Android para gerar o apk sem assinar. As tarefas adicionadas foram:
Flutter Install
Podemos instalar o Flutter SDK para o agente usando a tarefa FlutterInstall
Foi selecionado o canal como estável e a versão mais recente para obter a versão estável mais recente do Flutter SDK.
Flutter Build
Podemos construir o aplicativo Flutter usando a Tarefa FlutterBuild. A tarefa FlutterInstall definirá o caminho SDK nos valores de ambiente do agente. É obrigatório definir o destino e o projectDirectory. O projectDirectory deve ser o caminho para a pasta que contém o arquivo pubspec.yaml.
O target será a plataforma de destino de construção, valores válidos: “all”, “ios”, “apk”. Há outros parâmetros opcionais disponíveis para definir como o nome da compilação, variação da compilação, número da versão, etc.
Copy APK files to the Artifacts & Publish
Com o APK construído e não assinado, é necessário obtê-lo em nossa máquina. Então, precisamos copiar o APK para os diretórios de artefato com uma primeira tarefa.
Job iOS
Nesse job foi realizado o build da aplicação iOS para gerar o ipa sem assinar. Antes de adicionar as tarefas no azure-pipelines.yml, precisamos importar os certificados.
Como importar os Certificados
Para assinar o aplicativo iOS, você precisará de um perfil de provisionamento e acesso a um certificado de distribuição iOS.
Existem alguns tipos de certificados Apple:
● O certificado da App Store permite distribuir seu aplicativo através da loja oficial.
● O certificado Ad Hoc permite instalar o aplicativo apenas para uma lista de dispositivos registrados em sua conta Apple.
● O certificado interno está disponível apenas com uma conta Apple Enterprise, que permite que você distribua seu aplicativo apenas para seus funcionários.
Com o certificado (p12) e perfil de provisionamento (mobileprovision) prontos, é preciso carregá-los dentro do Secure File. Para fazer isso, vá para Pipelines > Library > Secure Files guia. Com o certificado de distribuição, é necessário exportar a chave pública dele. Para fazer isso, basta adicioná-lo ao Keychain no seu Macbook e, em seguida, clicar com o botão direito nele e exportá-lo como um arquivo .p12.
As tarefas adicionadas foram:
Install Apple Certificate
Essa tarefa instala o certificado Apple carregado.
Install Apple Provisioning Profile
Essa tarefa instala o perfil de provisionamento associado ao aplicativo.
Flutter Install
Podemos instalar o Flutter SDK para o agente usando a tarefa FlutterInstall
Flutter Build
Podemos construir o aplicativo Flutter usando a Tarefa FlutterBuild. A tarefa FlutterInstall definirá o caminho SDK nos valores de ambiente do agente. É obrigatório definir o destino e o projectDirectory. O projectDirectory deve ser o caminho para a pasta que contém o arquivo pubspec.yaml.
Gerar IPA file
Para essa tarefa, foi realizada uma configuração de Release e o iphoneos para sdk. Também foi habilitada a geração de um pacote para o app: um ipa e a opção de não assinar o build (signingOption: ‘nosign’). A assinatura será realizada na construção dos releases.
Copy IPA files to the Artifacts & Publish
Com o IPA construído e não assinado, é necessário obtê-lo em nossa máquina. Então, precisamos copiar o IPA para os diretórios de artefato com uma primeira tarefa.
Dessa forma teremos o IPA e o APK prontos para publicação.
No próximo artigo demonstrarei como fazer o processo de release e distribuição nas lojas :)
Essa análise foi feita com a participação inteira do nosso Squad Mobile, cada um participou de algo e consolidamos aqui um pouco do que foi feito, sendo assim agradeço todo o esforço do Squad e espero que de alguma forma auxilie vocês.
Para quem não me conhece: Sou Gerente de sistemas no UOL EdTech, conduzo desde a Arquitetura dos sistemas quanto o acompanhamento dos times onde desenvolvemos e mantemos uma série de aplicações voltadas para a educação de pequenas e grandes empresas.