我们正在使用 Slack 通知我们的开发团队有关生产代码发布的信息。我们发现这样做最灵活的方法是通过 POST 到我们的 Slack 应用程序。在请求正文中,我传递了 4 个值,如下所示,这些值被设置为任务组的参数。
在任务组中,我设置了 3 个具有默认值的参数,它们是: 名称值
- 应用程序名称 $(Release.DefinitionName)
- 环境 $(环境)
- 团队 $(System.TeamProject)
我设置了一个 PowerShell 脚本任务以内联运行。它没有传递参数的选项。现在我只是将值写入控制台以查看发生了什么。
- 写输出“env $env:environment”
- 写输出“releaseurl $env:releaseurl”
- 写输出“team $env:team”
- Write-Output "application $env:applicationname"
在我的 Bash 脚本中,我使用 echo 做同样的事情,它看起来像这样:
- echo env $(环境)
- echo releaseurl $(Release.ReleaseWebURL)
- 呼应团队 $(team)
- 回显应用程序 $(applicationname)
当我运行这些脚本时,PowerShell 只会打印一个环境值(在发布工作流中定义)。它甚至无法使用默认的发布变量。
- 2019-04-11T13:23:58.6833137Z 环境生产
- 2019-04-11T13:23:58.6987109Z 发布网址
- 2019-04-11T13:23:58.6997009Z 团队
- 2019-04-11T13:23:58.6999878Z 申请
然而,Bash 的表现符合预期。
- 2019-04-11T13:24:17.3299022Z 环境生产
- 2019-04-11T13:24:17.3404876Z 团队应用服务
- 2019-04-11T13:24:17.3405018Z 申请发布通知试点
- 2019-04-11T13:24:17.3838219Z 发布网址 https://thereleaseurl
Bash 使用系统/发布变量没有问题。 PowerShell 将仅使用它在 VSTS 发布变量中明确定义的任何变量。我希望它使用任务组参数的值,这将允许团队使用默认值或自定义值。
因此,PowerShell 脚本将使用默认为 $(Release.DefinitionName) 的 applicationname 变量。在发布工作流程中,团队可以保持原样,或者如果定义名称不够清晰或不适合警报中报告的名称,则使用自定义值。我能让它工作的唯一方法是在发布变量中定义应用程序名称,并将其默认值设置为 $(Release.DefinitionName)。
再一次,bash 脚本工作得很好。 powershell 脚本似乎不喜欢这样。有谁知道为什么?很乐意尝试任何事情。
最佳答案
$env:variable
语法使 powershell 在运行时从环境变量中检索值。 $(variable)
语法在将脚本交给 powershell 之前执行变量的内联。
因此 $env:variable
没有被捕获为任务组的变量使用,而 $(variable)
是。
当变量包含引号或其他需要转义的特殊字符时,执行前内联可能会导致问题。
理想情况下,您会将变量作为参数传递给脚本调用,而不是作为脚本 block 中的内联值。
运行脚本 block 时,您可以在环境变量部分显式注册要提供的变量:
关于PowerShell 任务不会使用 VSTS 任务组变量,但会使用 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55634090/