Compartir a través de


Implementación de un contenedor personalizado en App Service mediante Azure Pipelines

Azure DevOps le permite hospedar, compilar, planear y probar el código con flujos de trabajo gratuitos. Si utiliza Azure Pipelines como uno de estos flujos de trabajo, podrá implementar una aplicación con CI/CD que funcione con cualquier plataforma y en cualquier nube. Una canalización se define como un archivo YAML que se encuentra en el directorio raíz del repositorio.

En este artículo, usamos Azure Pipelines para implementar una aplicación contenedora de Windows en App Service desde un repositorio de Git en Azure DevOps. Se supone que ya tiene una aplicación .NET con un dockerfile compatible en Azure DevOps.

Requisitos previos

Agregar una conexión de servicio

Antes de crear la canalización, primero debe crear la conexión de servicio, ya que se le pedirá que elija y compruebe la conexión al crear la plantilla. Una conexión de servicio le permite conectarse al registro que prefiera (ACR o Docker Hub) al usar las plantillas de tareas. Al agregar una nueva conexión de servicio, elija la opción Registro de Docker. El siguiente formulario le pide que elija Docker Hub o Azure Container Registry junto con la información relacionada. Para seguir este tutorial, use Azure Container Registry. Puede crear una nueva conexión de servicio siguiendo las instrucciones aquí.

Protección de los secretos

Dado que estamos usando información confidencial a la que no quiere que otros usuarios accedan, usamos variables para proteger nuestra información. Cree una variable siguiendo las instrucciones que se indican aquí.

Para agregar una variable, haga clic en el botón Variables situado junto al botón Guardar de la parte superior derecha de la vista de edición de la canalización. Seleccione el botón Nueva variable y escriba la información. Agregue las variables siguientes con sus propios secretos adecuados de cada recurso.

  • vmImageName: 'windows-latest'
  • imageRepository: "your-image-repo-name"
  • dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
  • dockerRegistryServiceConnection: 'your-service-connection-number'

Creación de una canalización

Una vez creado el repositorio con la aplicación .NET y admitiendo dockerfile, puede crear la canalización siguiendo estos pasos.

  1. Vaya a Canalizaciones en la barra de menú de la izquierda y haga clic en el botón Crear canalización
  2. En la siguiente pantalla, seleccione Git de Azure Repos como opción de repositorio y seleccione el repositorio donde está el código
  3. En la pestaña Configurar, elija la opción Canalización de inicio
  4. En la siguiente pestaña Revisar, haga clic en el botón Guardar

Creación y envío de la imagen a Azure Container Registry

Una vez creada y guardada la canalización, deberá editar la canalización para ejecutar los pasos para compilar el contenedor, insertar en un registro e implementar la imagen en App Service. Para empezar, vaya al menú Canalizaciones, elija la canalización que creó y haga clic en el botón Editar.

En primer lugar, debe agregar la tarea docker para poder compilar la imagen. Agregue el código siguiente y reemplace el Dockerfile: app/Dockerfile por la ruta de acceso al Dockerfile.

trigger:
 - main

 pool:
   vmImage: 'windows-latest' 

 variables:
   vmImageName: 'windows-latest'
   imageRepository: 'your-image-repo-name'
   dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
   dockerRegistryServiceConnection: 'your-service-connection-number'

- stage: Build
  displayName: Build and push stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

Adición de la tarea de implementación de App Service

A continuación, debe configurar la tarea de implementación. Esto requiere el nombre de la suscripción, el nombre de la aplicación y el registro de contenedor. Agregue una nueva fase al archivo yaml pegando el código siguiente.

- stage: Deploy
  displayName: Deploy to App Service
  jobs:
  - job: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    steps:

A continuación, vaya a la pestaña Mostrar asistente en la esquina superior derecha y busque la tarea de implementación de Azure App Service y rellene el siguiente formulario:

  • Tipo de conexión: Azure Resource Manager
  • Suscripción de Azure: nombre-suscripción
  • Tipo de App Service: Web App for Containers (Windows)
  • Nombre de App Service: your-app-name
  • Registro o espacio de nombres: your-azure-container-registry-namespace
  • Imagen: your-azure-container-registry-image-name

Una vez que haya rellenado, haga clic en el botón Agregar para agregar la tarea siguiente:

- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: 'my-subscription-name'
    appType: 'webAppHyperVContainer'
    WebAppName: 'my-app-name'
    DockerNamespace: 'myregsitry.azurecr.io'
    DockerRepository: 'dotnetframework:12'

Después de agregar la tarea, la canalización está lista para ejecutarse. Haga clic en el botón Validar y guardar y ejecute la canalización. La canalización pasa por los pasos necesarios para compilar e insertar la imagen de contenedor de Windows en Azure Container Registry e implementar la imagen en App Service.

A continuación se muestra el ejemplo del archivo yaml completo:

trigger:
 - main

 pool:
   vmImage: 'windows-latest' 

 variables:
   vmImageName: 'windows-latest'
   imageRepository: 'your-image-repo-name'
   dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
   dockerRegistryServiceConnection: 'your-service-connection-number'

- stage: Build
  displayName: Build and push stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

- stage: Deploy
  displayName: Deploy to App Service
  jobs:
  - job: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: AzureRmWebAppDeployment@4
		  inputs:
		    ConnectionType: 'AzureRM'
		    azureSubscription: 'my-subscription-name'
		    appType: 'webAppHyperVContainer'
		    WebAppName: 'my-app-name'
		    DockerNamespace: 'myregsitry.azurecr.io'
		    DockerRepository: 'dotnetframework:12'