You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure DevOps Pipeline:并行作业间特定任务依赖配置咨询

实现跨作业的任务依赖(保持作业并行)

要实现JOB1与JOB2并行运行,但JOB2的TASK1_MACOS需等待JOB1的TASK1_UBUNTU完成后再执行,可通过以下两种方式实现:

方法一:使用API轮询任务状态

在JOB2中添加前置任务,通过Azure DevOps的REST API轮询JOB1中TASK1_UBUNTU的执行状态,直到任务完成再继续执行后续任务。

修改后的YAML代码:

- job: JOB1
  displayName: 'UBUNTU'
  pool:
    vmImage: ubuntu-20.04
  steps:
  - task: Bash@3
    inputs:
      targetType: 'inline'
      script: |
        echo 'Hello world';
        sleep 30;
    displayName: TASK1_UBUNTU
    name: Task1Ubuntu # 给任务命名,方便后续识别

- job: JOB2
  displayName: 'MACOS'
  pool:
    vmImage: macOS-12
  steps:
  - task: PowerShell@2
    inputs:
      targetType: 'inline'
      script: |
        $org = "$(System.TeamFoundationCollectionUri)"
        $project = "$(System.TeamProject)"
        $buildId = "$(Build.BuildId)"
        $taskName = "TASK1_UBUNTU"
        $jobName = "JOB1"

        do {
          Write-Host "等待JOB1的TASK1_UBUNTU完成..."
          $jobs = Invoke-RestMethod -Uri "$org$project/_apis/build/builds/$buildId/timeline?api-version=7.1-preview.1" -Headers @{Authorization = "Bearer $(System.AccessToken)"}
          $targetJob = $jobs.records | Where-Object { $_.name -eq $jobName -and $_.type -eq "Job" }
          $targetTask = $jobs.records | Where-Object { $_.parentId -eq $targetJob.id -and $_.name -eq $taskName }

          if ($targetTask.state -eq "completed") {
            Write-Host "TASK1_UBUNTU已完成,继续执行后续任务"
            break
          }
          Start-Sleep -Seconds 10
        } while ($true)
    displayName: Wait for TASK1_UBUNTU to complete
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)

  - task: Bash@3
    inputs:
      targetType: 'inline'
      script: |
        echo 'Hello world';
    displayName: TASK1_MACOS 

方法二:拆分作业利用原生依赖

把JOB1拆分为两个作业:仅执行TASK1_UBUNTU的JOB1_INIT,以及执行JOB1后续任务的JOB1_MAIN。让JOB1_MAIN与JOB2并行,同时JOB2的TASK1_MACOS依赖JOB1_INIT的完成,这种方式更贴合Azure DevOps的原生依赖逻辑。

修改后的YAML代码:

- job: JOB1_INIT
  displayName: 'UBUNTU - 初始化任务'
  pool:
    vmImage: ubuntu-20.04
  steps:
  - task: Bash@3
    inputs:
      targetType: 'inline'
      script: |
        echo 'Hello world';
        sleep 30;
    displayName: TASK1_UBUNTU

- job: JOB1_MAIN
  displayName: 'UBUNTU - 后续任务'
  pool:
    vmImage: ubuntu-20.04
  dependsOn: JOB1_INIT
  steps:
  # 在这里添加JOB1原本的其他任务

- job: JOB2
  displayName: 'MACOS'
  pool:
    vmImage: macOS-12
  dependsOn: JOB1_INIT # 仅依赖JOB1_INIT完成,而非整个JOB1
  steps:
  - task: Bash@3
    inputs:
      targetType: 'inline'
      script: |
        echo 'Hello world';
    displayName: TASK1_MACOS 

方案说明

  • 方法一适合无法拆分原有作业的场景,通过API轮询实现跨作业任务等待,需确保System.AccessToken具备访问构建timeline的权限。
  • 方法二更简洁高效,利用原生作业依赖机制避免轮询开销,推荐优先采用。

内容的提问来源于stack exchange,提问作者jzone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:33:24