Como posso utilizar o GitHub Actions para implementar no Azure?

Concluído

Esta unidade discute como usar ações do GitHub para implantar um aplicativo Web baseado em contêiner em Aplicativos Web do Microsoft Azure. Ele abrange algumas opções para acionar um fluxo de trabalho. Em seguida, saiba como trabalhar com condicionais no fluxo de trabalho. Por fim, saiba como criar e excluir recursos do Azure usando as Ações do GitHub.

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

Existem várias opções para iniciar um fluxo de trabalho CD. No módulo anterior sobre a CI com o GitHub Actions, ficou a saber como acionar um fluxo de trabalho a partir de uma emissão no repositório do GitHub. No entanto, para CD, talvez você queira acionar um fluxo de trabalho de implantação em algum outro evento.

Uma opção é acionar o fluxo de trabalho com o ChatOps. O ChatOps usa clientes de chat, chatbots e ferramentas de comunicação em tempo real para executar tarefas. Por exemplo, pode deixar um comentário específico num pedido Pull para iniciar um bot. Esse bot pode comentar de volta com algumas estatísticas ou executar um fluxo de trabalho.

Outra opção, e a que vamos utilizar no nosso exemplo, é utilizar etiquetas no pedido Pull. Diferentes etiquetas podem iniciar diferentes fluxos de trabalho. Por exemplo, adicione um rótulo de estágio para iniciar um fluxo de trabalho de implantação ao seu ambiente de preparação. Ou adicione um rótulo de ambiente spin up para executar o fluxo de trabalho que cria os recursos do Microsoft Azure para você implantar. Para usar rótulos, seu fluxo de trabalho tem esta aparência:

on:
  pull_request:
    types: [labeled]

Controlar a execução com uma condicional de tarefa

Muitas vezes, apenas poderá querer executar um fluxo de trabalho se alguma condição for verdadeira.

Os fluxos de trabalho do GitHub fornecem a if condicional para esse cenário. O condicional usa uma expressão que é avaliada em tempo de execução. Por exemplo, você deseja executar esse fluxo de trabalho se um rótulo de estágio for adicionado à solicitação pull.

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

Armazenar credenciais com Segredos do GitHub

Você nunca deseja expor informações confidenciais no arquivo de fluxo de trabalho. O GitHub Secrets é um lugar seguro para armazenar informações confidenciais de que seu fluxo de trabalho precisa. Eis um exemplo.

Para implementar num recurso do Azure, o GitHub Actions tem de ter permissão para aceder ao recurso. Não quer armazenar as credenciais do Azure à vista de todos no ficheiro de fluxo de trabalho. Em vez disso, você pode armazenar suas credenciais no GitHub Secrets.

Para armazenar informações no GitHub Secrets, crie um segredo no portal.

Interface do portal do Azure para criar um segredo.

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

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

Implementar no Microsoft Azure com o GitHub Actions

O GitHub Marketplace tem várias ações que o ajudam a automatizar as tarefas relacionadas do Azure.

O GitHub Marketplace a mostrar os resultados de pesquisa do Azure.

Também pode procurar e navegar no GitHub Actions diretamente num editor de fluxo de trabalho do repositório. Na barra lateral, pode procurar uma Ação específica, ver Ações em destaque e navegar por categorias em destaque.

Para localizar uma Ação:

  1. No repositório, navegue até ao ficheiro de fluxo de trabalho que quer editar.
  2. Selecione o ícone Editar no canto superior direito da visualização do arquivo.
  3. Utilize a barra lateral do GitHub Marketplace à direita do editor para procurar Ações.

Suponha que quer implementar uma aplicação Web baseada em contentores em Aplicações Web do Azure. Se você pesquisar no GitHub Marketplace, encontrará estas ações:

Se adicionar estas ações à tarefa Deploy-to-Azure, o fluxo de trabalho terá o seguinte aspeto:

  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

Repare que esta tarefa depende de uma tarefa anterior, Build-Docker-Image. A tarefa anterior cria o artefacto que é implementado.

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

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

A ação azure/webapps-deploy@v1 executa a implantação. Depende das duas ações anteriores.

Criar e eliminar recursos do Azure com o GitHub Actions

Como o CD é um processo automatizado, você já decidiu usar a infraestrutura como código para criar e desativar os ambientes nos quais implanta. As Ações do GitHub podem automatizar essas tarefas no Azure, e você pode incluir essas ações em seu fluxo de trabalho.

Nota

Lembre-se de que é importante eliminar os recursos que você não está mais usando o mais rápido possível para evitar cobranças desnecessárias.

Uma opção é criar um novo fluxo de trabalho com duas tarefas, uma que acelere os recursos e outra que os elimine. Em seguida, utilize uma condicional para executar apenas a tarefa que quer. Neste exemplo, a condicional procurará uma etiqueta no pedido Pull e executará a tarefa set-up-azure-resources se a etiqueta for acelerar ambiente e a tarefa destroy-azure-resources se a etiqueta 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')

    ...

As tarefas utilizam 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 a seguir um exemplo dos passos na tarefa 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}}

Note que utiliza ações do GitHub para verificar o repositório e iniciar sessão no Azure. Depois disso, vai criar os recursos de que necessita e implementar o contentor com a CLI do Azure.