Compartir a través de


Implementación en máquinas virtuales Linux en un entorno

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020

Puede agregar máquinas virtuales como recursos en entornos de Azure Pipelines y seleccionarlas para implementaciones. Para un flujo de trabajo de integración continua y despliegue continuo (CI/CD), el historial de despliegue del entorno proporciona trazabilidad de cada máquina virtual hasta el commit de activación.

En este artículo se muestra cómo configurar una canalización de Azure DevOps para implementaciones en varios recursos de máquina virtual Linux en un entorno. Estas instrucciones compilan e implementan una aplicación de JavaScript o Java, pero puede adaptarlas para cualquier aplicación que publique un paquete de implementación web.

Para obtener más información sobre entornos y recursos destinados a un trabajo de implementación, consulte la definición de esquema YAML jobs.deployment.environment . Para obtener más información sobre los trabajos de implementación, consulte la definición jobs.deployment .

Requisitos previos

Además, para aplicaciones de JavaScript o Node.js:

Importante

  • Para implementar aplicaciones, los recursos de máquina virtual del entorno de destino deben tener instalados y configurados todo el software necesario, las dependencias, permisos e inicios de sesión.
  • Para usar el código fuente de GitHub, necesita una conexión de servicio de GitHub. GitHub también puede pedir que inicie sesión, instale la aplicación GitHub de Azure Pipelines o autorice Azure Pipelines. Para completar cada proceso, siga las instrucciones en pantalla. Para más información, consulte Acceso a repositorios de GitHub.

Creación de un entorno y adición de máquinas virtuales Linux

En el proyecto de Azure Pipelines, cree un entorno y agregue las máquinas virtuales Linux como recursos de entorno siguiendo las instrucciones de Creación de un entorno y adición de una máquina virtual.

Ejecute el script de registro del agente copiado en cada máquina virtual para registrarlo en el entorno. También puede asignar etiquetas a las máquinas virtuales individuales respondiendo a las indicaciones interactivas.

Crear y ejecutar la canalización de compilación

Cree una canalización de CI que compile e implemente la aplicación siempre que haya una confirmación en la main rama del repositorio de código.

Creación de la canalización de YAML

  1. En el proyecto de Azure DevOps, seleccione Canalizaciones>Nueva canalización o Crear canalización y, a continuación, seleccione GitHub como ubicación del código fuente.
  2. En la pantalla Seleccionar un repositorio , seleccione el repositorio de ejemplo bifurcada.
  3. En la pantalla Configurar su canalización, seleccione Canalización inicial.
  4. En la pantalla Revise su canalización YAML, reemplace el código de inicio generado con el siguiente código, en función de su tiempo de ejecución.

Añadir el trabajo de compilación

El Build trabajo ejecuta tareas para compilar y probar el proyecto y carga la salida de compilación en una drop ubicación. Este trabajo se ejecuta en los agentes de compilación especificados en la canalización pool, no en las máquinas virtuales del entorno Linux.

La pipeline siguiente compila y prueba tu proyecto de Node.js con npm y, a continuación, empaqueta el resultado y lo carga en una ubicación de almacenamiento.

trigger:
- main

pool:
  vmImage: ubuntu-latest

jobs:  
- job: Build
  displayName: Build
  steps:
  - task: UseNode@1
    inputs:
      version: '16.x'
    displayName: 'Install Node.js'
  - script: |
      npm install
      npm run build --if-present
      npm run test --if-present
    displayName: 'npm install, build and test'
  - task: ArchiveFiles@2
    displayName: 'Archive files'
    inputs:
      rootFolderOrFile: '$(System.DefaultWorkingDirectory)'
      includeRootFolder: false
      archiveType: tar
      tarCompression: gz
      archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).gz
      replaceExistingArchive: true
  - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).gz
    artifact: drop

Para obtener más información, revise los pasos para crear una construcción en Construya su aplicación Node.js con gulp.

Ejecución de la canalización

Para guardar el archivo azure-pipelines.yml en el repositorio e iniciar la canalización de CI/CD, seleccione Guardar y ejecutar y, a continuación, seleccione Guardar y ejecutar de nuevo.

Cuando finalice la canalización, vea la página Resumen del trabajo para comprobar que el trabajo de compilación se ejecutó correctamente y que 1 artefacto publicado aparece en Relacionado.

Adición y ejecución del trabajo de implementación

Un trabajo de implementación ejecuta los preDeployganchos de ciclo de vidadeploy, routeTraffic, y postRouteTraffic una vez, y a continuación, ejecuta on: success o on: failure. Si implementa en máquinas virtuales de entorno, la preDeploy fase se ejecuta en el agente de compilación, no en las máquinas virtuales del entorno. Todos los demás pasos se ejecutan en máquinas virtuales registradas en el entorno.

  1. El paso opcional preDeploy se ejecuta antes de la implementación. Puede usar este paso para la orquestación, la preparación de la máquina virtual (VM), los artefactos y las comprobaciones de estado.
  2. El deploy paso implementa el objeto de implementación en las máquinas virtuales del entorno de destino.
  3. El paso opcional routeTraffic puede involucrar la redirección de tráfico.
  4. El paso opcional postRouteTraffic puede realizar comprobaciones de estado y notificaciones.
  5. Los pasos on.failure y on.success personalizados pueden proporcionar notificaciones o recuperación.

Un trabajo de implementación en un entorno con resourceType: VirtualMachine requiere que las máquinas virtuales del entorno puedan ejecutar todas las tareas de canalización, como Bash o la CLI de Azure. Puede usar el preDeploy paso para instalar el software y los permisos necesarios en las máquinas virtuales de destino.

Por ejemplo, si un paso de implementación usa la CLI de Azure, las máquinas virtuales del agente deben tener Azure CLI instalada y disponible en la ruta para el usuario del agente. El usuario del agente debe tener permiso para ejecutar la CLI y debe autenticarse en Azure. Es posible que tenga que agregar el usuario del agente al archivo sudoers, o configurar variables de entorno para automatizar la instalación.

Puede usar un preDeploy script para instalar la CLI de Azure en las máquinas virtuales de destino. Para autenticarse en Azure, puede ejecutar az login, o para la automatización, definir una entidad de servicio y ejecutar az login --service-principal dentro de un paso preDeploy.

Añadir el trabajo de implementación

El trabajo de implementación de ejemplo siguiente se inicia cuando el trabajo Build se completa correctamente. Para agregar la tarea a tu pipeline:

  1. Seleccione el icono Más acciones en la esquina superior derecha de la página Resumen , seleccione Editar canalización y agregue el código siguiente al final de la canalización. Reemplace por <environment-name> el nombre del entorno que creó.

    Opcionalmente, puede seleccionar máquinas virtuales específicas del entorno para recibir la implementación mediante el tags parámetro y especificar el <VMtag> que definió para la máquina virtual.

    - deployment: VMDeploy
      displayName: Web deploy
      dependsOn: Build
      condition: succeeded()
      environment:
        name: <environment-name>
        resourceType: VirtualMachine
        tags: <VMtag> # VMs to deploy to
    
  2. Agregue un strategy elemento al deployment trabajo. La estrategia de implementación runOnce es la más sencilla y se ejecuta de forma predeterminada si no especifica strategy. Esta estrategia ejecuta los pasos de implementación una vez en cada máquina virtual del entorno, sin paralelismo ni administración del tráfico.

      strategy:
         runOnce:
           deploy:
              steps:
              - script: echo my first deployment
    
  3. Después de agregar el trabajo de implementación, seleccione Validar y guardar y, después, Guardar, Ejecutary ejecutar de nuevo. Con cada ejecución de este trabajo, el historial de implementación se registra asociado al entorno.

    Nota:

    La primera vez que ejecute la canalización que usa el entorno, debe conceder permiso para todas las ejecuciones de la canalización para acceder al grupo de agentes y al entorno. Seleccione el símbolo En espera situado junto al trabajo en la pantalla Resumen de ejecución de canalización y, a continuación, seleccione Permitir para conceder los permisos necesarios.

Estrategia de implementación gradual

Puede usar una rolling estrategia de implementación en lugar de runOnce . Una estrategia de implementación gradual puede orquestar paralelismo, verificaciones de salud y enrutamiento del tráfico. Aunque la runOnce estrategia se ejecuta en una sola máquina virtual a la vez, una implementación gradual se puede ejecutar en paralelo en conjuntos graduales de hasta cinco máquinas virtuales de destino, en función de la maxParallel configuración.

El maxParallel parámetro establece el número o porcentaje de máquinas virtuales que deben permanecer disponibles, lo que garantiza que la aplicación pueda controlar las solicitudes y reducir el tiempo de inactividad general durante las implementaciones. Este parámetro también determina las condiciones de éxito y error de la implementación.

Para obtener más información sobre la estrategia de implementación gradual, consulte la definición de esquema jobs.deployment.strategy.rolling .

Ejemplo de trabajo de implementación

Las implementaciones en los recursos de máquina virtual requieren que las máquinas virtuales tengan instaladas y configuradas todas las aplicaciones, dependencias y permisos necesarios. Debe preinstalar manualmente estos requisitos o la canalización debe instalarlos o implementarlos.

La implementación de la aplicación Java en los recursos de máquina virtual es más fácil de implementar porque es independiente. La máquina virtual Java (JVM) suele estar preinstalada en agentes de máquina virtual y no es necesario preocuparse por las dependencias de la aplicación, los permisos o la administración de paquetes. Solo puede descargar el archivo JAR y, a continuación, ejecutarlo con java -jar.

La aplicación Node.js requiere nodo, posiblemente dependencias de npm, y un administrador de servicios como systemd para estar presente y configurado en cada máquina virtual del agente. Para ser automatizado, el script de implementación de la canalización debe ser no interactiva y capaz de reiniciar y administrar el servicio de la aplicación.

El siguiente trabajo de implementación de YAML rolling para la aplicación JavaScript depende de la finalización exitosa de la etapa Build. El trabajo de implementación supone que los siguientes requisitos ya están preinstalados o preconfigurados en cada máquina virtual del agente. Para la automatización completa, puede instalar y configurar estas aplicaciones y servicios en las máquinas virtuales como parte de la canalización.

  • Node.js 16.x instalado y npm disponible en el PATH del agente de compilación.
  • Systemd con un archivo de servicio systemd configurado para el servicio que inicia la aplicación de Node.js, como /etc/systemd/system/pipelines-javascript.service.
  • Sudo sin contraseña para comandos necesarios del usuario del agente, configurado con NOPASSWD: en /etc/sudoers.
  • Permisos de escritura para el usuario del agente en /opt/pipelines-javascript u otro destino de implementación.

Sugerencia

Para la mayoría de las aplicaciones Node.js, considere la posibilidad de implementar en Azure App Service o usar trabajos de canalización normales con agentes hospedados por Microsoft, en lugar de usar trabajos de implementación. Este enfoque es más sencillo y evita la sobrecarga operativa de administrar entornos de máquina virtual. La implementación en recursos específicos de máquina virtual es más adecuada para escenarios que requieren control directo de los servidores de máquina virtual, orquestación avanzada o infraestructura heredada.

- stage: Deploy
  displayName: Rolling Deploy to VMs
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: RollingDeploy
    displayName: Rolling deploy to Ubuntu VMs
    environment:
      name: <environment-name>
      resourceType: VirtualMachine
    strategy:
      rolling:
        maxParallel: 1   #or 2 for parallel. For percentages, use x%
        preDeploy:
          steps:
          - download: current
            artifact: drop
          - script: echo "Pre-deploy on $(hostname)"
        deploy:
          steps:
          - script: |
              echo "Unpacking Node.js app on $(hostname)"
              sudo mkdir -p /opt/pipelines-javascript
              sudo tar -xzf $(Pipeline.Workspace)/drop/$(Build.BuildId).tar.gz -C /opt/pipelines-javascript --strip-components=1
              cd /opt/pipelines-javascript
              echo "Installing production dependencies"
              sudo npm ci --only=production
              echo "Restarting Node.js service"
              sudo systemctl restart pipelines-javascript
            displayName: 'Extract, install, and restart Node.js service'
        routeTraffic:
          steps:
          - script: echo "Routing traffic on $(hostname)"
        postRouteTraffic:
          steps:
          - script: echo "Post-route health check on $(hostname)"
        on:
          failure:
            steps:
            - script: echo "Deployment failed on $(hostname)"
          success:
            steps:
            - script: echo "Deployment succeeded on $(hostname)"

Acceso a la rastreabilidad de la canalización en el entorno

La pestaña Implementaciones de entorno proporciona una trazabilidad completa de confirmaciones y elementos de trabajo y un historial de implementación entre pipelines para el entorno.

Captura de pantalla de la vista de implementaciones.