Estoy tratando de asignar uno de los 2 valores a una variable además del grupo de variables y no puedo encontrar la referencia de cómo usar IF ELSE.
Básicamente, necesito convertir esta lógica de jerkins a DevOps azul.
Jenkins
if (branch = 'master') {
env = 'a'
} else if (branch = 'dev'){
env ='b'
}
Encontré 1 referencia de la siguiente, pero esta parece funcionar si la sección de variables no tiene grupos de variables.
https://stackoverflow.com/a/57532526/5862540
Pero en mi cartera, ya tengo un grupo variable para secretos, así que tengo que usar la convención de nombre / valor y el ejemplo no funciona con los errores como expected a mapping
o A mapping was not expected
oUnexpected value 'env'
variables:
- group: my-global
- name: env
value:
${{ if eq(variables['Build.SourceBranchName'], 'master') }}:
env: a
${{ if eq(variables['Build.SourceBranchName'], 'dev') }}:
env: b
o
variables:
- group: my-global
- name: env
value:
${{ if eq(variables['Build.SourceBranchName'], 'master') }}: a
${{ if eq(variables['Build.SourceBranchName'], 'dev') }}: b
azure-devops
kevmando
fuente
fuente
Respuestas:
Creo que por ahora necesitará usar una tarea para personalizar con
name/value
variables de sintaxis y valores de variables condicionales. Parece que la estructura del objeto para laname/value
sintaxis rompe el análisis de las expresiones, como usted ha señalado.Para mí, lo siguiente es una implementación razonablemente limpia, y si desea abstraerlo de la tubería, parece que una plantilla simple para que use sus muchas tuberías debería satisfacer el deseo de una ubicación central "global".
fuente
Hasta donde sé, la mejor manera de tener una construcción de rama condicional es usar "trigger" en su YAML, en lugar de implementar "if-else" complejo. También es mucho más seguro y tiene controles más explícitos sobre los desencadenantes de la rama en lugar de depender de las variables de CI.
Ejemplo:
Para tener un activador con inclusión y exclusión de ramas, puede usar una sintaxis más compleja de activador con incluir y excluir ramas.
Ejemplo:
La documentación oficial de Azure DevOps Pipelines
trigger
en YAML es: Documentación de activación de Azure Pipelines YAMLACTUALIZACIÓN 1 :
Vuelvo a publicar mi comentario aquí con notas adicionales: estaba pensando en tener diferentes canales porque tener la complejidad de hacer malabarismos entre las variables de CI no es más fácil de mantener que tener múltiples trabajos en un YAML con disparadores. Tener múltiples trabajos con disparadores también nos obliga a tener una clara distinción y provisión en la gestión de sucursales. Mi equipo ha utilizado disparadores e inclusiones de ramas condicionales durante un año debido a estas ventajas de mantenibilidad.
No dude en estar en desacuerdo, pero para mí tener una lógica incrustada en cualquier secuencia de comandos en cualquier paso para verificar qué rama está actualmente en sesión y luego realiza cualquier otra acción, son más como soluciones ad-hoc. Y esto nos ha dado a mi equipo y a mí problemas de mantenimiento antes.
Especialmente si la lógica incrustada tiende a crecer comprobando otras ramas, la complejidad es más compleja más tarde que tener claras separaciones entre ramas. Además, si el archivo YAML se va a mantener durante mucho tiempo, debe tener disposiciones claras y hojas de ruta en diferentes ramas. La redundancia es inevitable, pero la intención de separar la lógica específica pagará más a largo plazo por la mantenibilidad.
Es por eso que también enfatizo las inclusiones y exclusiones de ramas en mi respuesta :)
fuente