如何实现自定义流水线任务:等待外部进程完成后恢复执行?
实现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
相关产品推荐
相关产品推荐

