ADO yaml 管道 - 迭代分割的字符串失败

问题描述 投票:0回答:1

我对以下管道摸不着头脑,无法真正弄清楚问题是什么。

我有以下 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上搜索了类似的问题,但没有找到类似的问题。

azure-devops azure-pipelines azure-pipelines-yaml
1个回答
0
投票

这是因为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

测试结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.