DEV Community

Felipe Baltazar
Felipe Baltazar

Posted on

3

Maui gerando APK/IPA no AzureDevops

Image description

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

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

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

Image description

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


2. Criando pipeline

Ao criar uma pipeline em formato YAML, teremos o template a seguir oferecido pelo AzureDevops:

# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml
trigger:
- main
pool:
vmImage: ubuntu-latest
steps:
- script: echo Hello, world!
displayName: 'Run a one-line script'
- script: |
echo Add other tasks to build, test, and deploy your project.
echo See https://aka.ms/yaml
displayName: 'Run a multi-line script'

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.

trigger:
- main
jobs:
- job: Job_Android
displayName: Build Android
- job: Job_iOS
displayName: Build iOS

3. Configurando Android

trigger:
- main
jobs:
- job: Job_Android
displayName: Build Android
pool:
vmimage: 'windows-latest'
steps:
- task: UseDotNet@2
inputs:
packageType: 'sdk'
version: '7.x'
- task: Bash@3
displayName: Instalando MAUI
inputs:
targetType: 'inline'
script: |
dotnet nuget locals all --clear
cd "Maui.AzurePipelines/"
dotnet workload restore
- task: JavaToolInstaller@0
displayName: Instalando JDK
inputs:
versionSpec: '11'
jdkArchitectureOption: 'x64'
jdkSourceOption: 'PreInstalled'
- task: CmdLine@2
displayName: 'Compilando Android App'
inputs:
script: |
cd "Maui.AzurePipelines/"
dotnet publish Maui.AzurePipelines.csproj -f net7.0-android -c Release
- task: CopyFiles@2
displayName: Copiando para o diretorio de artifacts
inputs:
Contents: |
**/*.aab
**/*.apk
TargetFolder: '$(Build.ArtifactStagingDirectory)'
flattenFolders: true
- task: PublishBuildArtifacts@1
displayName: Liberando nos artifacts
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop_android'
publishLocation: 'Container'
- job: Job_iOS
displayName: Build iOS

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:

Image description

Image description


4. Configurando iOS

..... (build do android)
- job: Job_iOS
displayName: Build iOS
pool:
vmimage: 'macOS-latest'
demands:
- MSBuild
steps:
- task: UseDotNet@2
inputs:
packageType: 'sdk'
version: '7.x.x'
- task: Bash@3
displayName: Install MAUI
inputs:
targetType: 'inline'
script: |
dotnet nuget locals all --clear
cd "Maui.AzurePipelines/"
dotnet workload restore
- task: Bash@3
displayName: Build IOS App
inputs:
targetType: 'inline'
script: |
cd "Maui.AzurePipelines/"
dotnet publish Maui.AzurePipelines.csproj -f net7.0-ios -c Release
- task: CopyFiles@2
inputs:
Contents: |
**/*.app
**/*.ipa
TargetFolder: '$(Build.ArtifactStagingDirectory)'
flattenFolders: true
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop_ios'
publishLocation: 'Container'

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:

GitHub logo felipebaltazar / Maui.AzurePipelines

Utilitários para Azure pipelines feito em dotnet MAUI




Referências:

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (2)

Collapse
 
marcoscostadev profile image
Marcos Costa

Uma dica, dá pra otimizar mais se rodar tudo no MacOs quando estiver trabalhando com Android e iOS. Exemplo, definir a imagem que todo o arquivo que compila para as duas plataformas ser o MacOs. Economiza uns bons minutos de build essa mudança.

Collapse
 
felipebaltazar profile image
Felipe Baltazar

Só tem que ficar de olho que o MacOs gera custos de utilização da imagem, geralmente as empresas limitam o uso dele, oque acaba criando mais fila.

Billboard image

Try REST API Generation for MS SQL Server.

DevOps for Private APIs. With DreamFactory API Generation, you get:

  • Auto-generated live APIs mapped from database schema
  • Interactive Swagger API documentation
  • Scripting engine to customize your API
  • Built-in role-based access control

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay