Azure devops Azure Devops-在作业模板之间传递变量
Azure DevOps yaml中的正常(非模板)作业支持作业间变量传递,如下所示:Azure devops Azure Devops-在作业模板之间传递变量,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,Azure DevOps yaml中的正常(非模板)作业支持作业间变量传递,如下所示: jobs: - job: A steps: - script: "echo ##vso[task.setvariable variable=skipsubsequent;isOutput=true]false" name: printvar - job: B condition: and(succeeded(), ne(dependencies.A.outputs['printvar.s
jobs:
- job: A
steps:
- script: "echo ##vso[task.setvariable variable=skipsubsequent;isOutput=true]false"
name: printvar
- job: B
condition: and(succeeded(), ne(dependencies.A.outputs['printvar.skipsubsequent'], 'true'))
dependsOn: A
steps:
- script: echo hello from B
考虑到模板不支持dependsOn
语法,我如何在下面做类似的事情?我需要从第一个模板获得一个输出,并将其作为“environmentSlice”传递给第二个模板
- stage: Deploy
displayName: Deploy stage
jobs:
- template: build-templates/get-environment-slice.yml@templates
parameters:
configFileLocation: 'config/config.json'
- template: build-templates/node-app-deploy.yml@templates
parameters:
# Build agent VM image name
vmImageName: $(Common.BuildVmImage)
environmentPrefix: 'Dev'
environmentSlice: '-$(dependencies.GetEnvironmentSlice.outputs['getEnvironmentSlice.environmentSlice'])'
我希望将两个模板分开的原因是第二个模板是部署模板,我希望在第二个模板中命名环境时使用第一个模板的输入。即node-app-deploy.yml(第二个模板)的初始部分是:
更新:
接受的解决方案确实允许您在单独的模板之间传递变量,但不适用于我的特定用例。我希望能够动态命名第二个模板的“环境”部分,即环境:${{parameters.environmentPrefix}}${{parameters.environmentSlice}
,但这只能静态命名,因为模板是在管道启动时编译的
该解决方案的缺点是在模板之间引入了隐藏的耦合。我更希望调用管道协调在模板之间传递的参数。您可以将
依赖项和依赖项变量
应用到模板中
见以下示例:
为了让示例更清楚,这里有两个模板文件,一个是azure-pipeline-1.yml
,另一个是azure-pipeline-1-copy.yml
在azure-pipelines-1.yml中,将环境值指定为输出变量:
parameters:
environment: ''
jobs:
- job: preDeploy
variables:
EnvironmentName: preDeploy-${{ parameters.environment }}
steps:
- checkout: none
- pwsh: |
echo "##vso[task.setvariable variable=EnvironmentName;isOutput=true]$($env:ENVIRONMENTNAME)"
name: outputVars
jobs:
- job: deployment
dependsOn: preDeploy
variables:
EnvironmentNameCopy: $[dependencies.preDeploy.outputs['outputVars.EnvironmentName']]
steps:
- checkout: none
- pwsh: |
Write-Host "$(EnvironmentNameCopy)"
name: outputVars
然后,在azure-pipeline-1-copy.yml中,使用依赖项获取此输出变量:
parameters:
environment: ''
jobs:
- job: preDeploy
variables:
EnvironmentName: preDeploy-${{ parameters.environment }}
steps:
- checkout: none
- pwsh: |
echo "##vso[task.setvariable variable=EnvironmentName;isOutput=true]$($env:ENVIRONMENTNAME)"
name: outputVars
jobs:
- job: deployment
dependsOn: preDeploy
variables:
EnvironmentNameCopy: $[dependencies.preDeploy.outputs['outputVars.EnvironmentName']]
steps:
- checkout: none
- pwsh: |
Write-Host "$(EnvironmentNameCopy)"
name: outputVars
最后,在YAML管道中,只需传递环境值
stages:
- stage: deployQA
jobs:
- template: azure-pipelines-1.yml
parameters:
environment: FromTemplate1
- template: azure-pipeline-1-copy.yml
现在,您可以在第二个模板作业中看到值get successfully:
可以避免调用模板中的依赖关系。但是,正如OP所说,无法动态创建环境名称
下面是一个“调用”模板的示例,它首先调用另一个模板(devops variables.yml),该模板设置我们希望在以后的模板(devops callee.yml)中使用的一些环境变量:
在devops-variables.yml文件中,我有:
"##vso[task.setvariable variable=SomeParameter;isOutput=true;]Wibble"
然后,在“devops callee.yml”中,我只是这样使用它:
parameters:
- name: SomeParameter
default: ''
jobs:
- deployment: 'Called_Job'
condition: succeeded()
displayName: 'Called Job'
environment: "Development"
pool:
vmImage: 'windows-2019'
dependsOn:
- Variables_Job
variables:
SomeParameter: ${{parameters.SomeParameter}}
strategy:
runOnce:
deploy:
steps:
- download: none
- task: AzureCLI@2
condition: succeeded()
displayName: 'An Echo Task'
inputs:
azureSubscription: "$(TheServiceConnection)"
scriptType: pscore
scriptLocation: inlineScript
inlineScript: |
echo "Before"
echo "$(SomeParameter)"
echo "After"
输出:
2021-04-10T09:22:29.6188535Z Before
2021-04-10T09:22:29.6196620Z Wibble
2021-04-10T09:22:29.6197124Z After
这样,被调用方就不会引用调用方。不幸的是,在被调用方中设置环境如下:
environment: "$(SomeParameter)"
不起作用-您将得到一个带有文字字符“$(SomeParameter)”的环境。嗨,Merlin,感谢您将这些放在一起。我没有意识到可以用不同的模板表达作业之间的依赖关系。缺点是模板之间存在隐藏的耦合。不幸的是,这个解决方案不适用于我的用例。模板的environment部分只能使用模板参数命名,因为它是在作业启动时而不是运行时编译的。很遗憾,因为我想动态命名我的环境,但似乎缺少该功能。我会将您的答案标记为已接受,并添加一条警告。我有类似的要求,在我的案例中是第一个模板规定环境,其中azure资源的名称是动态构造的。在稍后部署的模板应用程序中,需要传递动态构造的资源名称的输出。@Merlin提供的解决方案确实解决了这个问题,但是,它创建了一个隐藏的依赖项,最好避免这种依赖项。谢谢。将Azure文档链接到