从另一个管道管理 CI/CD 管道 - Azure DevOps



我有一个管道(比如说A(。在其中,我编写了一个PowerShell脚本,该脚本可帮助我更新解决方案中的特定包。使用此 PowerShell 脚本将更改的代码与主分支合并后,它会自动触发另一个管道(例如 B(,其触发取决于主管道中的更改。我必须从管道 A 控制此管道 B 的触发 - 例如获取触发的管道 B 的状态,从 A 禁用管道 B 的触发等。请帮助我处理这种情况。

可以使用 powershell 任务调用构建 rest API 来获取另一个管道的状态(即。管道 B(。

首先要获取管道 B 的最新版本,可以使用下面的 rest api。

GET https://dev.azure.com/{organization}/{project}/_apis/build/builds?definitions={definitions}&$top={$top}&api-version=5.1

下面是 powershell 任务中的内联脚本示例,用于获取生成状态。

$uri = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds?definitions={definitionId}&`$top=1&api-version=5.1"
 
$result =Invoke-WebRequest -Uri $uri -Method Get -ContentType "application/json" -Headers $headers = @{ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}
$status = $result.value[0].status

$env:SYSTEM_ACCESSTOKEN是预定义的变量,您可以使用它直接在脚本中引用访问令牌。

若要取消管道 A 中的管道 B,可以调用更新生成 rest api。请参阅以下示例。首先从上面的 API 获取构建,然后将status更新为cancelling

$build = $result.value[0] 
$uriupdate = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds/$($build.id)?api-version=5.1"
$build.status = "cancelling"
$body = $build | ConvertTo-Json -Depth 10
$update = Invoke-RestMethod -Uri $uriupdate -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"} -ContentType "application/json"  -Method patch -Body $body

要在推送更改时跳过构建,只需在提交消息中包含[skip ci],如 Shamrai 所述。

git commit -m message [skip ci]

我必须控制从管道 A 触发此管道 B - 比如获取触发的管道B的状态,禁用触发器 来自 A 的管道 B 等。

  1. 可以将 REST API 与 PowerShell 结合使用来控制生成:生成 - 列表。
  2. 要禁用触发器,请在提交消息中添加scip ci:跳过单个提交的 CI

您可以在Powershell任务中使用输出变量。在此基础上,您可以控制要执行的下一个作业。这样,就不必使用多个生成管道,而是在单个管道中使用多个作业。

您可以在此处参考Microsoft文档

最新更新