我一直在尝试实现按照这篇博客文章
我已经创建了一个模板yaml,它接收环境名作为单个参数。
我想从使用阶段的yaml管道调用它。希望减少代码重复,使用外部调用管道yaml的想法非常简单。这是我为来电者准备的:
trigger: none
stages:
- stage: dev
jobs:
- job: dev
extends:
template: templates365-response.bicep.template.yml
parameters:
env: dev
- stage: test
jobs:
- job: test
extends:
template: templates365-response.bicep.template.yml
parameters:
env: test
我要调用的模板是:
name: Deploy Bicep files $(Build.BuildId)
parameters:
- name: env
type: string
variables:
location: "uksouth"
templateFile: "bicep/365Response.main.json"
pool:
vmImage: "windows-latest"
stages:
- stage: preDeploy
jobs:
- job: listFiles
displayName: List Files
pool:
vmImage: windows-2022
steps:
- powershell: echo $(Build.SourcesDirectory)
- powershell: Get-ChildItem -Path '$(System.DefaultWorkingDirectory)' -recurse
- job: scanWhatif
displayName: scan and run whatif
pool:
vmImage: windows-2022
steps:
- task: AzureCLI@2
displayName: Preview Bicep Changes
inputs:
azureSubscription: "subname-${{parameters.env}}"
scriptType: "bash"
scriptLocation: "inlineScript"
inlineScript: |
az --version
az deployment group what-if --resource-group rg-365Response-${{parameters.kbName}}-001
--template-file '$(System.DefaultWorkingDirectory)bicep365Response.main.bicep'
--parameters '$(System.DefaultWorkingDirectory)bicep365Response.parameters.${{parameters.kbName}}.json'
- stage: Deploy
displayName: Deploy stage
dependsOn: Build
condition: succeeded()
jobs:
- deployment: Deploy
environment: ${{ parameters.env }}
strategy:
runOnce:
deploy:
steps:
- task: AzureCLI@2
displayName: Deploy Bicep Changes
inputs:
azureSubscription: "subname-${{parameters.env}}"
scriptType: "bash"
scriptLocation: "inlineScript"
inlineScript: |
az deployment group create --resource-group rg-365Response-${{parameters.env}}-001
--template-file '$(System.DefaultWorkingDirectory)bicep365Response.main.bicep'
--parameters '$(System.DefaultWorkingDirectory)bicep365Response.parameters.${{parameters.env}}.json'
我似乎有调用模板错误的语法?
根据YAML模式,extends
关键字适用于pipelines
,而不是jobs
。extends关键字的作用是:
# pipeline.yml
trigger:
- main
# these are parameters you show to the user
parameters:
- name: parameter1
type: string
extends:
template: pipeline-template.yml
parameters:
parameter1: ${{ parameters.parameter1 }}
你想做的是创建一个舞台模板,但你描述的模板似乎是一个完整的管道。
你希望你的模板看起来像这样:
# template.yml
parameters:
- name: requiredParameter1
type: string
- name: optionalParameter1
type: string
default: 'default-value'
stages:
- stage: Deploy
jobs:
- job: preDeploy
pool:
vmImage: windows-2022
variables:
myVariable: '${{ parameters.optionalParameter }}'
otherVariable: '${{ parameters.requiredParameter }}'
steps:
...
- job: deploy
steps:
...
然后你可以这样使用它:
# pipeline.yml
trigger:
- main
stages:
- template: template.yml
parameters:
requiredParameter1: value
考虑模板的一个好方法是像一个include文件,但是它必须遵循模式。在编译时,它将模板展开为单个文件以供执行。
关于当前"模板"的几点注意事项:
- 变量仅在管道、阶段或作业中有效。因此,如果你正在创建一个模板,它们必须正确地作用域。
- "pool">
如果你要从你的当前模板中删除这些元素,你可以使用它作为一个阶段模板。