vip*_*pes 6 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.skipsubsequent'], 'true'))
dependsOn: A
steps:
- script: echo hello from B
Run Code Online (Sandbox Code Playgroud)
考虑到模板不支持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'])'
Run Code Online (Sandbox Code Playgroud)
我希望将两个模板分开的原因是第二个模板是部署模板,我希望在命名第二个模板中的环境时从第一个模板输入。即 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 }}
Run Code Online (Sandbox Code Playgroud)
更新:
接受的解决方案确实允许您在单独的模板之间传递变量,但不适用于我的特定用例。我希望能够动态environment: ${{ parameters.environmentPrefix }}${{ parameters.environmentSlice }}命名第二个模板的“环境”部分,即,但这只能静态命名,因为模板是在管道启动时编译的。
该解决方案的缺点是它在模板之间引入了隐藏的耦合。我更喜欢调用管道来协调模板之间的参数传递。
您可以将depend on和应用于dependency variable模板。
请参阅下面的示例:
\n\n为了让示例更清楚,这里有2个模板文件,一个是azure-pipelines-1.yml,另一个是azure-pipeline-1-copy.yml.
在azure-pipelines-1.yml中,指定环境值作为输出变量:
\n\nparameters:\n\xc2\xa0\xc2\xa0environment:\xc2\xa0\'\'\njobs:\n-\xc2\xa0job:\xc2\xa0preDeploy\n\xc2\xa0\xc2\xa0variables:\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0EnvironmentName:\xc2\xa0preDeploy-${{\xc2\xa0parameters.environment\xc2\xa0}}\n\xc2\xa0\xc2\xa0steps:\n\xc2\xa0\xc2\xa0-\xc2\xa0checkout:\xc2\xa0none\n\xc2\xa0\xc2\xa0-\xc2\xa0pwsh:\xc2\xa0|\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0echo\xc2\xa0"##vso[task.setvariable\xc2\xa0variable=EnvironmentName;isOutput=true]$($env:ENVIRONMENTNAME)"\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0name:\xc2\xa0outputVars\nRun Code Online (Sandbox Code Playgroud)\n\n然后,在azure-pipeline-1-copy.yml中使用依赖项来获取此输出变量:
\n\njobs:\n-\xc2\xa0job:\xc2\xa0deployment\n\xc2\xa0\xc2\xa0dependsOn:\xc2\xa0preDeploy\n\xc2\xa0\xc2\xa0variables:\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0EnvironmentNameCopy:\xc2\xa0$[dependencies.preDeploy.outputs[\'outputVars.EnvironmentName\']]\n\xc2\xa0\xc2\xa0steps:\n\xc2\xa0\xc2\xa0-\xc2\xa0checkout:\xc2\xa0none\n\xc2\xa0\xc2\xa0-\xc2\xa0pwsh:\xc2\xa0|\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Write-Host\xc2\xa0"$(EnvironmentNameCopy)"\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0name:\xc2\xa0outputVars\nRun Code Online (Sandbox Code Playgroud)\n\n最后,在YAML pipeline中,只需要传递环境值
\n\nstages:\n\xc2\xa0\xc2\xa0-\xc2\xa0stage:\xc2\xa0deployQA\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0jobs:\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0-\xc2\xa0template:\xc2\xa0azure-pipelines-1.yml\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0parameters:\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0environment:\xc2\xa0FromTemplate1\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0-\xc2\xa0template:\xc2\xa0azure-pipeline-1-copy.yml\nRun Code Online (Sandbox Code Playgroud)\n\n现在,您可以看到第二个模板作业中成功获取了值:
\n\n\n| 归档时间: |
|
| 查看次数: |
5993 次 |
| 最近记录: |