Procedimiento para usar las Acciones de GitHub con el fin de realizar implementaciones en Azure

Completado

En esta unidad se describe cómo usar Acciones de GitHub para implementar una aplicación web basada en contenedores en el servicio Web Apps de Microsoft Azure. En ella se describen algunas opciones para desencadenar un flujo de trabajo. A continuación, aprenderá a trabajar con condicionales en el flujo de trabajo. Por último, obtendrá información sobre cómo crear y eliminar recursos de Azure mediante Acciones de GitHub.

Opciones para desencadenar un flujo de trabajo de CD

Hay varias opciones para iniciar un flujo de trabajo de CD. En el módulo anterior sobre CI con Acciones de GitHub, se ha obtenido información sobre cómo desencadenar un flujo de trabajo desde un envío de cambios en el repositorio de GitHub. Sin embargo, para CD, es posible que quiera desencadenar un flujo de trabajo de implementación en algún otro evento.

Una opción consiste en desencadenar el flujo de trabajo con ChatOps. ChatOps usa clientes de chat, bots y herramientas de comunicación en tiempo real para ejecutar tareas. Por ejemplo, puede dejar un comentario específico en una solicitud de incorporación de cambios que puede iniciar un bot. Ese bot podría dejar un comentario con algunas estadísticas o ejecutar un flujo de trabajo.

Otra opción, que es la que empleamos en nuestro ejemplo, es usar etiquetas en la solicitud de incorporación de cambios. Etiquetas distintas pueden iniciar flujos de trabajo distintos. Por ejemplo, agregue una etiqueta de fase para iniciar un flujo de trabajo de implementación en el entorno de ensayo. O bien agregue una etiqueta de entorno de puesta en marcha para ejecutar el flujo de trabajo que crea los recursos de Microsoft Azure en los que se va a implementar. Para usar etiquetas, el flujo de trabajo tiene el aspecto siguiente:

on:
  pull_request:
    types: [labeled]

Control de la ejecución con un condicional del trabajo

A menudo, solo se quiere ejecutar un flujo de trabajo si se cumple alguna condición.

Los flujos de trabajo de GitHub proporcionan el condicional if para este escenario. El condicional utiliza una expresión que se evalúa en tiempo de ejecución. Por ejemplo, quiere ejecutar este flujo de trabajo si se agrega una etiqueta Fase a la solicitud de incorporación de cambios.

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

Almacenamiento de credenciales con Secretos de GitHub

Nunca quiere exponer información confidencial en el archivo de flujo de trabajo. Secretos de GitHub es un lugar seguro para almacenar información confidencial que necesita el flujo de trabajo. Por ejemplo:

Para realizar la implementación en un recurso de Azure, la acción de GitHub debe tener permiso de acceso al recurso. No quiere almacenar las credenciales de Azure en el archivo de flujo de trabajo de modo que otras personas puedan verlas. En su lugar, va a almacenar las credenciales en Secretos de GitHub.

Para almacenar información en Secretos de GitHub, cree un secreto en el portal.

Interfaz de Azure Portal para crear un secreto.

Después, use el nombre del secreto que se ha creado en el flujo de trabajo dondequiera que necesite esa información. Por ejemplo, use las credenciales de Azure que se han almacenado en Secretos de GitHub en el atributo creds: de una acción login de Azure.

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

Implementación en Microsoft Azure con Acciones de GitHub

El marketplace de GitHub tiene varias acciones que ayudan a automatizar las tareas relacionadas con Azure.

Muestra los resultados de la búsqueda de Azure por parte del marketplace de GitHub.

También puede buscar y examinar las Acciones de GitHub directamente en el editor de flujo de trabajo de un repositorio. En la barra lateral, puede buscar una Acción específica, ver Acciones destacadas y examinar categorías destacadas.

Para buscar una Acción:

  1. En el repositorio, busque el archivo de flujo de trabajo que desea editar.
  2. Seleccione el icono Editar situado en la esquina superior derecha de la vista de archivos.
  3. Use la barra lateral del Marketplace de GitHub a la derecha del editor para examinar las Acciones.

Supongamos que quiere implementar una aplicación web basada en contenedores en Azure Web Apps. Si hace una búsqueda en el marketplace de GitHub, encontrará estas acciones:

Si agrega estas acciones al trabajo Deploy-to-Azure, el flujo de trabajo tendrá el siguiente aspecto:

  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

Tenga en cuenta que este trabajo depende de un trabajo anterior, Build-Docker-Image. El trabajo anterior crea el artefacto que se implementa.

La acción azure/login@v1 necesita credenciales para iniciar sesión en su cuenta de Azure a fin de que pueda acceder a los recursos de Azure en los que quiere realizar la implementación. Aquí, use las credenciales almacenadas en Secretos de GitHub.

Lo mismo sucede con la acción azure/docker-login@v1. Puesto que se va a implementar una imagen de contenedor, debe iniciar sesión en su registro de contenedor privado.

La acción azure/webapps-deploy@v1 realiza la implementación. Depende de las dos acciones anteriores.

Creación y eliminación de recursos de Azure mediante Acciones de GitHub

Dado que la CD es un proceso automatizado, ya ha decidido usar la infraestructura como código para crear y desmontar los entornos en los que realice las implementaciones. Acciones de GitHub puede automatizar estas tareas en Azure e incluir estas acciones en el flujo de trabajo.

Nota

Recuerde que es importante anular los recursos que ya no se estén usando lo antes posible para evitar cargos innecesarios.

Una opción consiste en crear un nuevo flujo de trabajo con dos trabajos: uno que ponga en marcha los recursos y otro que los elimine. Después, use un condicional para ejecutar solo el trabajo que quiera. En este ejemplo, el condicional busca una etiqueta en la solicitud de incorporación de cambios y ejecuta el trabajo set-up-azure-resources si la etiqueta es Entorno de arranque, y el trabajo destroy-azure-resources si la etiqueta es Destruir entorno.

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

    ...

Los trabajos usan la CLI de Azure para crear y destruir los recursos de Azure. Para obtener más información sobre la CLI de Azure, consulte Introducción a la CLI de Azure.

Este es un ejemplo de los pasos realizados en el trabajo 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}}

Tenga en cuenta que usa Acciones de GitHub para consultar el repositorio e iniciar sesión en Azure. Después, debe crear los recursos que necesita e implementar el contenedor mediante la CLI de Azure.