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

如何实现自定义流水线任务:等待外部进程完成后恢复执行?

实现Azure DevOps流水线暂停等待外部进程完成(Webhook触发恢复)

核心实现逻辑

要搞定这个需求,核心是让流水线进入挂起状态并释放代理,同时留好触发恢复的入口——不用人工操作Manual Validation,而是靠外部进程完成后调用Azure DevOps API来重启流水线。

具体步骤

1. 自定义任务里启动外部进程并留存关键信息

在你的自定义任务中,启动外部进程前,先把流水线的Run ID和项目ID存下来,最好传递给外部进程,方便它完成后回调用:

# 从Azure DevOps预定义变量获取关键信息
$runId = $(Build.BuildId)
$projectId = $(System.TeamProjectId)
$orgUrl = $(System.CollectionUri)

# 启动外部进程时把这些信息作为参数或环境变量传递
Start-Process -FilePath "your-external-process.exe" -ArgumentList "--run-id $runId --project-id $projectId --org-url $orgUrl"

2. 触发流水线挂起,释放代理

调用Azure DevOps的暂停API,让流水线进入挂起状态,当前代理会被立即释放,去处理其他任务:

$token = "$(System.AccessToken)"
$headers = @{ Authorization = "Bearer $token" }

# 调用暂停API
$pauseApiUrl = "$orgUrl/$projectId/_apis/build/builds/$runId/pause?api-version=7.1-preview.1"
Invoke-RestMethod -Uri $pauseApiUrl -Method Post -Headers $headers

执行完这步,流水线会停在当前任务之后,代理资源被释放。

3. 外部进程完成后调用恢复API

等外部进程运行完成后,让它调用Azure DevOps的恢复API,将流水线拉起来继续执行后续任务:

# 外部进程中的恢复逻辑(使用有权限的PAT令牌)
$resumeApiUrl = "$orgUrl/$projectId/_apis/build/builds/$runId/resume?api-version=7.1-preview.1"
$patToken = "your-pat-token-here"
$headers = @{ Authorization = "Bearer $patToken" }

Invoke-RestMethod -Uri $resumeApiUrl -Method Post -Headers $headers

如果外部进程在Azure环境内运行,也可以复用流水线的System.AccessToken,但要确保该令牌拥有足够的流水线操作权限。

踩坑提醒

  • 权限要到位:调用暂停/恢复API的账号必须拥有流水线的管理或执行权限,否则会返回403错误
  • 信息要存稳:外部进程必须可靠留存Run ID、项目ID等关键信息,避免进程重启后丢失导致无法触发恢复
  • 异常要处理:如果外部进程运行失败,记得调用API终止流水线,避免流水线长期处于挂起状态占用资源
  • API版本要有效:尽量使用最新的稳定版API,避免因版本过期导致调用失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:05:16