Docker + GitHub Actions - parte 2: deployment automatizado de aplicações
Em um artigo anterior abordei o build automatizado de imagens Docker, fazendo uso para isto de um workflow criado com GitHub Actions e de um projeto baseado no ASP.NET Core 3.1. As imagens geradas foram configuradas para publicação no Azure Container Registry:
Docker + GitHub Actions - parte 1: build automatizado de aplicações
Neste novo post concluo a série sobre GitHub Actions, com a alteração do workflow já gerado a fim de que o mesmo proceda com o deployment automatizado no Azure Web App for Containers da aplicação descrita na parte 1 deste tutorial.
E aproveito este espaço para um convite… Que tal participar do primeiro treinamento online sobre GitHub Actions promovido pelo Azure na Prática e que acontecerá durante o dia 08/08/2020 (sábado), cobrindo boas práticas + estratégias de build/deployment e o uso desta solução de automação com tecnologias como Docker, Kubernetes, Azure App Service, Azure Functions e outros serviços da nuvem Microsoft? Acesse então o link a seguir para efetuar sua inscrição no preço promocional com 25% de desconto, apenas R$ 300,00 (inclui certificado e grupo para resolução de dúvidas após o curso):
Criando um novo recurso do Azure Web App for Containers
Demonstrarei nesta seção a criação de um novo recurso baseado no Azure Web App for Containers, o qual fará uso da imagem apicontagem (hospedada no Container Registry groffegithubactions) para a execução de instâncias da API de testes a partir de containers na nuvem Microsoft.
Utilizando o Portal do Azure incluir um novo recurso, acionando para isto a opção Web App for Containers:
Em Web App informar:
- O nome do recurso em Name (groffe-githubactions);
- Em Publish certificar-se de que está selecionada a opção Docker Container, assim como Linux em Operating System;
- Informar ainda o Resource Group, Region (Data Center) e o Linux Plan em App Service Plan (neste último caso definindo a infraestrutura a ser alocada).
Dar andamento à criação do recurso acionando a opção Next: Docker>.
Informar na seção Docker as definições da imagem utilizada no deployment da aplicação:
- Em Options deverá estar marcada a opção Single Container, ao passo que em Image Source será necessário selecionar Azure Container Registry;
- Em Registry informar o nome do recurso do Azure Container Registry (groffegithubactions);
- Selecionar ainda a imagem em Image (apicontagem), bem como a versão em Tag (latest).
Clicar em seguida no botão Review + create:
Após a revisão clicar finalmente no botão Create, para assim finalizar este procedimento com a geração de um novo recurso do Azure Web App for Containers:
Na próxima imagem podemos observar o recurso já criado, com o endereço de acesso ao mesmo destacado em vermelho:
Um teste de acesso à API REST trará no resultado a última alteração realizada na branch master (para maiores detalhes consulte a parte 1 deste tutorial):
Configurando o acesso ao Azure Web App for Containers no repositório do GitHub
Na primeira parte deste tutorial demonstrei a criação e utilização de Secrets a partir de um repositório do GitHub (na ocasião foram configuradas as definições para acesso ao Container Registry gerado no Azure). Para efetuar a publicação no recurso do Azure Web App for Containers gerado na seção anterior precisaremos agora criar um Secret chamado AZURE_CREDENTIALS, o qual conterá as credenciais para acesso e publicação da aplicação na nuvem Microsoft.
E como obter então o valore esperado para AZURE_CREDENTIALS?
Será necessário executar o seguinte comando por meio do Azure CLI (procedimento válido tanto em PowerShell, quanto em Bash):
az ad sp create-for-rbac --name "<NOME SERVICE PRINCIPAL>" --role contributor --scopes /subscriptions/<SUBSCRIPTION>/resourceGroups/<GRUPO>/providers/Microsoft.Web/sites/<NOME DO RECURSO> --sdk-auth
Em que:
- O parâmetro <NOME SERVICE PRINCIPAL> corresponde ao nome do Service Principal (conjunto de permissões de acesso) a ser criado;
- O parâmetro <SUBSCRIPTION> conterá a Id da Subscription (assinatura) no Microsoft Azure;
- Já o parâmetro <GRUPO> se refere ao Resource Group em que foi gerado o recurso do Azure Web App for Containers;
- E finalmente no parâmetro <NOME DO RECURSO> estará o nome da Web App criada no Azure.
Na imagem a seguir temos o resultado da execução do comando az ad sp create-for-rbac para a Web App groffe-githubactions, com a string JSON contendo as credenciais de acesso destacada em vermelho:
O Secret AZURE_CREDENTIALS receberá então o conteúdo desta string JSON durante sua criação no repositório do GitHub:
Alterando o workflow para efetuar o deployment automatizado
Na primeira parte deste tutorial demonstrei como criar um workflow para build automatizado de imagens Docker, fazendo uso para isto de um projeto ASP.NET Core 3.1 com um arquivo Dockerfile devidamente configurado. Dando andamento a essa atividade procederei agora com alteração de tal workflow, a fim de que uma vez que uma imagem Docker tenha sido gerada aconteça logo na sequência o deployment em um recurso do Azure Web App for Containers.
Editar para isto o arquivo dockerimage.yml (criado anteriormente na pasta /.github/workflows). Localizar na sequência a Action Azure Login no Marketplace, copiando seu contéudo para inclusão e configuração do mesmo em dockerimage.yml:
O trecho a seguir contém o código esperado para a Action Azure Login , já referenciando inclusive o Secret AZURE_CREDENTIALS (estamos com tal ação nos conectando ao Microsoft Azure para efetuar o deployment):
Utilizaremos também a Action Azure WebApp Container:
Na próxima listagem está o código para essa Action, com a mesma configurada para o deployment automatizado utilizando a tag latest (imagem apicontagem) na Web App groffe-githubactions:
O código completo para o arquivo dockerimage.yaml está na listagem a seguir:
Confirmar as alterações acionando a opção Start commit e na sequência o botão Commit changes (apontando para a branch master e preenchendo o descritivo das alterações):
O commit no arquivo dockerimage.yaml irá disparar a execução do workflow, com a execução de todas as etapas definidas no mesmo (dentre elas o build da imagem e o deployment da aplicação Web empregando containers Docker):
Testando o deployment automatizado
Commits na branch master resultarão no build de novas imagens da APIs REST (como já demonstrado anteriormente na parte 1 deste tutorial). A novidade agora está também no deployment automatizado após os ajustes da seção anterior, empregando para isto tais imagens na publicação no recurso baseado no Azure Web App for Containers.
Levando em conta uma alteração como a indicada a seguir:
Logo após este commit terá início uma nova execução do workflow:
Na imagem a seguir podemos observar o deployment em andamento (logo após o build da imagem):
E após alguns segundos a conclusão bem sucedida de todo este processo:
Acessando a API constataremos então que o retorno da mesma já contempla a alteração efetuada na classe ContadorController.cs: