Implementación de un contenedor personalizado en App Service con Acciones de GitHub

Acciones de GitHub le ofrece la flexibilidad de compilar un flujo de trabajo de desarrollo de software automatizado. Gracias a la acción de Azure Web Deploy, puede automatizar el flujo de trabajo para implementar contenedores personalizados en App Service con Acciones de GitHub.

Un archivo YAML (.yml) define un flujo de trabajo en la ruta de acceso /.github/workflows/ de su repositorio. En esta definición se incluyen los diversos pasos y parámetros que se incluyen en el flujo de trabajo.

Para un flujo de trabajo de contenedor de Azure App Service, el archivo tiene tres secciones:

Sección Tareas
Autenticación 1. Recupere una entidad de servicio o un perfil de publicación.
2. Cree un secreto de GitHub.
Compilar 1. Cree el entorno.
2. Compile la imagen de contenedor.
Implementación 1. Implemente la imagen de contenedor.

Requisitos previos

Genere las credenciales de implementación.

La manera recomendada de autenticarse con Azure App Services para las Acciones de GitHub es con un perfil de publicación. También puede autenticarse con Open ID Connect o una entidad de servicio, pero el proceso requiere más pasos.

Guarde la credencial de perfil de publicación o la entidad de servicio como secreto de GitHub para autenticarse con Azure. Tendrá acceso al secreto en el flujo de trabajo.

Un perfil de publicación es una credencial de nivel de aplicación. Configure el perfil de publicación como secreto de GitHub.

  1. En Azure Portal, vaya a la aplicación de App Service.

  2. En la página de Información general, seleccione Obtener perfil de publicación.

    Nota

    A partir de octubre de 2020, las aplicaciones web de Linux deberán tener la opción de configuración de la aplicación WEBSITE_WEBDEPLOY_USE_SCM establecida en trueantes de descargar el archivo. Este paso dejará de ser un requisito en el futuro. Consulte Configurar una aplicación de App Service en Azure Portal para aprender a configurar las opciones de aplicaciones web comunes.

  3. Guarde el archivo descargado. Usará el contenido del archivo para crear un secreto de GitHub.

Configuración del secreto de GitHub para la autenticación

En GitHub, examine el repositorio. Seleccione Configuración > Seguridad > Secretos y variables > Acciones > Nuevo secreto del repositorio.

Para usar las credenciales de nivel de aplicación, pegue el contenido del archivo del perfil de publicación descargado en el campo de valor del secreto. Asigne al secreto el siguiente nombre: AZURE_WEBAPP_PUBLISH_PROFILE.

Al configurar el flujo de trabajo de GitHub, use AZURE_WEBAPP_PUBLISH_PROFILE en la acción de implementación de aplicación web de Azure. Por ejemplo:

- uses: azure/webapps-deploy@v2
  with:
    publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}

Configuración de secretos de GitHub para el registro

Defina los secretos que se usarán con la acción de inicio de sesión de Docker. En el ejemplo de este documento se utiliza Azure Container Registry para el registro del contenedor.

  1. Vaya al contenedor en Azure Portal o Docker y copie el nombre de usuario y la contraseña. Puede encontrar el nombre de usuario y la contraseña de Azure Container Registry en Azure Portal en Configuración>Claves de acceso para el registro.

  2. Defina un nuevo secreto para el nombre de usuario del registro llamado REGISTRY_USERNAME.

  3. Defina un nuevo secreto para la contraseña del registro llamada REGISTRY_PASSWORD.

Compilación de la imagen de contenedor

En el ejemplo siguiente se muestra parte del flujo de trabajo que compila una imagen de Docker de Node.js. Use el inicio de sesión de Docker en un registro de contenedor privado. En este ejemplo se usa Azure Container Registry, pero la misma acción funciona para otros registros.

name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

También puede usar el inicio de sesión de Docker para iniciar sesión en varios registros de contenedor al mismo tiempo. Este ejemplo incluye dos nuevos secretos de GitHub para la autenticación con docker.io. En el ejemplo se da por supuesto que hay un Dockerfile en el nivel raíz del registro.

name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - uses: azure/docker-login@v1
      with:
        login-server: index.docker.io
        username: ${{ secrets.DOCKERIO_USERNAME }}
        password: ${{ secrets.DOCKERIO_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

Implementación en un contenedor de App Service

Para implementar la imagen en un contenedor personalizado en App Service, use la acción azure/webapps-deploy@v2. Esta acción tiene siete parámetros:

Parámetro Explicación
app-name (Obligatorio) Especifique el nombre de la aplicación de App Service.
publish-profile (Opcional) Se aplica a Web Apps (Windows y Linux) y a los contenedores de aplicaciones web (Linux). No se admite el escenario de varios contenedores. Publique el contenido del archivo de perfil (*.publishsettings) con secretos de Web Deploy.
slot-name (Opcional) Especifique un espacio existente que no sea el de producción.
package (Opcional) Solo se aplica a la aplicación web: ruta de acceso al paquete o la carpeta. *.zip, *.war, *.jar o una carpeta para implementar
images (Necesario) Solo se aplica a contenedores de aplicaciones web: especifique el nombre completo de las imágenes de contenedor. Por ejemplo, 'myregistry.azurecr.io/nginx:latest' o 'python:3.7.2-alpine/'. En el caso de una aplicación de varios contenedores, se pueden especificar varios nombres de imagen de contenedor (separados por varias líneas).
configuration-file (Opcional) Solo se aplica a contenedores de aplicaciones web: ruta de acceso del archivo Docker Compose. Debe ser una ruta de acceso completa o relativa al directorio de trabajo predeterminado. Se requiere para las aplicaciones de varios contenedores.
startup-command (Opcional) Escriba el comando de inicio. Por ejemplo, dotnet run o dotnet filename.dll
name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}

    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

    - uses: azure/webapps-deploy@v2
      with:
        app-name: 'myapp'
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        images: 'mycontainer.azurecr.io/myapp:${{ github.sha }}'

Pasos siguientes

Puede encontrar nuestro conjunto de acciones agrupadas en distintos repositorios de GitHub, cada uno con documentación y ejemplos que le ayudarán a usar GitHub con CI/CD y a implementar sus aplicaciones en Azure.