英文:
Question about weird behavior referencing a YAML pipeline resource using a variable for the pipeline resource name
问题
我在使用YAML变量、参数和Azure管道资源引用时遇到了奇怪的行为。以下展示了原始实现与新实现之间的工作差异,新实现只有一行更改。
工作的实现
模板 A(调用模板 B):
- template: Templates\TemplateB.yml
serviceBuildResourceName: resourceName
模板 B(使用serviceBuildResourceName参数获取管道运行信息):
$projectId = '$(resources.pipeline.${{ parameters.serviceBuildResourceName }}.projectID)'
$pipelineId = '$(resources.pipeline.${{ parameters.serviceBuildResourceName }}.PipelineID)'
在上述实现中,一切都完美工作。
失败的实现
模板 A(调用模板 B):
- template: Templates\TemplateB.yml
serviceBuildResourceName: $(ServiceBuildResourceName)
模板 B(使用serviceBuildResourceName参数获取管道运行信息):
$projectId = '$(resources.pipeline.${{ parameters.serviceBuildResourceName }}.projectID)'
$pipelineId = '$(resources.pipeline.${{ parameters.serviceBuildResourceName }}.PipelineID)'
唯一的区别在于,不再将硬编码的字符串传递给serviceBuildResourceName
参数,而是传递一个变量,该变量的值与之前的相同,即resourceName
。该变量在先前的模板中定义如下:
- name: ServiceBuildResourceName
value: resourceName
但现在在我的管道运行中出现了以下错误:
WARNING: 2023-02-12 15:52:29.5071 Response body: {"$id":"1","innerException":null,"message":"The value is not an integer.
$(resources.pipeline.resourceName.PipelineID)
尽管我知道变量被正确填充,因为上面的错误消息包含了resources.pipeline.resourceName.PipelineID
中的"resourceName",但出现了一个错误。似乎它不再识别管道资源,而是将其识别为字符串。
任何关于此问题的帮助或见解将不胜感激,谢谢!
英文:
I am experiencing weird behavior with YAML variables, parameters, and Azure pipeline resource references. The following shows the original implementation that works compared to my new implementation with a single line change that fails.
Working Implementation
Template A (makes a call to template B):
- template: Templates\TemplateB.yml
serviceBuildResourceName: resourceName
Template B (uses serviceBuildResourceName param to get pipeline run information):
$projectId = '$(resources.pipeline.${{ parameters.serviceBuildResourceName }}.projectID)'
$pipelineId ='$(resources.pipeline.${{ parameters.serviceBuildResourceName }}.PipelineID)'
Template B goes on to use the values in $projectId
and $pipelineId
(along with other values not listed here since it is irrelevant) to successfully retrieve information about the a pipeline run from the specific pipeline resource, serviceBuildResourceName
. Note that all pipeline resources are correctly defined at the beginning yaml file for the pipeline. In this implementation above, everything works perfectly.
Failing Implementation
Template A (makes a call to template B):
- template: Templates\TemplateB.yml
serviceBuildResourceName: $(ServiceBuildResourceName)
Template B (uses serviceBuildResourceName param to get pipeline run information):
$projectId = '$(resources.pipeline.${{ parameters.serviceBuildResourceName }}.projectID)'
$pipelineId ='$(resources.pipeline.${{ parameters.serviceBuildResourceName }}.PipelineID)'
Note that the only difference is the following: instead of passing the hard-coded string into the serviceBuildResourceName
parameter, I pass in a variable, which has the same value as before, resourceName
. The variable is defined in an earlier template as such:
- name: ServiceBuildResourceName
value: resourceName
I feel it should still work the same, but I know get the following error in my pipeline run:
WARNING: 2023-02-12 15:52:29.5071 Response body: {"$id":"1","innerException":null,"message":"The value is not an integer.
$(resources.pipeline.resourceName.PipelineID)
I know that the variable is being correctly populated since the error message above contains "resourceName" in resources.pipeline.resourceName.PipelineID
, as it should.
However, for reasons unknown to me, it now throughs an error. It seems like it doesn't recognize the pipeline resource, and instead recognizes it as a string.
Any help or insight here would be greatly appreciated, thanks!
答案1
得分: 0
这似乎是因为 YAML 中预定义变量的工作方式。由于resources.pipeline...
是一个预定义变量,它在编译时被解析。因此,您不能使用我所做的那样运行时定义的变量。它不会被解析为预定义变量,而会在运行时解析为字符串。
英文:
As far as I can tell, this is because of how predefined variables work in YAML. Since resources.pipeline...
is a predefined variable, it gets resolved at compile time. Thus, you can't use run-time defined variables like I am doing. Instead of resolving it as a predefined variable, it will get resolved to be a string at runtime.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论