Как сделать задачу зависимой от конкретной задачи в yaml конвейере Azure?

Как сделать задачу зависимой от конкретной задачи в конвейерах 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? Если это скрипт, возможно, можно установить переменную конвейера, а затем использовать условие в C и D для проверки ее значения.

Rui Jarimba 07.06.2024 14:33

тип задачи B — сканирование призмы

生きがい 07.06.2024 14:40

Сработал ли какой-либо из приведенных ниже ответов?

Rui Jarimba 10.06.2024 20:37

@生きがい, Как предложено в моем ответе ниже, вы можете использовать API «Временная шкала — Получить», чтобы получить статус задачи, и использовать команду регистрации «SetVariable», чтобы установить статус задачи в качестве переменной конвейера для использования в condition из последующие задачи.

Bright Ran-MSFT 17.06.2024 09:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это должно сработать — раскомментируйте строки # 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')

Примечания:

  • Задача A: continueOnError: true разрешает запуск следующих задач в случае сбоя задачи, но устанавливает переменную Agent.JobStatus=SucceededWithIssues
  • Задача B: выполняется только в том случае, если задача A выполнена успешно, т. е. переменная Agent.JobStatus==Succeeded
  • Задачи C и D: выполнить, если задача B не удалась, т. е. переменная Agent.JobStatus==Failed

См. Функции проверки статуса задания.

не могли бы вы подробнее рассказать об этой части условияcondition: eq(variables['Agent.JobStatus'], 'Succeeded') что оно делает?

生きがい 12.06.2024 10:29

@生きがい задача A имеет continueOnError: true — это означает, что если она не удастся, то Agent.JobStatus=SucceededWithIssues. Задача B будет запущена тогда и только тогда, когда задача A будет успешной. См. Функции проверки статуса задания

Rui Jarimba 12.06.2024 10:43

Обратите внимание, что условие succeeded() эквивалентно in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues')

Rui Jarimba 12.06.2024 10:44

@生きがい was my explanation clear enough...?

Rui Jarimba 12.06.2024 13:50

да, теперь ясно, спасибо за помощь @Rui Jarimba

生きがい 20.06.2024 09:19

Вы можете использовать REST API Azure DevOps «Временная шкала — Получить», чтобы получить статус задачи B («test image»):

  1. Используйте API «Временная шкала — Получить», чтобы получить статус задачи Б.

  2. Используйте команду журнала «SetVariable», чтобы установить статус задачи в качестве переменной конвейера для использования.

  3. В задачах 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')
  . . .

Таким образом:

  • Если задача B равна failed, задачи C и D будут выполнены.
  • Если задача B равна succeeded, задачи C и D не будут выполняться.
  • Если задача A имеет failed, задача B получает skipped, а задачи C и D не будут выполняться.


Другие вопросы по теме