[AZURE] - Publicando web sites - the manual and the (semi)automated way

[AZURE] - Publicando web sites - the manual and the (semi)automated way

Olá pessoALL,

Quem trabalha com .net usando o visual studio sabe que o VS e totalmente integrado com Azure o que eu considero uma grande mão na roda no nosso dia a dia.
Com a migração para outras tecnologias como node.js ou até quem tem usado o VSCode no dia a dia por ser mais leve perdemos um pouco dessas integrações, mas existem maneiras simples de fazer publicações usando a própria API do websites.

SCM, Kudu e os segredos escondidos

Todo website criado no Azure possui uma dashboard de gerenciamento, o link para acessar essa dashboard é o seguinte:

https://seusite.scm.azurewebsites.net

Imagem do kudu services
Por baixo dos panos todo website usa o kudu services que tambem pode ser utilisado on premises.

The Manual way

O jeito mais fácil de publicar um site (fora da integração com controle de versao :D) eh gerando um arquivo zip da publicação e fazendo o upload através da interface do kudu.
Para nossos testes vou utilizar um projetinho simples que tenho feito com asp.net core, o codigo eh super simples e contem uma unica api para cadastro de pessoas armazenado em memoria.

O repositorio: https://github.com/rsantosdev/aspnetcore-api
O site: https://aspcore-publish-sample.azurewebsites.net/

Para começar clone o repositório para o seu diretório local
git clone https://github.com/rsantosdev/aspnetcore-api

Após o clone entre no diretório do website
cd .\SampleApi\src\SampleApi.WebApp\

Para gerar os arquivos a serem publicados, tudo o que temos que fazer e rodar o comando:
dotnet publish

Se você não tem o .net core instalado na sua máquina, siga as instruções aqui:
https://www.microsoft.com/net/core#windows

O comando publish irá gerar uma nova pasta em bin\Debug\netcoreapp1.0\publish, essa pasta contém todos os arquivos necessarios para rodar a aplicação no Azure.

Para fazer um publish manual:

  • Crie um arquivo .zip da pasta publish
  • Crie um novo site no portal do azure
  • Navegue ate o scm do site usando o padrao https://seusite.scm.azurewebsites.net
  • No menu selecione Debug Console > CMD

Imagem Debug Console

  • Na estrutura de diretórios navegue ate site > wwwroot
  • Faça o upload do arquivo .zip usando drag and drop

Imagem Drag Drop

O serviço irá expandir o arquivo .zip automaticamente, nessa mesma tela temos acesso ao cmd que é útil para rodar comandos como npm install no caso de aplicações em node.js

The (semi)automated way

Todos os serviços disponíveis no Azure tanto no portal como no scm possuem API REST para gerenciamento, então podemos automatizar nosso processo de deploy de uma forma super simples através de um script. Nesse tutorial irei fazer com bash, mas pode ser utilizado qualquer outra linguagem

Antes de irmos para o script, precisamos definir o nome de usuário e senha para acesso as api's de publicação dos sites, tanto para web deploy quando para ftp.

  • Navegue para o portal do azure https://portal.azure.com
  • Em App Services, selecione o App Service desejado
  • Na sessão App Deployment, selecione Deployment credentials
  • Preencha o nome de usuário e senha desejados

Azure credentials creation

Na pasta da nossa WebApp crie um arquivo chamado azure-deploy.sh, o script é super simples e automatiza os passos que fizemos manualmente

#!/bin/sh

# exit on sub-module failure
set -e

# --------

echo "Deploy Started..."

export AZURE_PUBLISH_URL=${AZURE_PUBLISH_URL}
export AZURE_PUBLISH_USERNAME=${AZURE_PUBLISH_USERNAME}
export AZURE_PUBLISH_PASSWORD=${AZURE_PUBLISH_PASSWORD}

# Builds the app
echo "  Publishing"
dotnet publish
echo "  Done Publishing"

# Zip the content
echo "  Zipping"
pushd ./bin/Debug/netcoreapp1.0/publish
zip -r ../publish.zip ./*
popd
echo "  Done Zipping"

# upload and expand the zip file, the If-Match header is to force file update
echo "  Uploading zip file"
curl -H "If-Match: *" --user $AZURE_PUBLISH_USERNAME:$AZURE_PUBLISH_PASSWORD $AZURE_PUBLISH_URL/zip/site/wwwroot --upload-file ./bin/Debug/netcoreapp1.0/publish.zip
echo "  Done Uploading zip file"

echo "Deploy Finished!"

# --------

Nosso script possui 3 variáveis de ambiente AZURE_PUBLISH_URL, AZURE_PUBLISH_USERNAME e AZURE_PUBLISH_PASSWORD. Nós podemos defini-las direto no windows ou na sessão bash, para executar o script abra o bash terminal e execute o seguinte comando (dentro do diretório da nossa WebApp):

AZURE_PUBLISH_URL=url AZURE_PUBLISH_PASSWORD=senha AZURE_PUBLISH_USERNAME=username sh azure-publish.sh

O formato da url de publicação segue o seguinte padrão:
https://seusite.scm.azurewebsites.net/api

Deploy bem sucedido

Com o site em uso, pode acontecer que durante o novo deploy você receba uma exception relacionado a arquivos em uso. Existe uma maneira simples de contornar esse problema.

Navegue até o portal, no seu site, selecione Application Settings e defina um App Setting chamado COR_ENABLE_PROFILING com valor 0.

Site App Setting

Executando comandos remotos

Em aplicações node.js por exemplo e muito comum após o upload do zip precisamos rodar alguns comandos básicos como por exemplo o npm install para atualizar as nossas dependências ou algum script personalizado. No exemplo a seguir executaremos o comando npm install no nosso site

curl -H "Content-Type: application/json" --user $AZURE_PUBLISH_USERNAME:$AZURE_PUBLISH_PASSWORD -X POST -d '{"command":"npm install","dir":"site\\wwwroot"}' $AZURE_PUBLISH_URL/command

Por hoje e so pessoal, qualquer duvida e so deixar um comentario ou abrir uma issue la no repositorio: https://github.com/rsantosdev/aspnetcore-api