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
相关产品推荐
相关产品推荐

