GitHub Actions: exemplos de workflows para build e deployment em várias tecnologias

Renato Groffe
Azure na Pratica
Published in
6 min readJun 1, 2020

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):

https://bit.ly/anp-github-blog-groffe-25

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:

--

--

Renato Groffe
Azure na Pratica

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker