我目前正在使用Azure Devops Build Pipelines,并试图调用模板文件来执行我的构建Yaml中的某些任务。
将参数传递到模板文件时,我遇到了一些困难。假设这是我的模板文件(简体),可以正常工作:
parameters:
iterations: []
steps:
- ${{ each i in parameters.iterations }}:
- task: PowerShell@2
displayName: "Get key values ${{i}}"
name: getKeyValues_${{i}}
inputs:
targetType: 'inline'
script: |
$item = "${{i}}"
Write-Host "item : $($item)"
$keyVal = $item -split "_"
Write-Host $keyVal
Write-Host "key: $($keyVal[0]) | value: $($keyVal[1])"
echo "##vso[task.setvariable variable=key;isOutput=true]$($keyVal[0])"
echo "##vso[task.setvariable variable=value;isOutput=true]$($keyVal[1])"
所以我希望我的迭代参数包含这样的内容:
iterations: ["1_60", "2_40"]
在Yaml管道中,我有以下代码(也简化了):
- task: PowerShell@2
displayName: Calculate iterations for $(copies) copies
name: calculateIterations
inputs:
targetType: 'inline'
script: |
# Do some stuf here to get the arrow below from int value = 100
$iterations = ["1_60, "2_40"]
echo "##vso[task.setvariable variable=iterations;isOutput=true]$($iterations)"
- template: container-template.yml
parameters:
iterations: $(calculateIterations.iterations)
- task: PowerShell@2
displayName: Calculate iterations for $(copies) copies
name: calculateIterations
inputs:
targetType: 'inline'
script: |
# Do some stuf here to get the arrow below from int value = 100
$iterations = ["1_60, "2_40"]
echo "##vso[task.setvariable variable=iterations;isOutput=true]$($iterations)"
- template: container-template.yml
parameters:
iterations: ["1_60, "2_40"]
如您所见,问题在于我无法使用脚本的输出变量将其作为参数传递给模板。 当我运行不正常的情况时,出现以下错误:
我找到了这个post,但还没有解决方法...
答案 0 :(得分:2)
正如4c74356b41所说,这是目前的难题。换句话说,您提到的不工作场景直到现在还不支持实现。
现在,我们必须在编译时让template
知道明文。因为在此编译期间,我们很难一次完成两件事或更多事情,尤其是包含编译变量值,传递给相应的模板动态参数等。
预期序列或映射。实际价值 '$(calculateIterations.iterations)'
更详细,在编译期间(单击运行后但在管道真正启动之前):
1):首先,我们映射来自YAML管道的值,以确保- ${{ each i in parameters.iterations }}
对于 start 具有明确的值。
2)完成之后,然后按脚本顺序解析name: getKeyValues_${{i}}
上的精确值。
在您的方案中,由于您传递的是一个变量,它甚至不能满足第一步要求,并且这里没有解析值过程。这就是为什么您看到错误说Expected a sequence or mapping. Actual value '$(calculateIterations.iterations)'
的原因。
此错误消息的另一种表达形式是:我们( template )期待精确值来映射我们的动态参数,但是您给出的是无法识别的内容$(calculateIterations.iterations)
。抱歉,我们无法开始运行。
答案 1 :(得分:0)
经过多次尝试,我在stackoverflow中得到了这个问题,并开始知道在Azure Pipeline中没有办法实现这一点。可怜的。等待 Azure DevOps 提供解决此问题的方法