我对以下管道摸不着头脑,无法真正弄清楚问题是什么。
我有以下 yaml 管道(针对问题删除代码):
stages:
- stage: Check
variables:
- name: trackBranch
value: 'theBranch'
jobs:
- job: Checking
displayName: Check branch
steps:
- powershell: |
git fetch --depth=2 origin +refs/heads/${{ variables.trackBranch }}:refs/remotes/origin/${{ variables.trackBranch }}
$diffFolders=git diff --name-only HEAD^ HEAD | ForEach-Object { $_.Trim() } | ForEach-Object { [System.IO.Path]::GetDirectoryName($_) } | Sort-Object -Unique
Write-Output "Updated folders: $diffFolders"
$namesArray = @()
foreach ($entry in $diffFolders) {
$namesArray += $entry
}
$names = $namesArray -join ','
$namesAsString = $names | Out-String
Write-Output "##vso[task.setvariable variable=changedFolders;isOutput=true]$namesAsString"
displayName: 'Suchen der aktualisierten Module'
name: gitCompare
- job: Iteration
dependsOn: Checking
variables:
- name: updatedMods
value: $[dependencies.Checking.outputs['gitCompare.changedFolders']]
- name: testMods
value: "mod1,mod2,mod3"
steps:
- script: |
echo $(updatedMods)
- ${{ each entry in split(variables.updatedMods, ',') }}:
- script: echo ${{ entry }}
displayName: "Processing ${{ entry }}"
- ${{ each entry in split(variables.testMods, ',') }}:
- script: echo ${{ entry }}
displayName: "Processing ${{ entry }}"
在第一项工作中,它比较来自分支的两次提交,以查明某些内容是否已更新。例如,它将返回一个内容为:folder2、folder5、folder8 的对象,因为这些文件夹已更改。然后我“强制”将其写入字符串,并将其写入变量“changedFolders”。
在下一个工作中,变量得到回显,我可以按预期看到变量的内容。但迭代部分失败了:
dependency.Checking.outputs['gitCompare.changedFolders']:语法错误:算术运算符无效。 (错误导致字符为“.Checking.outputs['gitCompare.changedFolders']”)
但是使用 testMods 进行迭代和分割工作正常。
所以要么我没有看到问题出在哪里,要么第二个作业中的“收到”变量并不是真正的字符串并且导致了麻烦。
我在SO上搜索了类似的问题,但没有找到类似的问题。
这是因为each循环
${{ each entry in split(variables.updatedMods, ',') }}
是一个模板表达式,它是在编译时处理的。管道开始运行后发生的任何事情都是在模板编译之后发生的。因此,变量 updatedMods
的值是在编译时使用该字符串 $[dependencies.Checking.outputs['gitCompare.changedFolders']]
定义的。它不会更改为作业 1 的输出值。
更多信息可以参考运行时表达式语法。
作为解决方法,您可以在任务中迭代并拆分字符串
$(updatedMods)
。
示例任务:
- script: |
echo $(updatedMods)
# Use a for loop to iterate over each item in the string
for folder in $(updatedMods)
do
echo $folder
done
测试结果: