Como criar uma api dart e rodar no azure app service?

Configurando um pipeline com github actions para uma aplicação Dart para rodar no Azure App service

O título do artigo tem várias coisas incomuns e foi exatamente por eu não ter achado nada que apresentasse essa solução em buscas que fiz no google, que fui motivado a fazer.

Vou adiantar que algumas coisas não entrarei no detalhe, por ser etapa secundária ou por já ser conhecido. Mas vou listar os requisitos/passos necessários.

O começo

Primeiro você terá de instalar uma IDE e minha recomendação para quem usa windows é a receita: vscode e docker desktop com wsl2

Configurando o dart

Você terá de instalar o dart para desenvolver e esse material é o que você precisa: https://dart.dev/get-dart#install-a-debian-package

Depois de instalado o dart, vamos para o aqueduct

  • dart --version
  • pub global activate aqueduct
  • export PATH="$PATH":"$HOME/.pub-cache/bin"
  • echo 'export PATH="$PATH":"$HOME/.pub-cache/bin"' >> ~/.profile

Material bacana sobre Dart API: https://itnext.io/building-restful-web-apis-with-dart-aqueduct-and-postgresql-part-2-routing-with-crud-operations-629fe58114fa

Agora, bora lá criar o projeto

aqueduct create dart_crud_api && cd dart_crud_api
*obrigatório o uso de snake_case para o nome do diretório

Criei um Docker file usando a imagem base https://hub.docker.com/r/google/dart/. E para executar local com dart ou rodando usando docker.

Local com dart:

aqueduct serve ou dart bin/main.dart

com Docker:

docker build -t my/dart-api .

e

docker run -d -p 8000:8000 my/dart-api

Importante não esquecer da porta utilizada pela aplicação. Local eu usei a porta 8000, porém, quando chegarmos na etapa de subir no App Service, precisaremos alterar o Dockerfile e o main.dart para usar a porta 80.

No DockerHub

Crie no DockerHub seu repositório (https://hub.docker.com/repository/create) e será esse repositório que você utilizará no workflow do GitHub actions.

Já criei e subi no github minha aplicação

Agora é o momento de criar seu pipeline com github actions e para isso, fiz algo bem simples para apenas jogar a imagem pro DockerHub.

Lembre-se que existem várias formas de construir seu pipeline, mas sempre que configurar seu pipeline, certifique-se de colocar os dados sensíveis em secrets do github.

E o Azure?

Bom, no Azure, eu utilizei (como o próprio título menciona), o Azure App Service para fazer com que o Azure busque as versões recentes de imagens disponibilizadas no DockerHub pelo GitHub e publique imediatamente em meu ambiente.

Lembre-se do que já falei. É importante que sua aplicação esteja configurada para porta 80, e no Azure App Service você deve configurar o ambiente para executar em container e pode usar o plano developer (free). De resto, é o default, configurar subscription (caso ainda não tenha), criar um resource group (ou usar um que já exista).

E depois?

Bom, você subiu a aplicação configurada com Dockerfile usando a porta 80 pro GitHub, criou o repositório no DockerHub, fez a configuração do GitHub Actions e configurou no Azure o App Service. Então, ta feito :)

Você deve ter sido direcionado para uma tela que apresenta alguns dados após a conclusão do provisionamento da aplicação no App Service. Lá terá uma URL (a URL que você configurou na imagem acima). Basta acessar essa url e sua aplicação estará rodando como essa: https://dart-crud-api.azurewebsites.net/books/10.

E eu vou ficando por aqui, mas deixo abaixo os links dos artefatos produzidos para esse artigo e uma mensagem: Dart não é só para Google Cloud ;)

Projeto no GitHub: https://github.com/rcelebrone/dart-crud-api

Imagem da aplicação gerada no Docker Hub pelo pipeline no GitHub actions: https://hub.docker.com/r/rcelebrone/dart-crud-api

Endereço da aplicação rodando no Azure App Service: https://dart-crud-api.azurewebsites.net