Azure DevOps Pipeline 在部署中定义变量并在后续作业中重用
Azure DevOps Pipeline define variable in deployment and reuse in subsequent job
我正在使用 Azure DevOps 管道部署我的代码,现在我需要将变量值从部署作业传递到依赖它的后续作业。我已经阅读了 this example 但它似乎根本不起作用。
我想要做的是 运行 一个 Azure ARM 部署,它提供了一个 Key Vault。 Key Vault 的名称是从 ARM 部署作业输出的,然后我试图将该名称传递给另一个需要添加特定机密的作业。访问控制已经处理好了,但我仍然需要传递名称。
我已将问题归结为将变量从 deployment
传递到 job
的基础知识。这是我完整的测试管道(几乎完全从 here 复制):
trigger: none
stages:
- stage: X
jobs:
- deployment: A
pool:
vmImage: "ubuntu-16.04"
environment: test
strategy:
runOnce:
deploy:
steps:
- script: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the deployment variable value"
name: setvarStep
- script: echo $(setvarStep.myOutputVar)
name: echovar
- job: B
dependsOn: A
pool:
vmImage: "ubuntu-16.04"
variables:
myVarFromDeploymentJob: $[ dependencies.A.outputs['deploy.setvarStep.myOutputVar'] ]
steps:
- script: "echo $(myVarFromDeploymentJob)"
name: echovar
一旦我 运行 这个回显值在作业 B
中为空,但在部署 A
中定义。为什么是这样?有没有办法把 dependencies.A.outputs
中的所有东西都弄脏,这样我就可以看到我必须使用的东西?
如何将变量从 runOnce
部署作业传递到常规作业?
我已经解决了。问题是文档 here 指定此架构用于获取 runOnce
部署的变量:
$[dependencies.<job-name>.outputs['<lifecycle-hookname>.<step-name>.<variable-name>']]
这实际上是错误的。 <lifecycle-hookname>
参数应替换为部署名称,如下所示:
$[dependencies.<job-name>.outputs['<job-name>.<step-name>.<variable-name>']]
this documentation 中的示例(向下滚动一点)是正确的。
我测试过并有效的完整示例管道:
trigger: none
stages:
- stage: X
jobs:
- deployment: A # This name is important
pool:
vmImage: 'ubuntu-16.04'
environment: staging
strategy:
runOnce:
deploy:
steps:
- script: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the deployment variable value"
name: setvarStep # This name is also important
- script: echo $(setvarStep.myOutputVar)
name: echovar
- job: B
dependsOn: A
pool:
vmImage: 'ubuntu-16.04'
variables:
myVarFromDeploymentJob: $[ dependencies.A.outputs['A.setvarStep.myOutputVar'] ]
steps:
- script: "echo $(myVarFromDeploymentJob)"
name: echovar
我正在使用 Azure DevOps 管道部署我的代码,现在我需要将变量值从部署作业传递到依赖它的后续作业。我已经阅读了 this example 但它似乎根本不起作用。
我想要做的是 运行 一个 Azure ARM 部署,它提供了一个 Key Vault。 Key Vault 的名称是从 ARM 部署作业输出的,然后我试图将该名称传递给另一个需要添加特定机密的作业。访问控制已经处理好了,但我仍然需要传递名称。
我已将问题归结为将变量从 deployment
传递到 job
的基础知识。这是我完整的测试管道(几乎完全从 here 复制):
trigger: none
stages:
- stage: X
jobs:
- deployment: A
pool:
vmImage: "ubuntu-16.04"
environment: test
strategy:
runOnce:
deploy:
steps:
- script: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the deployment variable value"
name: setvarStep
- script: echo $(setvarStep.myOutputVar)
name: echovar
- job: B
dependsOn: A
pool:
vmImage: "ubuntu-16.04"
variables:
myVarFromDeploymentJob: $[ dependencies.A.outputs['deploy.setvarStep.myOutputVar'] ]
steps:
- script: "echo $(myVarFromDeploymentJob)"
name: echovar
一旦我 运行 这个回显值在作业 B
中为空,但在部署 A
中定义。为什么是这样?有没有办法把 dependencies.A.outputs
中的所有东西都弄脏,这样我就可以看到我必须使用的东西?
如何将变量从 runOnce
部署作业传递到常规作业?
我已经解决了。问题是文档 here 指定此架构用于获取 runOnce
部署的变量:
$[dependencies.<job-name>.outputs['<lifecycle-hookname>.<step-name>.<variable-name>']]
这实际上是错误的。 <lifecycle-hookname>
参数应替换为部署名称,如下所示:
$[dependencies.<job-name>.outputs['<job-name>.<step-name>.<variable-name>']]
this documentation 中的示例(向下滚动一点)是正确的。
我测试过并有效的完整示例管道:
trigger: none
stages:
- stage: X
jobs:
- deployment: A # This name is important
pool:
vmImage: 'ubuntu-16.04'
environment: staging
strategy:
runOnce:
deploy:
steps:
- script: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the deployment variable value"
name: setvarStep # This name is also important
- script: echo $(setvarStep.myOutputVar)
name: echovar
- job: B
dependsOn: A
pool:
vmImage: 'ubuntu-16.04'
variables:
myVarFromDeploymentJob: $[ dependencies.A.outputs['A.setvarStep.myOutputVar'] ]
steps:
- script: "echo $(myVarFromDeploymentJob)"
name: echovar