【问题标题】:VSTS Release multi-line variableVSTS 发布多行变量
【发布时间】:2017-11-11 21:29:45
【问题描述】:

我在 VSTS 版本管理中有删除文件的任务。我想让内容来自一个变量。我已经创建了一个变量,但我不知道如何创建一个多行变量。所以比如一个删除三种文件的变量:

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

【问题讨论】:

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


    【解决方案1】:

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

    背景

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

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

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

    就在任务执行之前,我们可以将一个定界变量值转换为一个编码的多行值,并将其写入环境变量中被任务提取的位置。

    解决方案

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

    接下来,在 VS 测试任务之前将 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. 在目标任务之前插入 PowerShell 任务并插入上面的代码,替换正确的变量和任务参数名称

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

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

    【讨论】:

    • 谢谢!这适用于我的情况。一个问题,如果我有两个测试任务会发生什么?我想应该有两个INPUT_TESTASSEMBLYVER2 变量,每个变量的名称不同。
    • 如果管道中有两个不同的测试任务,最简单的方法是有两个变量,每个任务一个,然后在两个测试任务之前重复上面的 PowerShell 步骤。每一个都将对应的输入变量映射到 INPUT_TESTASSEMBLYVER2。
    • 非常感谢您!对我来说效果很好。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        Bash 解决方案:

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

        【讨论】:

          【解决方案5】:

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

          在 azure 管道中使用“bash”任务加载多行证书/密钥没有问题,

          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")
          

          【讨论】:

            猜你喜欢
            • 2019-04-29
            • 1970-01-01
            • 2018-10-25
            • 1970-01-01
            • 2018-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-26
            相关资源
            最近更新 更多