Как сделать задачу зависимой от конкретной задачи в конвейерах Azure? Моя цель — выполнить задачи C и D тогда и только тогда, когда задача B не удалась.
Я пробовал использовать условие: failed() но если задача A не удалась, будут запущены задачи C и D, что неверно.
Есть ли способ указать, от какой задачи зависит другая задача?
- task: A
inputs:
command:
repository:
Dockerfile:
tags:
displayName: 'Build test image'
- task: B
inputs:
fullImageNameAndTag:
displayName: 'test image'
condition: succeeded()
- task: C
inputs:
targetPath:
displayName: 'Download test image'
condition: ?
- task: D
inputs:
targetPath:
displayName: 'Download test2 image'
condition: ?
тип задачи B — сканирование призмы
Сработал ли какой-либо из приведенных ниже ответов?
@生きがい, Как предложено в моем ответе ниже, вы можете использовать API «Временная шкала — Получить», чтобы получить статус задачи, и использовать команду регистрации «SetVariable», чтобы установить статус задачи в качестве переменной конвейера для использования в condition из последующие задачи.





Это должно сработать — раскомментируйте строки # exit 1, чтобы не выполнить конкретную задачу:
trigger: none
pool:
vmImage: 'ubuntu-latest'
steps:
- script: |
echo "This is task A"
# exit 1
displayName: 'Task A'
# Allow the following tasks to run, in case of failure
# If task is successful then $(Agent.JobStatus)=Succeeded
# If task fails then $(Agent.JobStatus)=SucceededWithIssues
continueOnError: true
- script: |
echo "This is task B"
# exit 1
displayName: 'Task B'
condition: eq(variables['Agent.JobStatus'], 'Succeeded')
- script: |
echo "This is task C"
displayName: 'Task C'
condition: failed() # same as eq(variables['Agent.JobStatus'], 'Failed')
- script: |
echo "This is task D"
displayName: 'Task D'
condition: failed() # same as eq(variables['Agent.JobStatus'], 'Failed')
Примечания:
continueOnError: true разрешает запуск следующих задач в случае сбоя задачи, но устанавливает переменную Agent.JobStatus=SucceededWithIssuesAgent.JobStatus==SucceededAgent.JobStatus==FailedСм. Функции проверки статуса задания.
не могли бы вы подробнее рассказать об этой части условияcondition: eq(variables['Agent.JobStatus'], 'Succeeded') что оно делает?
@生きがい задача A имеет continueOnError: true — это означает, что если она не удастся, то Agent.JobStatus=SucceededWithIssues. Задача B будет запущена тогда и только тогда, когда задача A будет успешной. См. Функции проверки статуса задания
Обратите внимание, что условие succeeded() эквивалентно in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues')
@生きがい was my explanation clear enough...?
да, теперь ясно, спасибо за помощь @Rui Jarimba
Вы можете использовать REST API Azure DevOps «Временная шкала — Получить», чтобы получить статус задачи B («test image»):
Используйте API «Временная шкала — Получить», чтобы получить статус задачи Б.
Используйте команду журнала «SetVariable», чтобы установить статус задачи в качестве переменной конвейера для использования.
В задачах C и D используйте клавишу condition, чтобы определить, следует ли запускать две задачи, в зависимости от статуса задачи B.
steps:
# Task A
- task: A
displayName: 'Build test image'
. . .
# Task B
- task: B
displayName: 'test image'
. . .
# Get status of Task B
- task: PowerShell@2
displayName: 'Check task status'
condition: always()
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
inputs:
targetType: inline
pwsh: true
script: |
$organizationUri = "$(System.CollectionUri)"
$project = "$(System.TeamProject)"
$buildId = $(Build.BuildId)
$uri = "${organizationUri}${project}/_apis/build/builds/${buildId}/timeline?api-version=7.0"
$headers = @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}
$response = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers
$taskResult = ($response.records | where {$_.name -eq "test image"}).result
Write-Host "Task 'test image' is $taskResult."
Write-Host "##vso[task.setvariable variable=taskStatus;]$taskResult"
# Task C
- task: C
displayName: 'Download test image'
condition: eq(variables.taskStatus, 'failed')
. . .
# Task D
- task: D
displayName: 'Download test2 image'
condition: eq(variables.taskStatus, 'failed')
. . .
Таким образом:
failed, задачи C и D будут выполнены.succeeded, задачи C и D не будут выполняться.failed, задача B получает skipped, а задачи C и D не будут выполняться.
Какой тип задачи
B? Если это скрипт, возможно, можно установить переменную конвейера, а затем использовать условие вCиDдля проверки ее значения.