Como usar o GitHub Actions para implantar no Azure?

Concluído

Esta unidade discute como usar as ações do GitHub para implantar um aplicativo da Web baseado em contêineres no Aplicativos Web do Microsoft Azure. Ele aborda algumas opções para o disparo de um fluxo de trabalho. Em seguida, saiba como trabalhar com condicionais no fluxo de trabalho. Por fim, saiba mais sobre como criar e excluir recursos do Azure usando o GitHub Actions.

Opções de gatilho para um fluxo de trabalho de CD

Há várias opções para iniciar um fluxo de trabalho de CD. No módulo anterior sobre a CI no GitHub Actions, você aprendeu a disparar um fluxo de trabalho em um push para o repositório GitHub. Entretanto, para a CD, talvez você deseje disparar um fluxo de trabalho de implantação em algum outro evento.

Uma opção é disparar o fluxo de trabalho com o ChatOps. O ChatOps usa clientes de chats, chatbots e ferramentas de comunicação em tempo real para executar tarefas. Por exemplo, você pode deixar um comentário específico em uma solicitação de pull que possa iniciar um bot. Esse bot pode comentar uma resposta com algumas estatísticas ou executar um fluxo de trabalho.

Outra opção, que usamos em nosso exemplo, é usar rótulos na solicitação de pull. Rótulos diferentes podem iniciar fluxos de trabalho diferentes. Por exemplo, adicione um rótulo Estágio para iniciar um fluxo de trabalho de implantação para seu ambiente de preparo. Ou adicione um rótulo inicializar ambiente para executar o fluxo de trabalho que cria os recursos do Microsoft Azure para sua implantação. Para usar rótulos, seu fluxo de trabalho será o seguinte:

on:
  pull_request:
    types: [labeled]

Controlar a execução com uma condicional de trabalho

Geralmente, você só desejará executar um fluxo de trabalho se alguma condição for verdadeira.

Os fluxos de trabalho do GitHub fornecem a condicional if para esse cenário. A condicional usa uma expressão que é avaliada em runtime. Por exemplo, você deseja executar esse fluxo de trabalho se um rótulo Estágio for adicionado ao pull request.

if: contains(github.event.pull_request.labels.*.name, 'stage')

Armazenar credenciais com o GitHub Secrets

Você nunca quer expor informações confidenciais no arquivo de fluxo de trabalho. O GitHub Secrets é um local seguro para armazenar as informações confidenciais de que seu fluxo de trabalho precisa. Veja um exemplo.

Para implantar em um recurso do Azure, a ação do GitHub Actions deve ter permissão para acessá-lo. Você não deseja armazenar as credenciais do Azure em plena vista no arquivo de fluxo de trabalho. Em vez disso, você pode armazenar as credenciais no GitHub Secrets.

Para armazenar informações nos Segredos do GitHub, crie um segredo no portal.

Interface do portal do Azure para criar um segredo.

Em seguida, use o nome do segredo criado em seu fluxo de trabalho sempre que precisar dessas informações. Por exemplo, use a credencial do Azure que foi armazenada no GitHub Actions no atributo creds: de uma ação do Azure login.

steps:
      - name: "Login via Azure CLI"
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

Implantar no Microsoft Azure usando o GitHub Actions

O GitHub Marketplace conta com várias ações que ajudam a automatizar tarefas relacionadas ao Azure.

GitHub Marketplace mostrando resultados da pesquisa pelo Azure.

Você também pode pesquisar e procurar o GitHub Actions diretamente no editor de fluxo de trabalho de um repositório. Na barra lateral, você pode pesquisar uma Ação específica, exibir Ações em destaque e procurar categorias em destaque.

Para encontrar uma Ação:

  1. Em seu repositório, navegue até o arquivo de fluxo de trabalho que você deseja editar.
  2. Selecione o ícone Editar no canto superior direito da exibição do arquivo.
  3. Use a barra lateral do GitHub Marketplace à direita do editor para procurar Ações.

Imagine que você quer implantar um aplicativo Web baseado em contêiner nos Aplicativos Web do Azure. Se pesquisar no GitHub Marketplace, você encontrará essas ações:

Se você adicionar essas ações ao trabalho Deploy-to-Azure, o fluxo de trabalho terá esta aparência:

  Deploy-to-Azure:
    runs-on: ubuntu-latest
    needs: Build-Docker-Image
    name: Deploy app container to Azure
    steps:
      - name: "Login via Azure CLI"
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - uses: azure/docker-login@v1
        with:
          login-server: ${{env.IMAGE_REGISTRY_URL}}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Deploy web app container
        uses: azure/webapps-deploy@v1
        with:
          app-name: ${{env.AZURE_WEBAPP_NAME}}
          images: ${{env.IMAGE_REGISTRY_URL}}/${{ github.repository }}/${{env.DOCKER_IMAGE_NAME}}:${{ github.sha }}

      - name: Azure logout
        run: |
          az logout

Observe que o trabalho depende de um trabalho anterior, o Build-Docker-Image. O trabalho anterior cria o artefato que é implantado.

A ação azure/login@v1 precisa de credenciais para entrar em sua conta do Azure e acessar os recursos do Azure em que você deseja implantar. Aqui, use as credenciais que armazenamos nos Segredos do GitHub.

O mesmo é verdadeiro para a ação azure/docker-login@v1. Como você está implantando uma imagem de contêiner, precisa entrar no seu registro de contêiner privado.

A ação azure/webapps-deploy@v1 executa a implantação. Isso depende das duas ações precedentes.

Criar e excluir recursos do Azure usando o GitHub Actions

Como a CD é um processo automatizado, você já decidiu por utilizar a infraestrutura como código para criar e desativar os ambientes nos quais implanta. O GitHub Actions pode automatizar essas tarefas no Azure e você pode incluí-las no fluxo de trabalho.

Observação

Lembre-se de que, para evitar cobranças desnecessárias, é importante desinstalar assim que possível os recursos que você não usa mais.

Uma opção é criar um fluxo de trabalho com dois trabalhos, um que cria recursos e outro que os exclui. Em seguida, use uma condicional para executar somente o trabalho desejado. Neste exemplo, a condicional procurará um rótulo na solicitação de pull e executará o trabalho set-up-azure-resources se o rótulo for criar ambiente e o trabalho destroy-azure-resources se o rótulo for destruir ambiente.

jobs:
  set-up-azure-resources:
    runs-on: ubuntu-latest

    if: contains(github.event.pull_request.labels.*.name, 'spin up environment')

    ...

  destroy-azure-resources:
    runs-on: ubuntu-latest

    if: contains(github.event.pull_request.labels.*.name, 'destroy environment')

    ...

Os trabalhos usam a CLI do Azure para criar e destruir os recursos do Azure. Para obter mais informações sobre a CLI do Azure, consulte Visão geral da CLI do Azure.

Veja um exemplo das etapas no trabalho set-up-azure-resources:

steps:
  - name: Checkout repository
    uses: actions/checkout@v2

  - name: Azure login
    uses: azure/login@v1
    with:
      creds: ${{ secrets.AZURE_CREDENTIALS }}

  - name: Create Azure resource group
    if: success()
    run: |
      az group create --location ${{env.AZURE_LOCATION}} --name ${{env.AZURE_RESOURCE_GROUP}} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Create Azure app service plan
    if: success()
    run: |
      az appservice plan create --resource-group ${{env.AZURE_RESOURCE_GROUP}} --name ${{env.AZURE_APP_PLAN}} --is-linux --sku F1 --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Create webapp resource
    if: success()
    run: |
      az webapp create --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --plan ${{ env.AZURE_APP_PLAN }} --name ${{ env.AZURE_WEBAPP_NAME }}  --deployment-container-image-name nginx --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Configure webapp to use GitHub Packages
    if: success()
    run: |
      az webapp config container set --docker-custom-image-name nginx --docker-registry-server-password ${{secrets.GITHUB_TOKEN}} --docker-registry-server-url https://docker.pkg.github.com --docker-registry-server-user ${{github.actor}} --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}

Observe que as ações do GitHub Actions são usadas para fazer check-out do repositório e entrar no Azure. Depois disso, crie os recursos necessários e implante o contêiner usando a CLI do Azure.