es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Azure CICD: pasos comunes en un solo lugar

Necesito ayuda con la configuración de Azure CICD. Ahora parece que en eso


trigger: branches: include: - master - main - development stages: - stage: UberStage jobs: - job: SuperJob pool: vmImage: ubuntu-latest steps: - script: | command1 command2 command3 command4 other_command displayName: 'Super description' - job: MegaJob pool: vmImage: ubuntu-latest steps: - script: | command1 command2 command3 command4 other_command_2 displayName: 'Mega description' - job: UberJob pool: vmImage: ubuntu-latest steps: - script: | command1 command2 command3 command4 other_command_3 displayName: 'Uber description'

Como se ve, hay partes comunes en todos los trabajos, como el pool y los primeros pasos.
¿Es posible en Azure CICD yaml mantener la regla DRY (Don’t Repeat Yourself) y no duplicar las partes comunes?
¿También es posible configurar el disparador para que se ejecute en todas las ramas y que trabajos específicos se ejecuten solo en main/master?

Cualquier ayuda será apreciada.
Saludos cordiales,
Draqun

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hola Draqun,

    Sí, es posible mantener el principio DRY en tu Azure CICD YAML utilizando plantillas. Las plantillas te permiten definir componentes reutilizables que pueden ser utilizados en todas tus definiciones YAML.

    Aquí tienes un ejemplo de cómo puedes crear una plantilla para las partes comunes de tus trabajos:


    # Define una plantilla para las partes comunes # Esto puede ser ubicado en un archivo separado llamado 'common.yml' # y referenciado en este archivo YAML # utilizando una expresión ${{ }}. # El nombre de la plantilla es CommonParts # La sección 'parameters' te permite pasar # valores que pueden ser utilizados en la plantilla. - name: CommonParts parameters: - name: poolName type: string default: 'ubuntu-latest' steps: - script: | command1 command2 command3 command4 # Define el YAML con las plantillas y los desencadenadores trigger: branches: include: - '*' paths: include: - src/* - tests/* stages: - stage: UberStage jobs: - template: CommonParts # Pasa el valor de parámetro a la plantilla parameters: poolName: 'ubuntu-latest' job: SuperJob steps: # Extiende la plantilla con pasos específicos del trabajo - script: | other_command displayName: 'Descripción super' - template: CommonParts parameters: poolName: 'ubuntu-latest' job: MegaJob steps: - script: | other_command_2 displayName: 'Descripción mega' - job: UberJob pool: vmImage: ubuntu-latest steps: - template: CommonParts parameters: poolName: 'ubuntu-latest' - script: | other_command_3 displayName: 'Descripción uber'

    En el código anterior, la plantilla CommonParts está definida con las partes comunes que se necesitan en todos los trabajos. El parámetro poolName se pasa a la plantilla CommonParts, que puede ser utilizado para especificar el nombre del pool para vmImage. Los demás pasos específicos del trabajo se agregan al arreglo steps para cada trabajo.

    Respecto a tu otra pregunta, puedes utilizar la sección branches en el desencadenador para incluir todas las ramas, y luego utilizar la condición if en cada trabajo para especificar en qué ramas debe ejecutarse el trabajo. Aquí tienes un ejemplo:

    trigger:
      branches:
        include:
          - '*'
    
    stages:
      - stage: UberStage
        jobs:
          - job: SuperJob
            pool:
              vmImage: ubuntu-latest
            steps:
              - script: |
                  command1
                  command2
                  command3
                  command4
                  other_command
              displayName: 'Descripción super'
            # Especifica que el trabajo solo se ejecute en la rama main/master
            # utilizando una condición if
            # La función 'contains' verifica si la cadena 'main' o 'master'
            # se encuentra en el nombre de la rama que se está construyendo.
            # La función 'and' se utiliza para unir múltiples condiciones.
            # La función 'eq' se utiliza para verificar una coincidencia exacta.
            # La función 'lower' se utiliza para convertir el nombre de la rama
            # a minúsculas, de modo que la coincidencia funcione incluso si la rama
            # se llama 'Main' o 'MASTER'.
            if: and(contains(lower(variables['Build.SourceBranchName']), 'main'),
                    eq(variables['Build.SourceBranch'], 'refs/heads/main'))
    
          - job: MegaJob
            pool:
              vmImage: ubuntu-latest
            steps:
              - script: |
                  command1
                  command2
                  command3
                  command4
                  other_command_2
              displayName: 'Descripción mega'
            # Especifica que el trabajo solo se ejecute en la rama main/master
            if: and(contains(lower(variables['Build.SourceBranchName']), 'main'),
                    eq(variables['Build.SourceBranch'], 'refs/heads/main'))
    
          - job: UberJob
            pool:
              vmImage: ubuntu-latest
            steps:
              - script: |
                  command1
                  command2
                  command3
                  command4
                  other_command_3
              displayName: 'Descripción uber'
            # Especifica que el trabajo se ejecute en todas las ramas
            # utilizando una condición if
            if: succeeded()
    
    

    En el código anterior, la condición if para cada trabajo especifica que el trabajo solo se debe ejecutar en la rama main o master utilizando la función contains y la función eq. La función lower se utiliza para convertir el nombre de la rama a minúsculas y evitar problemas de sensibilidad a mayúsculas. El trabajo UberJob tiene una condición if de succeeded(), que ejecutará el trabajo en todas las ramas que desencadenen la compilación.

    ¡Espero que esto te ayude! Avísame si tienes alguna otra pregunta.

    Saludos cordiales,
    [Tu Nombre]

Comments are closed.