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.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'])'
我希望将两个模板分开的原因是第二个模板是部署模板,我希望在命名第二个模板中的环境时从第一个模板输入。 IE。 node-app-deploy.yml(第二个模板)的初始部分是:
jobs:
- deployment: Deploy
displayName: Deploy
# Because we use the environmentSlice to name the environment, we have to have it passed in rather than
# extracting it from the config file in steps below
environment: ${{ parameters.environmentPrefix }}${{ parameters.environmentSlice }}
更新:
接受的解决方案确实允许您在单独的模板之间传递变量,但不适用于我的特定用例。我希望能够动态命名第二个模板的“环境”部分,即
environment: ${{ parameters.environmentPrefix }}${{ parameters.environmentSlice }}
,但这只能静态命名,因为模板是在管道启动时编译的。该解决方案的缺点是它在模板之间引入了隐藏的耦合。我更喜欢调用管道来协调模板之间的参数传递。
最佳答案
您可以申请 depend on
和 dependency variable
成模板。
请参阅以下示例:
为了让示例更清楚,这里有2个模板文件,一个是azure-pipelines-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
然后,在 azure-pipeline-1-copy.yml 使用依赖来获取这个输出变量:
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
现在,您可以在第二个模板作业中看到该值成功获取:
关于azure-devops - Azure Devops - 在作业模板之间传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59038584/