在 Azure Pipeline YAML 文件的顶层包含模板

Include template at top level in Azure Pipeline YAML file

The documentation 建议应该有一种方法可以获取 Azure Pipeline YAML 模板并将它们粘贴到不同的 Azure Pipeline YAML 文件中。但是,我找不到在顶层执行此操作的方法。我该怎么做?

为了给出一个用例,我有一个名为 deployment-environment.yml 的 YAML 模板,它定义了一个部署环境参数,并使用这个参数来决定实际的部署环境。我想将其包含在多个管道中(例如 azure-pipeline.yml 此处)以避免代码重复。

我在我的主要管道 YAML 文件中想象如下内容:

# azure-pipeline.yml
includes:
- template: deployment-environment.yml

使用以下 YAML 模板:

# deployment-environment.yml
parameters:
- name: deploymentEnvironmentSetting
  type: string
  default: auto
  values:
  - auto
  - none
  - dev
  - test
  - prod

variables:
- name: deploymentEnvironment
  ${{ if ne(parameters.deploymentEnvironmentSetting, 'auto') }}:
    value: ${{ parameters.deploymentEnvironmentSetting }}
  ${{ elseif eq(variables['Build.BuildSourceBranchName'], 'development') }}:
    value: dev
  ${{ elseif eq(variables['Build.BuildSourceBranchName'], 'test') }}:
    value: test
  ${{ elseif eq(variables['Build.BuildSourceBranchName'], 'main') }}:
    value: prod
  ${{ else }}:
    value: none

这样用户就可以使用 Azure DevOps GUI 手动覆盖部署环境,如 this image 所示。

非常感谢您的帮助!

我测试了一下,似乎 'just' 插入模板和使用关键字 'extends' 都不需要传播其参数 到顶级 yaml 文件,因此 UI 不显示用于选择其中之一的框。

不幸的是,我认为目前实现它的唯一方法是通过添加具有允许值的关键字来复制 'parameters' 在 azure-pipeline.yml 之上,然后将提供的值传递给 deployment-environment.yml.

管道架构中没有 includes 关键字。该文档概述了您可以插入 模板 以供 Stage, Job or Step 重用。

stages:
- template: stages.yml
jobs:
- template: deployment-job.yml
steps:
- template: download-pipeline-artifact-steps.yml

有助于理解azure-pipeline yaml有一个schema并且定义了template关键字:

还有一个 extends keyword that allows you to describe the pipeline in one file and pass in arguments. The documentation 列出了执行上述操作的示例。

# File: start.yml
parameters:
- name: environmentName
  type: string
  default: auto

variables:
- ${{ if ne(parameters.environmentName, 'auto'):
  - name: environmentName
    value: ${{ parameters.environmentName }}

  ${{ elseif eq(variables['Build.BuildSourceBranchName'], 'development') }}:
  - name: environmentName
    value: dev

  ${{ elseif eq(variables['Build.BuildSourceBranchName'], 'test') }}:
  - name: environmentName
    value: test

  ${{ elseif eq(variables['Build.BuildSourceBranchName'], 'main') }}:
  - name: environmentName
    value: prod

  ${{ else }}:
  - name: environmentName
    value: none

stages:
- stage: build
  pool:
    vmImage: windows-latest
  jobs:
  - job: ci
    steps:
    - script: deploy to $(environmentName)
# pipeline.yml

trigger:
- main

parameters:
- name: deploymentEnvironmentSetting
  type: string
  default: auto
  values:
  - auto
  - none
  - dev
  - test
  - prod

extends:
  template: start.yml
  parameters:
     environment: ${{ parameters.deploymentEnvironmentSetting }}