Build e Distribuição de Apps Flutter com Azure DevOps e App Center — Parte 1

Ricardo Garavello Borges
UOL EdTech P&D
Published in
7 min readJan 22, 2021

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.

--

--