GitHub Actions: exemplos de workflows para build e deployment em várias tecnologias
Voltado ao build e deployment de projetos hospedados em repositórios do GitHub, o GitHub Actions é uma solução para automação cujo uso vem crescendo consideravelmente a cada dia.
Diversas tecnologias contam hoje com suporte à utilização de workflows criados com GitHub Actions para build e deployment automatizados, sendo possível destacar Docker, .NET Core/ASP.NET Core, Node.js, Java, Python, C++, PHP e Ruby entre as alternativas disponíveis. Plataformas de cloud computing como Microsoft Azure, AWS e Google Cloud também oferecem workflows e Actions que em muito simplificam o deployment de projetos na nuvem.
Já abordei inclusive o build e deployment de workflows baseados em GitHub Actions nos seguintes artigos:
Docker + GitHub Actions - parte 1: build automatizado de aplicações
Docker + GitHub Actions - parte 2: deployment automatizado de aplicações
GitHub Actions - Guia de Referência Gratuito
Neste novo post trago exemplos de workflows para a automação do build e deployment de projetos com GitHub Actions utilizando tecnologias como Ubuntu/Linux (ambiente de execução de um workflow), Docker, Docker Hub, Azure Container Registry, Azure App Service e ASP.NET Core 3.1.
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):
Exemplo de build de imagens Docker com publicação no Docker Hub
Para o build de uma imagem Docker podemos fazer uso do workflow Docker image:
A listagem a seguir traz o workflow para build de uma imagem Docker e push da mesma no Docker Hub:
- Com a Action Azure/docker-login podemos nos conectar ao Docker Hub, informando um usuário e senha (gravados como secrets);
- O workflow permitirá o uso do Docker CLI (utilitário de linha de comando do Docker) para build e deployment da imagem no Docker Hub. Para isto dependemos de um Dockerfile devidamente configurado; estão sendo gerados neste exemplo a tag latest e uma segunda tag que indica o número de execução do workflow (valor retornado pela variável de ambiente $GITHUB_RUN_NUMBER).
Exemplo de build de imagens Docker com publicação no Azure Container Registry
O próximo workflow é uma variação daquele que apresentei na seção anterior:
- Em ${{ secrets.DOCKER_CONTAINER_REGISTRY }} está o caminho do Azure Container Registry;
- A Action Azure/docker-login foi novamente utilizada, com a adição desta vez do parâmetro login-server.
Na imagem a seguir podemos observar imagens geradas após vários testes de build (o número incremental das tags corresponde ao valores de $GITHUB_RUN_NUMBER:
Exemplo de build e deployment automatizados utilizando Docker, Azure Container Registry e Azure Web App for Containers
O workflow a seguir complementa o exemplo da seção anterior, com o uso adicional das seguintes Actions:
- O login no Azure se faz por meio da Action azure/login (com as credenciais indicadas em ${{ secrets.AZURE_CREDENTIALS }});
- O deployment no Azure Web App for Containers acontece em seguida, por meio da Action Azure/webapps-container-deploy (que receberá o nome do recurso atribuído a ${{ secrets.WEB_APP }}).
Instrução executada via Azure CLI para obter o valor a ser configurado para ${{ secrets.AZURE_CREDENTIALS }}:
az ad sp create-for-rbac --name "GroffeWebAppContainersGitHubActions" --role contributor --scopes /subscriptions/<SUBSCRIPTION>/resourceGroups/<GRUPO DE RECURSOS>/providers/Microsoft.Web/sites/<FUNCTION APP> --sdk-auth
Em que serão informadas a subscription do Azure (<SUBSCRIPTION>), o grupo de recursos (<GRUPO DE RECURSOS>) e o nome da Function App (<FUNCTION APP>).
Na próxima imagem está o resultado de uma execução com sucesso deste workflow:
Exemplo de build utilizando .NET Core 3.1
Ao iniciarmos a montagem das configurações para build e deployment de uma aplicação ASP.NET Core o próprio GitHub Actions irá sugerir o workflow do .NET Core:
A seguir temos um exemplo de workflow, com a execução de instruções via .NET CLI (utilitário dotnet) gerando os arquivos para publicação de uma aplicação ASP.NET Core 3.1 (diretório /app):
- Em ${{ secrets.CAMINHO_PROJETO }} deverá ser informado diretório no repositório do GitHub que contém o projeto;
- Através da Action actions/setup-dotnet@v1 indicamos a versão do .NET Core (atributo dotnet-version) utilizada para build da aplicação.
Exemplo com Azure App Service + .NET Core 3.1
O workflow a seguir complementa o exemplo da seção anterior, com o uso adicional das seguintes Actions:
O workflow a seguir complementa o exemplo da seção anterior, com o uso adicional das seguintes Actions:
- O login no Azure acontecerá por meio da Action azure/login (com as credenciais indicadas em ${{ secrets.AZURE_CREDENTIALS }});
- O deployment no Azure App Service ocorrerá logo em seguida, por meio da Action Azure/webapps-deploy (que receberá o nome do recurso associado a ${{ secrets.WEB_APP }}).
Para obter as credenciais de acesso ao uso Azure execute a instrução a seguir com o Azure CLI (vinculando a string JSON gerada ao secret ${{ secrets.AZURE_CREDENTIALS }}):
az ad sp create-for-rbac --name "GroffeAzFuncGitHubActions" --role contributor --scopes /subscriptions/<SUBSCRIPTION>/resourceGroups/<GRUPO DE RECURSOS>/providers/Microsoft.Web/sites/<WEB APP> --sdk-auth
Em que deverão ser informadas a subscription do Azure (<SUBSCRIPTION>), o grupo de recursos (<GRUPO DE RECURSOS>) e o nome do recurso do Azure App Service (<WEB APP>).
A seguir temos um exemplo de execução com sucesso deste workflow:
Exemplo com Azure Functions 3.x + .NET Core
A seguir temos um exemplo de workflow baseado na versão 3.x das Azure Functions e .NET Core 3.1:
- Em ${{ secrets.CAMINHO_PROJETO }} será informado o caminho (no repositório que contém o workflow) do projeto para build e deployment;
- Já as configurações para ${{ secrets.AZURE_CREDENTIALS }} foram obtidas via Azure CLI;
- Será através da Action Azure/functions-action que acontecerá o deployment da Function App indicada por ${{ secrets.FUNCTION_APP }}.
Instrução executada via Azure CLI para obtenção do valor que será associado ao secret ${{ secrets.AZURE_CREDENTIALS }}:
az ad sp create-for-rbac --name "GroffeAzFuncGitHubActions" --role contributor --scopes /subscriptions/<SUBSCRIPTION>/resourceGroups/<GRUPO DE RECURSOS>/providers/Microsoft.Web/sites/<FUNCTION APP> --sdk-auth
Em que deverão ser informadas a subscription do Azure (<SUBSCRIPTION>), o grupo de recursos (<GRUPO DE RECURSOS>) e o nome da Function App (<FUNCTION APP>).
Na próxima imagem podemos observar uma execução com sucesso deste workflow: