Azure DevOps管道-从阶段调用yaml模板



我一直在尝试实现按照这篇博客文章

我已经创建了一个模板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">

如果你要从你的当前模板中删除这些元素,你可以使用它作为一个阶段模板。

最新更新