Maui gerando APK/IPA no AzureDevops
Tags: dotnet, maui, dotnetmaui, devops
Published: 2023-10-15 16:38:36


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2botirt83ovi5rj3rvsg.png)

Configurando CI/CD para aplicativos dotnet MAUI utilizando AzureDevops.

---

Esse artigo faz parte de uma série que visa explicar sobre todo potencial que podemos adquirir através de pipelines automatizadas.
Nesses artigos vou apresentar formas de criar essas automações tanto utilizando o Azure Pipelines quanto o Github Actions.
Caso você tenha alguma outra sugestão de artigo, fique a vontade para sugerir nos comentários no final do post!

---

## 1. Repositório

> Caso você ja possua um repositório no AzureDevops ou vinculado ao Azure através de outra fonte, você pode pular para o tópico 2.

Com sua conta do AzureDevops criada, você irá criar um projeto preenchendo as informações de nome, descrição e visibilidade.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/voa5j67v8pbjko9iq2du.png)

Ao criar o projeto, podemos iniciar um repositório diretamente via portal ou, caso o código do app ja exista, podemos importá-lo.
Para esse caso vou importar do Github, pois o aplicativo já existe no meu perfil, selecionando diretamente **Pipelines > New Pipeline**.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lyb19c4g8fcnyzatvemv.png)

Após vincular sua conta Github, você poderá selecionar qualquer repositório para utilizar na pipeline que você está criando.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ik6b87l266mo8rmh9lhb.png)

Então alguns templates serão oferecidos mas, até a escrita desse artigo, nenhum template de **dotnet maui** existia, então iniciaremos com uma pipeline vazia.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5f369g5s8o9nn5mhubvm.png)

---

## 2. Criando pipeline
Ao criar uma pipeline em formato YAML, teremos o template a seguir oferecido pelo AzureDevops:
{% embed https://gist.github.com/felipebaltazar/ed15408763eef7df7127c26c67f9013f.js %}

O “_trigger_” simboliza quando a pipeline vai ser executada de forma automática. No caso do template, sempre que o branch “main” tiver alguma alteração, seja através de um **PullRequest** ou **Commits** diretos.

Além disso estamos utilizando um ubuntu na ultima versão do sistema operacional, para rodar os passos dessa pipeline.

Nesse exemplo vamos gerar nosso aplicativo para android e iOS, portanto queremos que esses artefatos sejam construidos de forma paralela e independente. Assim conseguimos verificar se existe problema de compilação em apenas uma plataforma entre outros benefícios, como o da redução do tempo total da pipeline.
No AzureDevops um agrupador de tarefas se chama “Job”, onde podemos criar um “passo a passo” para a execução de um processo especifico.

{% embed https://gist.github.com/felipebaltazar/4a69769ba28a11901683a8faf96da8b5.js %}

---

## 3. Configurando Android

{% embed https://gist.github.com/felipebaltazar/da812bd13e17b487462163d90b3a3bb7.js %}

A partir da _linha 9_ até a _linha 45_ temos todo o processo de compilação para android chamados de **Task**.
Cada **Task** tem o objetivo de ajustar o ambiente para que a compilação ocorra de forma correta.

Primeiro instalamos definimos a versão do dotnet (_linha 10_) que é necessaria para o nosso projeto, nesse exemplo estamos usando a versao **net7**.
Logo após instalamos o workload do dotnetMaui (_linha 16_), que é necessário para compilar o qualquer projeto feito em **MAUI**.
Finalmente começamos o processo de compilação (_linha 24_) utilizando o comando `dotnet publish` passando como parametro a informação `— f net7-android` indicando que compilaremos apenas para a plataforma **android**.

Como queremos ter acesso ao “**apk**” e/ou “**aab**”, vamos copiá-los (_linha 31_) para o diretório de artefatos e em seguida publicá-los (_linha 40_).
Dessa forma teremos acesso diretamente na pipeline, na aba de artifacts.

[Resultado do exemplo:](https://dev.azure.com/5high/Maui.AzurePipelines/_build/results?buildId=99&view=results)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqxlooy5fsc7365wbaf6.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jnaueqv6uj1e0fhbvy6b.png)

---

## 4. Configurando iOS

{% embed https://gist.github.com/felipebaltazar/0140170d6d35bbe30567e877716105b6.js %}

Aqui o processo é bem parecido com o do android, a diferença começa na máquina virtual (_linha 7_) utilizada pra compilar, que precisamos que seja **Mac**.
Nesse caso utilizei o `macos-latest`, que utiliza a ultima versão do MacOs estavél disponivel pelo **AzureDevops**.

---

## Considerações finais
Nesse post aprendemos um pouco do funcionamento do **AzurePipelines**, utilizando **yaml** focado em **MAUI**. No meu próximo post ensinarei a fazer a assinatura dos artefatos, tanto para **Android** quanto para **IOS**.
Caso tenha dúvidas ou sugestões sobre algum tema específico, deixa aqui nos comentários para eu trazer de forma simplificada para você.

**Repositório de exemplo:**

{% embed https://github.com/felipebaltazar/Maui.AzurePipelines %}

## Referências:
- [DevOps With .Net Maui](https://learn.microsoft.com/pt-br/shows/dotnetconf-focus-on-maui/devops-with-dotnet-maui-using-github-actions-azure-devops)
- [Getting Started With DevOps and .Net MAUI](https://devblogs.microsoft.com/dotnet/devops-for-dotnet-maui/)