在下面的 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)
您在任务“第一个变量传递”中设置 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)
因此,只需在同一任务中设置该值即可。 希望这个回答对您有帮助。
正如 Microsoft 文档 指出的那样,在任务之间传递变量需要在变量上设置
isOutput=true
参数。他们没有真正解释的是这在后续任务中如何显示在 bash 中。有两个要点:
name: FOO
。$(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'