VSTS发布多行变量

时间:2017-06-09 18:57:53

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

我在VSTS版本管理中有删除文件的任务。我希望内容来自变量。我创建了一个变量,但我无法弄清楚如何创建一个多行变量。例如,删除三种类型文件的变量:

变量名称= ExcludeFiles
变量值=“Lib”“bin \ * .pdb”“bin \ * .dll.config”

enter image description here

4 个答案:

答案 0 :(得分:4)

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

背景

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

在“链接设置”对话框中,VS Test 2.x任务有一个名为“测试程序集”的“设置链接”,它是一个多行字符串。查看“Process parameter to link to this setting”,我们看到值“Parameters.testAssemblyVer2”。 testAssemblyVer2是内部参数的名称。

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

在任务执行之前,我们可以将分隔的变量值转换为编码的多行值,并将其写入环境变量中,然后由任务选择它。

解决方案

首先,使用分号分隔的值**\$(BuildConfiguration)\*.tests.dll;!**\obj\**定义变量“Custom.TestAssemblies”。分号将成为分割线。

接下来,在VS Test任务之前向构建过程添加PowerShell任务。将其配置为带有一个参数"$(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. 使用“链接设置”
  3. 获取任务的内部参数名称
  4. 在目标任务之前插入PowerShell任务并插入上面的代码,替换正确的变量和任务参数名称
  5. 如果将变量system.debug设置为true,通常会在跟踪输出中看到各种INPUT_参数和一些解析。这取决于具体任务的实施。

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

答案 1 :(得分:2)

Bash 解决方案:

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

答案 2 :(得分:1)

不支持多行变量,我在此处提交用户语音:Multiple lines variable in Build and Release

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

您可以根据“删除文件”任务的源代码自定义构建/发布任务,也可以使用逻辑对其执行,并通过PowerShell /命令行任务执行该任务。

答案 3 :(得分:1)

Thomas F. Abraham的PowerShell解决方案解决了我的问题。此修改使其更简单,不需要输入参数:

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

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