【问题标题】:Why one can set TFS predefined variables when they are said to be read-only?为什么说 TFS 预定义变量是只读的?
【发布时间】:2018-10-25 18:45:19
【问题描述】:

根据https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=tfs-2018

这些变量由系统自动设置并且是只读的。 (例外是 Build.Clean 和 System.Debug。)

尽管如此,如果有人尝试使用以下任务创建 vnext 构建

  1. 内联 Powershell - Write-Host $env:BUILD_SOURCEVERSION
  2. 内联 Powershell - Write-Host ("##vso[task.setvariable variable=build.sourceversion;]"+'someNewValue')
  3. 内联 Powershell - Write-Host $env:BUILD_SOURCEVERSION

任务2不会失败,最后一个任务会输出类似

2018-10-24T07:37:23.1232438Z someNewValue

而不是预期的原始源版本(第一个任务中打印的值)。

所以,

  1. 要么我误读了文档/他们对此帐户不清楚
  2. 或者是 TFS 中的一些真正的缺陷应该与 MS 一起追求?

【问题讨论】:

  • 我的一位同事说这是设计使然。例如,您可以通过这种方式覆盖构建名称。你应该向微软申请许可,但我认为文档是错误的。

标签: tfs azure-devops vnext


【解决方案1】:

这是预期的行为。

预定义变量由系统自动设置且为只读。

但是,如果您定义了一个同名的管道变量 作为环境变量(例如,PATH),您的管道变量 value 会覆盖代理主机的环境变量。

详情请见Environment variables

因此,在您的场景中,实际上您定义了一个与预定义变量同名的新管道变量,但并未真正覆盖预定义变量。而且它们只能在管道中使用......


更新:

好吧,文档对Environment Variables 有点误导,并且对它们的只读性提出了一些稍微矛盾的说法。实际上所有变量(*predefined, build, environment...)基本上都作为环境变量mentioned here

顺便说一句,您可以通过管道中的get-childitem -path env:* 获取所有可用的环境变量。*

例如PowerShell脚本:

$environmentVars = get-childitem -path env:*
foreach($var in $environmentVars)
{
 $keyname = $var.Key
 $keyvalue = $var.Value

 Write-Output "${keyname}: $keyvalue"
}

【讨论】:

  • 这就是我认为可能是这里的情况。但问题是您在此处引用的section 处理 Environment 变量(作为操作系统环境,而不是构建/代理环境)。所以文档在这一点上并不清楚。好吧,实际上更糟 - docs.microsoft.com/en-us/azure/devops/pipelines/process/… As a pipeline author or end user, you cannot set...
  • 嗯,实际上它包括操作系统和构建/代理环境变量。基本上你可以通过get-childitem -path env:*在管道中获取所有环境变量。
  • 是的,可能就是这样......只是文档至少具有适度的误导性。如果您提到 all variables (predefined, build, environment...) basically work as https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=tfs-2018&tabs=yaml%2Cpowershell#environment-variables ,despite that the documentation makes some slightly contradictory claims about their readonlyness and etc. 之类的内容,我会接受这个答案 - 您可能不会反对该陈述的正确性,对吗?
  • github.com/microsoft/azure-pipelines-yaml/blob/master/design/… - 我们使用的是 Dev18.M170.6 版本,无法再更改构建代理中的只读变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多