首页 > 解决方案 > 如何将参数传递给 azure Dev ops 在外部构建管道以控制任务执行?

问题描述

我的查询是如何将参数传递给 azure Dev ops 在外部构建管道以控制任务执行?要详细解释这里的解释:

我在 azure Dev ops 中有一个项目,它有一个构建管道,配置了一系列任务,包括构建解决方案、生成可部署包等。通常这会很好地执行,没有任何问题。

我想要实现的是在这个项目构建定义中声明一个管道变量,当我说它是一个完全不同的东西或像 ms flow 这样的外部应用程序时,我可以从外部访问它,这样我就可以将一个值传递给新创建的管道变量如上所述,使用存储在这个新变量中的这个值,我应该能够跳过构建管道中的几个步骤,并且我应该只能执行几个步骤。

让我用一个例子来解释:

  1. 考虑一个在 azure Dev ops 中名为 A 的项目,它有一个配置有 5 个不同任务的构建管道
  2. 在同一个构建管道中,假设创建了一个名为 flag 的新管道变量
  3. 考虑一个像 ms flow 这样的外部应用程序,它在步骤 1 中触发项目 A 构建管道
  4. 我应该能够使用第 3 步中的流程(如 true 或 false)将值传递给第 2 步中创建的标志变量。
  5. 使用从 ms 流传递到构建管道的标志值,应该执行构建管道中的任务,即如果通过外部应用程序到达构建管道的值是 true,那么它应该只执行构建管道中的 3、4 个任务并跳过其他 false 应该在 azure Dev ops 中执行构建管道中的所有步骤。

查询是如何实现或使这种行为发生的?

请帮我解决这个问题?

如果无法将值传递给变量,请告诉我如何实现从外部应用程序(如 ms 流)触发的 azure Dev ops 构建管道中的跳过行为?

标签: azure-devopsazure-pipelines

解决方案


由于有一个 REST API 可以在对构建进行排队时传递参数,并且您可以在构建管道中指定自定义条件,因此有一种解决方法。根据 REST API 文档,您可以将其转换为如下所示的 Powershell 脚本。

Param(
       [string]$collectionurl = "https://dev.azure.com/{orgname}",
       [string]$project = "{projectname}",
       [string]$user = "{useraccount}",
       [string]$token = "{yourPAT}"
)

$base64AuthInfo= [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $token)))

$defurl = "$collectionurl/$project/_apis/build/builds?api-version=5.0"
$json = '{"parameters":  "{\"AnotherParameter\":  \"true\"}","definition":  {"id":  "{definitionId}"}}'
$updatedef = Invoke-RestMethod -Uri $defurl -Method Post -Body $json -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

您可以创建三个构建管道。第一个管道是您的主管道,它有 5 个不同的任务。您可以设置自定义条件,如下所示。这意味着,只有当 AnotherParameter 的值为 true 时,任务才会运行。

在此处输入图像描述

第二流水线和第三流水线是触发流水线。在第二个管道中,您可以使用 powershell 脚本将 AnotherParameter 设置为 false,在第三个管道中,将值设置为 true。

然后设置第二个管道由外部应用程序触发,第三个管道由您的回购或其他人触发。

当外部应用程序触发第二个管道时,AnotherParameter 的值为 false,第一个管道中的某些任务将不会运行。

当您的提交触发第三个管道时,AnotherParameter 的值将为 true,并且第一个管道中的所有任务将按预期运行。


推荐阅读