Azure DevOps yaml 使用“##vso[task.setvariable”传递变量不起作用

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

在下面的 yaml 阶段(下面给出的代码),我尝试将参数 envList 转换为特定的环境名称。 例如envList =“NameDevEnv、NameQAEnv、NameStageEnv、NameProdEnv”

我试图将 NameDevEnv、NameQAEnv、NameStageEnv 和 NameProdEnv 传递给 yaml 中的单独变量/参数,然后将这些名称传递给模板,以便使用给定名称创建这些环境。

以下代码未打印变量一的正确值。即我期待最后一条语句 echo $(one) 打印 NameDevEnv。

请建议/协助。 谢谢

stages:
  - stage: preWork
    jobs: 
     - job: convert_input
       continueOnError: false
       steps: 
         - script: |
              htring="${{parameters.envlist}}"
              echo $htring
              IFS=', ' read -r -a array <<< "$htring"
              echo "${array[0]}"
              htringz="${array[0]}"
              
              echo ${{ variables.one }} # outputs initialValue
              echo $(one)
              echo $htringz
             ## $htringz = $htring.split(",")[0]
           displayName: first vairable pass
         - bash: echo "##vso[task.setvariable variable=one;isOutput=true;]$htringz"
           displayName: set new variable value
         - script: |
               echo ${{ variables.one }} # outputs initialValue
               echo $(one)
azure-pipelines azure-pipelines-yaml
2个回答
4
投票

您在任务“第一个变量传递”中设置 htringz 的值,并在另一个任务“设置新变量值”中使用该值,一旦任务更改,该任务的局部变量就不会转移到另一个任务。 如果您想将值设置为变量一,请在同一任务中执行此操作。

我使用的阶段作为示例,使用 bash 而不是脚本,因为我更喜欢使用 bash 来执行 echo 之类的语句。

stages:
  - stage: preWork
    jobs: 
     - job: convert_input
       continueOnError: false
       steps: 
         - bash: |
              htringz="Test"
              echo "##vso[task.setvariable variable=one]$htringz"
           displayName: first vairable pass
         - bash: echo $(one)

输出

另一个阶段,具有用于获取值的单独任务和用于设置值的单独任务

stages:
  - stage: preWork
    jobs: 
     - job: convert_input
       continueOnError: false
       steps: 
         - bash: |
              htringz="Test"
           displayName: first vairable pass
         - bash: |
               echo $htringz
               echo "##vso[task.setvariable variable=one]$htringz"
               echo "=================="
               echo $(one)

输出

因此,只需在同一任务中设置该值即可。 希望这个回答对您有帮助。


0
投票

正如 Microsoft 文档 指出的那样,在任务之间传递变量需要在变量上设置

isOutput=true
参数。他们没有真正解释的是这在后续任务中如何显示在 bash 中。有两个要点:

  1. 您必须为设置变量的任务指定名称,例如
    name: FOO
  2. bash 任务用下划线替换通常出现在任务名称和变量名称之间的点。因此,在下面的示例中,您使用 bash 语法
    $(FOO.BAR)
    ,而不是
    ${FOO_BAR}
    (在 Powershell 中使用)。

示例:

- task: Bash@3
  name: FOO
  displayName: Set a variable for passing between tasks.
  inputs:
    targetType: inline
    script: |
      #!/bin/bash
      echo "##vso[task.setvariable variable=BAR;isOutput=true]foobar"

- task: Bash@3
  displayName: Use a variable in another task.
  inputs:
    targetType: inline
    script: |
      #!/bin/bash
      echo "\${FOO_BAR} is '${FOO_BAR}'"

示例将输出:

${FOO_BAR} is 'foobar'
© www.soinside.com 2019 - 2024. All rights reserved.