Especificar condiciones
Azure Pipelines | TFS 2018 | TFS 2017.3
Puede especificar las condiciones en las que se ejecuta cada fase, trabajo o paso. De forma predeterminada, un trabajo o una fase se ejecuta si no depende de ningún otro trabajo o fase, o si todos los trabajos o fases de los que depende se han completado y realizado correctamente. De forma predeterminada, se ejecuta un paso si todavía no se ha podido hacer nada en su trabajo y el paso inmediatamente anterior a él ha finalizado. Puede personalizar este comportamiento forzando una fase, un trabajo o un paso para que se ejecuten incluso si se produce un error en una dependencia anterior o especificando una condición personalizada.
Nota
En Microsoft Team Foundation Server (TFS) 2018 y versiones anteriores, las canalizaciones de compilación y versión se denominan definiciones, las ejecuciones se denominan compilaciones, las conexiones de servicio se denominan puntos de conexión de servicio, las fases se denominan entornos y los trabajos se denominan fases.
Puede especificar las condiciones en las que se ejecutará un paso, un trabajo o una fase.
Solo cuando todas las dependencias anteriores con el mismo grupo de agentes se han hecho correctamente. Si tiene grupos de agentes diferentes, esas fases o trabajos se ejecutarán simultáneamente. Este es el valor predeterminado si no hay una condición establecida en EL YAML.
Incluso si se ha producido un error en una dependencia anterior, a menos que se haya cancelado la ejecución. Use
succeededOrFailed()en YAML para esta condición.Incluso si se ha producido un error en una dependencia anterior, incluso si se ha cancelado la ejecución. Use
always()en YAML para esta condición.Solo cuando se ha producido un error en una dependencia anterior. Use
failed()en YAML para esta condición.
- Condiciones personalizadas
De forma predeterminada, los pasos, los trabajos y las fases se ejecutan si todos los pasos o trabajos anteriores se han ejecutado correctamente. Es como si especificase "condición: succeeded()" (vea Funciones de estado del trabajo).
jobs:
- job: Foo
steps:
- script: echo Hello!
condition: always() # this step will always run, even if the pipeline is canceled
- job: Bar
dependsOn: Foo
condition: failed() # this job will only run if Foo fails
También puede usar variables en condiciones.
variables:
isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')]
stages:
- stage: A
jobs:
- job: A1
steps:
- script: echo Hello Stage A!
- stage: B
condition: and(succeeded(), eq(variables.isMain, 'true'))
jobs:
- job: B1
steps:
- script: echo Hello Stage B!
- script: echo $(isMain)
Las condiciones se evalúan para decidir si se debe iniciar una fase, un trabajo o un paso.
Esto significa que no estará disponible nada calculado en tiempo de ejecución dentro de esa unidad de trabajo.
Por ejemplo, si tiene un trabajo que establece una variable mediante una expresión en tiempo de ejecución mediante sintaxis, no puede usar esa $[ ] variable en la condición personalizada.
YAML aún no se admite en TFS.
Habilitación de una condición personalizada
Si las condiciones integradas no satisfacen sus necesidades, puede especificar condiciones personalizadas.
En TFS 2017.3, las condiciones de tareas personalizadas solo están disponibles en la interfaz de usuario para las canalizaciones de compilación. Puede usar las API REST de versión para establecer condiciones personalizadas para las canalizaciones de versión.
Las condiciones se escriben como expresiones en canalizaciones YAML. El agente evalúa la expresión a partir de la función más interna y funciona a su manera de salir. El resultado final es un valor booleano que determina si se debe ejecutar o no la tarea, el trabajo o la fase. Consulte el tema expresiones para obtener una guía completa de la sintaxis.
¿Alguna de las condiciones permite que la tarea se ejecute incluso después de que un usuario cancele la compilación? Si es así, especifique un valor razonable para el tiempo de espera de cancelación para que estos tipos de tareas tengan tiempo suficiente para completarse después de que el usuario cancele una ejecución.
Ejemplos
Ejecutar para la rama principal, si se realiza correctamente
and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
Ejecutar si la rama no es principal, si se realiza correctamente
and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main'))
Ejecutar para ramas de temas de usuario, si se realiza correctamente
and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/heads/users/'))
Ejecución de compilaciones de integración continua (CI) si se realiza correctamente
and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI'))
Ejecutar si la compilación se ejecuta mediante una directiva de rama para una solicitud de extracción, en caso de error
and(failed(), eq(variables['Build.Reason'], 'PullRequest'))
Ejecute si la compilación está programada, incluso si se ha producido un error, incluso si se cancela.
and(always(), eq(variables['Build.Reason'], 'Schedule'))
Lanzamiento. Artifacts. {artifact-alias}. SourceBranch es equivalente a Build.SourceBranch.
Ejecutar si una variable está establecida en true
condition: eq(variables['System.debug'], 'true')
Ejecutar si una variable es null (cadena vacía)
Puesto que todas las variables se tratan como cadenas en Azure Pipelines, una cadena vacía es equivalente a null en esta canalización.
variables:
- name: testEmpty
value: ''
jobs:
- job: A
steps:
- script: echo testEmpty is blank
condition: eq(variables.testEmpty, '')
Usar un parámetro de plantilla como parte de una condición
Cuando se declara un parámetro en la misma canalización que tiene una condición, la expansión de parámetros se produce antes de que se tengan en cuenta las condiciones. En este caso, puede insertar parámetros dentro de condiciones. El script de este archivo YAML se ejecutará porque parameters.doThing es true.
parameters:
- name: doThing
default: true
type: boolean
steps:
- script: echo I did a thing
condition: and(succeeded(), eq('${{ parameters.doThing }}', 'true'))
Sin embargo, cuando se pasa un parámetro a una plantilla, el parámetro no tendrá un valor cuando se evalúe la condición. Como resultado, si establece el valor del parámetro en la plantilla y los archivos YAML de canalización, el valor de la plantilla se usará en la condición.
# parameters.yml
parameters:
- name: doThing
default: false # value passed to the condition
type: boolean
jobs:
- job: B
steps:
- script: echo I did a thing
condition: and(succeeded(), eq('${{ parameters.doThing }}', 'true'))
# azure-pipeline.yml
parameters:
- name: doThing
default: true # will not be evaluated in time
type: boolean
trigger:
- none
extends:
template: parameters.yml
Uso de la variable de salida de un trabajo en una condición en un trabajo posterior
Puede hacer que una variable esté disponible para trabajos futuros y especificarla en una condición. Las variables disponibles para trabajos futuros deben marcarse como variables de salida de varios trabajos mediante .
jobs:
- job: Foo
steps:
- bash: |
echo "This is job Foo."
echo "##vso[task.setvariable variable=doThing;isOutput=true]Yes" #set variable doThing to Yes
name: DetermineResult
- job: Bar
dependsOn: Foo
condition: eq(dependencies.Foo.outputs['DetermineResult.doThing'], 'Yes') #map doThing and check the value
steps:
- script: echo "Job Foo ran and doThing is Yes."
Preguntas más frecuentes
Tengo un paso condicional que se ejecuta incluso cuando se cancela un trabajo. ¿Mi paso condicional afecta a un trabajo que cancelé en la cola?
No. Si cancela un trabajo mientras está en la cola, se cancela todo el trabajo, incluidos los pasos condicionales.
Tengo un paso condicional que se debe ejecutar incluso cuando se cancela la implementación. Cómo especificar esto?
Si ha definido las canalizaciones mediante un archivo YAML, se admite. Este escenario aún no se admite para las canalizaciones de versión.
¿Cómo se puede desencadenar un trabajo si un trabajo anterior se ha hecho correctamente con problemas?
Puede usar el resultado del trabajo anterior. Por ejemplo, en este archivo YAML, la condición permite que el trabajo se ejecute porque eq(dependencies.A.result,'SucceededWithIssues') el trabajo A se ha ejecutado correctamente con problemas.
jobs:
- job: A
displayName: Job A
continueOnError: true # next job starts even if this one fails
steps:
- script: echo Job A ran
- script: exit 1
- job: B
dependsOn: A
condition: eq(dependencies.A.result,'SucceededWithIssues') # targets the result of the previous job
displayName: Job B
steps:
- script: echo Job B ran
Tengo un paso condicional que se ejecuta incluso cuando se cancela un trabajo. Cómo administrar para cancelar todos los trabajos a la vez?
Experimentará este problema si la condición configurada en la fase no incluye una función de comprobación del estado del trabajo. Para resolver el problema, agregue una función de comprobación de estado del trabajo a la condición. Si cancela un trabajo mientras está en la cola, se cancela todo el trabajo, incluidas todas las demás fases, con esta función configurada. Para obtener más información, vea Funciones de estado del trabajo.
stages:
- stage: Stage1
displayName: Stage 1
dependsOn: []
condition: and(contains(variables['build.sourceBranch'], 'refs/heads/main'), succeeded())
jobs:
- job: ShowVariables
displayName: Show variables
steps:
- task: CmdLine@2
displayName: Show variables
inputs:
script: 'printenv'
- stage: Stage2
displayName: stage 2
dependsOn: Stage1
condition: contains(variables['build.sourceBranch'], 'refs/heads/main')
jobs:
- job: ShowVariables
displayName: Show variables 2
steps:
- task: CmdLine@2
displayName: Show variables 2
inputs:
script: 'printenv'
- stage: Stage3
displayName: stage 3
dependsOn: Stage2
condition: and(contains(variables['build.sourceBranch'], 'refs/heads/main'), succeeded())
jobs:
- job: ShowVariables
displayName: Show variables 3
steps:
- task: CmdLine@2
displayName: Show variables 3
inputs:
script: 'printenv'