Back-End

5 mar, 2019

ASP.NET Core + PowerShell: publicando via linha de comando e em segundos uma Web App no Azure

Publicidade

Um dos serviços mais utilizados para hospedagem de aplicações Web no Microsoft Azure, o App Service, é comumente empregado no deployment de projetos a partir do próprio Visual Studio ou ainda por meio de soluções para automação, como o Azure DevOps.

Embora essas duas alternativas constituam os caminhos mais frequentes para a publicação, outras opções também estão disponíveis.

Scripts do PowerShell constituem uma dessas possibilidades com este processo envolvendo a manipulação de um arquivo ZIP com todos os itens necessários para a publicação em um recurso do Azure App Service.

O objetivo deste artigo é justamente abordar essa alternativa, através do deployment na nuvem de uma API REST para gerenciamento de um catálogo de produtos, baseada no ASP.NET Core 2.2.

Criando um novo recurso do Azure App Service

No portal do Azure um novo recurso deverá ser criado – é preciso selecionar a opção Web App:

Na próxima imagem é possível observar as informações necessárias para a criação de uma nova Web App: nome, sistema operacional, grupo de recursos e plano de serviço.

Concluído este processo, um novo App Service estará disponível para uso, já contando, inclusive, com um endereço para acesso e HTTPS habilitado:

Publicando a aplicação via script do PowerShell

O projeto utilizado nos testes descritos por este artigo já foi disponibilizado no GitHub:

Na listagem a seguir temos um script do PowerShell com as instruções necessárias para gerar o build da aplicação ASP.NET Core, bem como sua publicação em um recurso do Azure App Service:

  • Um diretório indicado pela variável $dirPublicacao conterá os arquivos da publicação. Caso o diretório especificado em $dirPublicacao já exista, o mesmo será removido forçosamente por meio do comando Remove-Item -Recurse -Force;.
  • O comando dotnet publish permitirá a publicação da aplicação com configurações de Release, com os arquivos resultantes deste processo sendo criados na pasta indicada por $dirPublicacao;
  • O nome do arquivo ZIP que conterá o pacote de publicação foi especificado na variável $arqPublicacao (novamente será efetuada a exclusão forçada ao se encontrar uma versão antiga do arquivo em questão);
  • A invocação do método CreateFromDirectory utilizando o assembly de compressão do .NET permitirá a criação do arquivo indicado em $arqPublicacao, tomando como base o diretório vinculado à $dirPublicacao;
  • Finalmente o Azure CLI (Command-Line Interface) será acionado através da instrução azwebapp deployment. Este comando receberá como parâmetros a identificação do recurso (variável $recurso), o grupo correspondente (variável $grupo) e o nome do arquivo compactado (variável $arqPublicacao).
  • Mensagens indicando o horário de início e término do processo também serão exibidas, a fim de permitir a medição do tempo total das tarefas executadas.
$dataHora = Get-Date
'Horario Inicial: ' + $dataHora

$dirPublicacao = "publicacao"
$recurso = "groffeprodutos"
$grupo = "TesteAppService"

# Força a exclusão de uma pasta para publicação criada anteriormente
if (Test-Path $dirPublicacao) {
    Remove-Item -Recurse -Force $dirPublicacao
}

# Realiza a publicação
dotnet publish -c release -o $dirPublicacao

# Remove um arquivo compactado com a publicação (caso o mesmo tenha sido
# criado anteriormente)
$arqPublicacao = "publicacao.zip"
if (Test-Path $arqPublicacao) {
    Remove-Item -Force $arqPublicacao
}

# Efetua a compressão da pasta com a publicação
Add-Type -assembly "system.io.compression.filesystem"
[io.compression.zipfile]::CreateFromDirectory($dirPublicacao, $arqPublicacao)

# Efetua o deployment utilizando o arquivo compactado (.zip)
az webapp deployment source config-zip -n $recurso -g $grupo --src $arqPublicacao

$dataHora = Get-Date
'Horario Final: ' + $dataHora

A seguir temos o resultado da execução do script deployment.ps1, totalizando 26 segundos neste exemplo (um tempo bem inferior àquele que muitos estão habituados ao utilizar o Visual Studio 2017, por exemplo):

Na próxima imagem é possível observar que foram gerados o arquivo publicacao.zip e o diretório publicacao:

Testes

O endereço https://groffeprodutos.azurewebsites.net/api/produtos servirá de base para a realização dos testes envolvendo a manipulação de informações de produtos (nesta URL podemos notar que consta o nome do recurso do App Service — groffeprodutos — criado anteriormente).

Na imagem a seguir temos a inclusão de um produto via Postman:

Uma consulta via browser trará os produtos já cadastrados (para a API REST em questão foi utilizado o Entity Framework Core InMemory, o qual possibilita o armazenamento temporário de dados sem grandes complicações):

Referências