动态变量在 azure 管道的其他阶段不可用

时间:2021-02-23 14:16:00

标签: azure-devops azure-pipelines

我是 azure 管道的新手,目前正在试验将变量传递给以后的作业。这是当前的片段,我尝试使用 maven help:evaluate plugin 从 pom 文件中提取项目版本。 pomVersion 变量已填充,但无法通过 projectVersionDynamic 变量在第二个作业的同一步骤或后续步骤中使用。

stages:
  - stage: FirstStage
    jobs:
      - job: FirstJob
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - task: Bash@3
            inputs:
              targetType: 'inline'
              script: |
                pomVersion=`mvn help:evaluate -Dexpression=project.version -q -DforceStdout`
                echo $pomVersion ##Prints semantic version 2.27.0-SNAPSHOT
                echo '##vso[task.setvariable variable=projectVersionDynamic;isOutput=true]$pomVersion'
                echo '##vso[task.setvariable variable=projectVersionStatic;isOutput=true]2.27.0'
                echo $(Task1.projectVersionDynamic) ##Error message
                echo $projectVersionDynamic ##Is empty
            name: Task1
            displayName: Task1 in JobOne of FirstStage
      - job: SecondJob
        dependsOn: FirstJob
        variables:
          DynVar: $[ dependencies.FirstJob.outputs['Task1.projectVersionDynamic'] ]
          StaVar: $[ dependencies.FirstJob.outputs['Task1.projectVersionStatic'] ]
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - task: Bash@3
            inputs:
              targetType: 'inline'
              script: |
                echo 'SecondJob'
                echo $(DynVar) ##Is empty
                echo $DynVar  ##Is empty
                echo $(StaVar) ##Prints 2.27.0
                echo $StaVar  ##Is empty
            displayName: Task in JobTwo of FirstStage

观察:projectVersionDynamic 值未填充,并且在同一任务或后续任务中或以后的作业/阶段中不可用。但是,静态变量在 projectVersionStatic 中填充,没有任何问题。

是否可以在 azure 管道中为用户定义的变量设置动态值,还是我做错了什么?我在 Stages 部分看到一个示例 here,它似乎正在运行。

1 个答案:

答案 0 :(得分:0)

Azure Pipelines 中的变量有时非常棘手。文档并不总是清楚地说明它应该如何工作。看看你的例子,一组观察:

  1. echo '##vso[task.setvariable variable=projectVersionDynamic;isOutput=true]$pomVersion' - 您的单引号需要是双引号才能将 $pomVersion 的值扩展到 echo 语句中
  2. (这就是事情变得模糊的地方):task.setvariable 的目的是将价值观传达给其他任务或工作。来自文档:“这不会更新环境变量,但它确实使新变量可用于同一作业中的下游步骤。”

$variable 语法不起作用,因为 task.setVariable 不会注入运行环境 - 相反,它是管道的信号,用于捕获输出并将其存储起来以备后用。 $(variable) 语法将不起作用,因为它在作业开始之前展开,因此在这里捕获为时已晚。

如果您使用我在第 1) 点中关于双引号 task.setVariable 的建议,您应该会看到第二个作业中可用的值。