【问题标题】:Dynamic variables not available in other stages of azure pipeline天蓝色管道的其他阶段不可用的动态变量
【发布时间】:2021-05-25 19:51:10
【问题描述】:

我是 azure 管道的新手,目前正在尝试将变量传递给以后的作业。这是当前的 sn-p,我正在尝试使用 maven 帮助从 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,它似乎正在工作。

【问题讨论】:

    标签: azure-devops azure-pipelines


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 是的,将单引号改为双引号就可以了。变量分配现在是 echo "##vso[task.setvariable variable=projectVersion;isOutput=true]$pomVersion"
    猜你喜欢
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    • 2020-08-23
    • 2021-11-01
    • 2020-05-19
    • 2020-01-27
    • 2021-04-24
    相关资源
    最近更新 更多