尝试在两个部署作业之间传递变量,我无法使用 $(Environment.ResourceName),它仅在资源名称硬编码时才有效

Trying to pass a variable between two deployment job, I cannot use $(Environment.ResourceName), it only works if the resource name is hardcoded

提问人:FFMG 提问时间:11/16/2023 更新时间:11/17/2023 访问量:53

问:

我正在尝试在两个作业(部署)之间传递 Azure 部署中的变量。根据文档,当我使用时,我需要在标签中传递资源名称。runOnceresourceTypevariable:

资源名称是一个环境变量,$(Environment.ResourceName)

stages:
- stage: Stage
  jobs:
  - deployment: A
...
          steps:
          - bash: echo "##vso[task.setvariable variable=OutputVar;isOutput=true]$myVar"
            env:
              myVar: 'Hello World'
            name: printvar

  - deployment: B
...
  variables:
    Variable1: $[ dependencies.A.Outputs.['Deploy_$(Environment.ResourceName).printVar.OutputVar'] ]
    Variable2: $[ dependencies.A.Outputs.['Deploy_MyResourceName.printVar.OutputVar'] ]

...

但是当我运行上面的代码时,没有设置,但已正确设置。Variable1Variable2

所以,没有设置的原因是因为没有花费。Variable1$(Environment.ResourceName)

我还尝试输出 的值,并且该值正确设置为 ,(在上面的示例中)。$(Environment.ResourceName)MyResourceName

如何在不对脚本中的值进行硬编码的情况下传递$(Environment.ResourceName)?

azure-devops azure-pipelines-yaml

评论

0赞 Daniel Mann 11/17/2023
环境变量是什么意思?该变量在哪里定义?管道变量定义为环境变量,但环境变量不会自动导入为管道变量。Environment.ResourceName
0赞 FFMG 11/17/2023
不确定我是否理解您的问题,是部署变量。该值在获取时不能使用,但它是必需的,(在某些情况下),learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/...。它可以硬编码,但我想使用环境变量environment.resourceNamevariables:variables

答:

0赞 Ziyang Liu-MSFT 11/17/2023 #1

不能直接在作业 B 中使用。它是一个部署作业变量,范围限定为特定的部署作业,因此作业 B 中没有命名的此类变量。Environment.ResourceNameEnvironment.ResourceName

1赞 Kevin Lu-MSFT 11/20/2023 #2

从您的描述中,您需要使用嵌套变量:来获取上一个作业中的输出值。$[ dependencies.A.Outputs.['Deploy_$(Environment.ResourceName).printVar.OutputVar'] ]

恐怕Azure DevOps不支持嵌套变量。因此,变量 $(Environment.ResourceName) 无法按预期扩展。

如何在不对脚本中的值进行硬编码的情况下传递$(Environment.ResourceName)?

我建议您可以更改为使用参数将值传递给变量。

然后,您可以使用以下格式:$[ dependencies.A.outputs['${{parameters.name}}.setvarStep.myOutputVar'] ]

例如:

parameters:
  - name: MyResourceName
    type: string
    default: MyResourceName

pool:
  vmImage: windows-latest


stages:
- stage: Stage
  jobs:
  - deployment: A
...
          steps:
          - bash: echo "##vso[task.setvariable variable=OutputVar;isOutput=true]$myVar"
            env:
              myVar: 'Hello World'
            name: printvar

  - deployment: B
...
  variables:
    Variable1: $[ dependencies.A.Outputs.['Deploy_${{parameters.MyResourceName}}.printVar.OutputVar'] ]
    Variable2: $[ dependencies.A.Outputs.['Deploy_MyResourceName.printVar.OutputVar'] ]

评论

0赞 FFMG 11/20/2023
谢谢,这现在可以用作解决方案,理想情况下,我会将默认值设置为,但不知道何时创建版本。default: $(Environment.ResourceName)
0赞 Kevin Lu-MSFT 11/20/2023
我完全可以理解您的要求。但该值也需要在编译时设置。$(Environment.ResourceName) 将在运行时展开。恐怕无法实现。
1赞 Kevin Lu-MSFT 11/20/2023
如果不想对值进行硬编码,则 parameter 是最佳方法。