传递VSTS Release Multi-Configuration Phase两个变量,但只有一个乘数

时间:2018-06-26 19:07:26

标签: azure-devops azure-pipelines-release-pipeline

我有一个VSTS版本定义,该定义传递了两个变量,这些变量的内容我不控制。它们包含一个用逗号分隔的名称字符串和一个用逗号分隔的ID字符串,这些ID对应于按索引显示的名称。

我想使用一个代理阶段,该阶段配置了将并行性选项设置为多配置,并将乘数字段设置为ID字符串,因此该阶段对于每个ID运行一次。在该阶段,我还想使用与ID对应的名称,但是我不确定如何执行此操作。

如果我将乘数设置为两个变量(ID和名称),则会运行两个数组的笛卡尔积(交叉连接)的阶段,这是不希望的。

示例:

                    IDs: "A1, A2, A3"
                  Names: "Anna, Adam, Abby"
 Runs the phase 9 times: "A1" & "Anna", "A2" & "Anna", "A3" & "Anna"
                         "A1" & "Adam", "A2" & "Adam", "A3" & "Adam"
                         "A1" & "Abby", "A2" & "Abby", "A3" & "Abby"

如果我将乘数设置为ID变量,那么它只能以正确的次数运行该阶段,但是我不知道如何将相应的名称传递到该阶段。

这有可能吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

如果您要运行该阶段三次(A1-AnnaA2-AdamA3-Abby),则只需指定一个变量(无论(用于变量ID或名称)作为乘数,并从另一个变量中过滤相应项

例如每次将变量IDs用作乘数并从变量Names中过滤相应的名称,则可以使用以下步骤:

1。将ID指定为乘数

enter image description here

2。获取每次在代理阶段运行的ID

在将变量IDs指定为乘数之后,代理将运行三次:A1A2A3

每次在代理阶段运行时,您都可以通过变量 $(IDs) 获得关联ID:

  • 运行阶段A1时,变量$(IDs)的值为A1;
  • 运行阶段A2时,变量$(IDs)的值为A2;
  • 运行阶段A3时,变量$(IDs)的值为A3

3。每次在代理阶段运行时,从Names变量中过滤相应的名称

由于可以获得每次运行的ID,因此可以通过一些已定义的规则获得具有ID的相应名称。例如使用if条件获取正确的名称,或解析ID的索引并获取相应的名称等。

答案 1 :(得分:3)

要使多配置阶段对IDs变量中的每个项目运行一次,并使当前ID和名称都可用于该阶段:

  1. 按照Marina Marina的建议,将“乘数”字段设置为IDs变量。这会为每个ID运行一次该阶段,并将当前ID存储在IDs变量中。
  2. 添加一个名为CurrentName的空变量,该变量将存储与IDs变量关联的名称。

  3. 将内联Powershell脚本任务添加到包含以下命令的代理阶段:

$names = "$(Names)".Split(", ",[System.StringSplitOptions]::RemoveEmptyEntries) Write-Host "##vso[task.setvariable variable=CurrentName]$($names[[int]"$(SYSTEM.JOBPOSITIONINPHASE)" - 1])"

脚本使用内置的System.JobPositionInPhase变量(包含当前正在运行的阶段的索引)从Names变量中获取的当前阶段的名称,并将其存储在CurrentName变量。

您可以在阶段的任何地方使用$(CurrentName)来获取与$(IDs)关联的名称的值。

相关问题