VSTS 发布多行变量

VSTS Release multi-line variable

我在 VSTS 发布管理中有删除文件的任务。我想让内容来自一个变量。我创建了一个变量,但不知道如何创建多行变量。因此,例如删除三种类型文件的变量:

变量名=排除文件
变量值= "Lib" "bin\*.pdb" "bin\*.dll.config"

不支持多行变量,我在这里提交用户声音:Multiple lines variable in Build and Release.

根据删除文件任务的源代码,它将内容值拆分为'\n',但根据我的测试,将'\n'添加到变量不起作用(例如t1.txt \ n t2.txt 或 t1.txt\nt2.txt).

您可以根据删除文件任务的源代码自定义 build/release 任务,或者使用您的逻辑执行它并通过 PowerShell/Command 行任务执行它。

可以使用具有多个逻辑行的变量作为多行任务参数的输入,但它可能不适用于每个任务。此方法已使用 VS 测试 2.x 任务在 VSTS 上进行测试,我将在下面将其用作示例。我希望它适用于 Microsoft 提供的大部分任务。

背景

任务通过 JSON 文件定义一组参数。除了 UI 中显示的显示名称之外,每个参数都有一个内部名称。可以使用任务上的 "Link settings" 按钮(或通过查找任务的源代码)查看内部参数名称。

在"Link settings"对话框中,VS测试2.x任务有一个叫做"Test assemblies"的"Setting to link",是一个多行字符串。查看 "Process parameter to link to this setting",我们看到值 "Parameters.testAssemblyVer2"。 testAssemblyVer2 是内部参数的名称。

当任务执行时,它需要获取其参数的值。大多数任务通过在当前环境变量中搜索以 "INPUT_" 开头的任何内容来执行此操作。对于 testAssemblyVer2,任务将查找名为 INPUT_TESTASSEMBLYVER2.

的环境变量

就在任务执行之前,我们可以将分隔的变量值转换为编码的多行值,并将其写入任务获取的环境变量中。

解决方案

首先,定义一个变量 "Custom.TestAssemblies",其值以分号分隔 **$(BuildConfiguration)\*.tests.dll;!**\obj\**。分号会变成分行。

接下来,将 PowerShell 任务添加到生成过程中,就在 VS 测试任务之前。将其配置为带有一个参数 "$(Custom.TestAssemblies)" 的内联脚本。在这里,双引号很关键。

内联脚本如下所示:

Param([String]$toMultiLine)

$newlineDelimited = $toMultiLine -replace ';', "%0D%0A"

Write-Host "##vso[task.setvariable variable=INPUT_TESTASSEMBLYVER2]$newlineDelimited"

就是这样!变量值中的分隔符被转换为 URL 编码的 CR/LF,并且指示代理使用该值更新 INPUT_TESTASSEMBLYVER2。该任务选取值并将其解析为“\n”,它与嵌入的 %0D%0A 相匹配。

总结

  1. 选择一个分隔符,例如 ;并用它来划分变量值的部分
  2. 使用"Link settings"
  3. 获取任务内部参数名称
  4. 在目标任务之前插入一个 PowerShell 任务并插入上面的代码,替换正确的变量和任务参数名称

如果将变量 system.debug 设置为 true,您通常会在跟踪输出中看到各种 INPUT_ 参数和一些解析。这取决于具体任务的实施。

此解决方案应该同样适用于构建和发布序列。

Thomas F. Abraham 的 PowerShell 解决方案解决了我的问题。这个修改让它更简单一些,不需要输入参数:

$newline = "%0D%0A `t"
Write-Host "##vso[task.setvariable variable=LineBreak]$newline"

我还添加了一个制表符,这样我的下一行就会缩进。然后只需在需要的地方引用变量 $(LineBreak) 即可。

Bash 解决方案:

emailbody=$(echo "$output" | sed ':a;N;$!ba;s/\n/%0D%0A/g')

Thomas 的解决方案也帮助我们指明了正确的方向。

在 Azure 管道中使用“bash”任务加载多行 certificates/keys 没有问题,

export CERTIFICATE=$(echo "$(CERTIFICATE_BASE64)" | base64 -d -w 0)
echo "##vso[task.setvariable variable=CERTIFICATE;]$(echo $CERTIFICATE)"

然而,在 azure 管道中尝试使用“powershell”任务同样没有用,

$CERTIFICATE = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String("$(CERTIFICATE_BASE64)"))
$CERTIFICATE.Replace("`n","`r`n")
Write-Output "##vso[task.setvariable variable=CERTIFICATE;]$CERTIFICATE"

以下交换确实有效,

$CERTIFICATE.Replace("`n","%0D%0A")