0

我正在开发一个 azure devops 多阶段 yaml 管道。我在第一阶段设置了一个变量,然后在下一阶段,我有一个基于该变量的条件。我还在下一阶段检索变量值。显然,在条件和阶段级别访问阶段间变量的语法略有不同。我无法弄清楚我需要在条件中使用的语法。我已经尝试了所有可能的变化,但似乎没有一个有效。在下面的示例中,我希望 lint 阶段能够运行,但它会被跳过。这里条件的确切语法应该是什么?

stages:
- stage: build
  displayName: build
  pool:
    name: Azure Pipelines
    vmImage: ubuntu-latest
  dependsOn: []
  jobs:
  - deployment: build_job
    environment:
      name: "test"
    strategy:
      runOnce:
        deploy:
          steps:
          - task: PowerShell@2
            displayName: "get commitMessage variable"
            name: getCommitMessage
            inputs:
              targetType: inline
              pwsh: true
              script: |
                $commitMessage = "abcd_import/"
                echo "setting commitMessage: $commitMessage"
                echo "##vso[task.setvariable variable=commitMessage;isOutput=true]$commitMessage"

- stage: lint
  displayName: lint
  dependsOn:
  - 'build'
  condition: contains(stageDependencies.build.build_job.outputs['build_job.getCommitMessage.commitMessage'], 'import/')
  pool:
    name: Azure Pipelines
    vmImage: ubuntu-latest
  variables:
  - name: BUILD_STAGE_GET_COMMIT_MESSAGE
    value: $[stageDependencies.build.build_job.outputs['build_job.getCommitMessage.commitMessage']]
  jobs:
  - deployment: validate
    environment:
      name: "test"
    strategy:
      runOnce:
        deploy:
          steps:
          - task: PowerShell@2
            displayName: "commitMessage is empty"
            name: fail
            inputs:
              targetType: inline
              pwsh: true
              script: "echo $(BUILD_STAGE_GET_COMMIT_MESSAGE)"

更新(答案):我为此提出了一个 MS 支持案例并得到了解决方案。正确的语法是

condition: contains(dependencies.build.outputs['build_job.build_job.getCommitMessage.commitMessage'], 'import/')

关于这个奇怪问题的几点:

  • 使用阶段变量的语法对于在条件中使用它和使用它作为另一个变量传入是不同的。
  • 同样,如果源阶段是作业,则语法是不同的,而如果源阶段是部署作业,则语法是不同的。
  • 最重要的是,我在 MS 文档的任何地方都找不到正确的语法。
  • 例如,我找不到任何诊断问题的方法:在构建日志中查看阶段输出 json 真的很有帮助。
  • 最后,我相信 Azure DevOps 团队真的把这个功能搞砸了。作业/部署作业、条件和变量分配的语法应该是一致的。在这种状态下真的很痛苦。
4

3 回答 3

1

在一个阶段,要引用另一个阶段的输出变量,您应该使用以下表达式格式:

  • 在阶段级别,从另一个阶段引用输出变量的格式是dependencies.STAGE.outputs['JOB.TASK.VARIABLE'].
  • 在作业级别,从另一个阶段引用输出变量的格式是stageDependencies.STAGE.JOB.outputs['TASK.VARIABLE'].

更多细节可以查看文档“在不同阶段使用输出”。

此外,在一个阶段,如果您使用另一个阶段的输出设置阶段级变量,您应该使用格式stageDependencies.STAGE.JOB.outputs['TASK.VARIABLE']而不是dependencies.STAGE.outputs['JOB.TASK.VARIABLE']. 请参阅此文档

在此处输入图像描述

下面是一个示例作为参考:

  1. 天蓝色管道.yml
parameters:
- name: RunStgB
  type: string
  default: YesRun
  values:
  - YesRun
  - NoRun

stages:
- stage: A
  displayName: 'Stage A'
  pool:
    vmImage: ubuntu-latest
  jobs:
  - job: A1
    displayName: 'Job A1'
    steps:
    - task: Bash@3
      name: setOutput
      displayName: 'Set output variable'
      inputs:
        targetType: inline
        script: |
          echo "parameters.RunStgB = ${{ parameters.RunStgB }}"
          echo "##vso[task.setvariable variable=RunStgB;isoutput=true]${{ parameters.RunStgB }}"

- stage: B
  displayName: 'Stage B'
  dependsOn: A
  condition: eq(dependencies.A.outputs['A1.setOutput.RunStgB'], 'YesRun')
  variables:
  - name: Output_RunStgB
    value: $[ stageDependencies.A.A1.outputs['setOutput.RunStgB'] ]
  pool:
    vmImage: ubuntu-latest
  jobs:
  - job: B1
    displayName: 'Job B1'
    steps:
    - task: Bash@3
      displayName: 'show output variable'
      inputs:
        targetType: inline
        script: echo "Output_RunStgB = $(Output_RunStgB)"
  1. 结果。

    在此处输入图像描述

    在此处输入图像描述

于 2022-03-02T09:37:26.350 回答
0

我为此提出了一个 MS 支持案例并得到了解决方案。正确的语法是

condition: contains(dependencies.build.outputs['build_job.build_job.getCommitMessage.commitMessage'], 'import/')

我也用答案更新了原始问题。

于 2022-03-03T06:33:11.927 回答
0

如此处所述:https ://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops#dependencies我认为你的情况不是这个

condition: contains(stageDependencies.build.build_job.outputs['build_job.getCommitMessage.commitMessage'], 'import/')

应该是这样的:

condition: contains(dependencies.build.outputs['build_job.getCommitMessage.commitMessage'], 'import/')
于 2022-03-02T06:35:28.243 回答