来自变量模板的 Azure Pipelines 参数值

Azure Pipelines parameter value from variable template

我们希望将我们应用程序的组件部署到开发人员的本地机器上,并希望它对我们的同事来说足够容易使用,对我们来说也足够容易维护。这些是具有特定命名约定的虚拟机,例如:VM001、VM002 等。

我可以定义这些机器,稍后在管道中使用该值,在 YAML 中的参数中,如下所示:

parameters:
  - name: stage
    displayName: Stage
    type: string
    values:
      - VM001
      - VM002
      - And so on...

然后我只需要维护一个舞台,因为唯一真正不同的是舞台名称:

stages:
  - stage: ${{ parameters.stage }}
    displayName: Deploy on ${{ parameters.stage }}
  - jobs:
    ...

像这样在参数中定义机器背后的想法是,当开发人员想要部署到他们自己的虚拟机时,他们可以从 'Stage' 下拉列表中选择他们的虚拟机。通过将参数值设置为虚拟机,阶段被命名,正确的库组也将链接到部署(每个开发人员都有自己的库组,我们在其中存储变量,例如帐户和秘密)。

但是,我们有多个组件通过多个管道部署。所以每个组件都有自己的 YAML 管道,对于每个管道,我们必须输入和维护相同的虚拟机列表。

我们已经使用变量和作业模板来实现可重用性。我想找到一种方法来创建一个包含机器列表的模板并将其传递给参数值。这样一来,我们只需要维护一个模板,这样每当有新人加入团队或有人离开时,我们只需要更新一个文件,而不是更新所有的管道。

我尝试使用如下表达式将模板传递给参数值:

variables:
  - name: VirtualMachinesList
    value: VirtualMachinesList.yml

parameters:
  - name: stage
    displayName: Stage
    type: string
    values:
      - ${{ variables.VirtualMachinesList }}

VirtualMachinesList.yml 看起来像这样:

variables:
  - name: VM001
    value: VM001
  - name: VM002
    value: VM002
  - And so on...

当我尝试 运行 管道时出现以下错误: A template expression is not allowed in this context

我也尝试过将参数类型更改为对象。这会产生一个包含所有虚拟机列表的文本字段,您可以 select 那些您不想部署的虚拟机并删除它们。这对用户来说不是很友好,也很容易出错,因此不是一个非常理想的解决方案。

有没有办法从一个位置将虚拟机列表传递给参数值,以便开发人员可以选择自己的虚拟机进行部署?

你真的很接近。您需要将您使用变量模板的方式更新为:

variables:
   - template: variable-template.yml

这是一个工作示例(假设变量模板和消费管道都在存储库的同一目录中):

变量-template.yml:

variables:
  - name: VM001
    value: VM001
  - name: VM002
    value: VM002

示例-pipeline.yml:

name: Whosebug-Example-Variables
trigger:
    - none
variables:
   - template: variable-template.yml
stages:
    - stage: StageA
      displayName: "Stage A"
      jobs:
        - job: output_message_job
          displayName: "Output Message Job"
          pool:
            vmImage: "ubuntu-latest"
          steps:
            - powershell: |
                Write-Host "Root Variable: $(VM001), $(VM002)"

作为参考,这里是关于变量模板用法的 MS 文档:

我知道您想在一个地方维护虚拟机列表,同时保留开发人员可以从下拉列表中选择要部署到的虚拟机的功能。但恐怕目前无法完成。运行时参数尚不支持模板。您可以就此问题提交用户意见here

目前你只能保留一个功能,要么在一个地方维护虚拟机,要么开发者可以从下拉列表中选择他们的虚拟机。

1、在一处维护虚拟机。您可以定义一个变量模板来保存虚拟机。并让开发人员键入要部署到的虚拟机。见下文:

定义一个空的运行时参数让开发者输入。

parameters:
- name: vm
  type: string
  default:

定义变量模板来保存 VMS

#variable.yml template
variables:
  vm1: vm1
  vm2: vm2
  ...

然后在管道中定义一个变量来引用变量模板中的vm变量。见下文

variables: 
- template: variables.yml
- name: vmname
  value: $[variables.${{parameters.vm}}]

steps:
- powerhsell: echo $(vmname)

2,让开发者可以方便的从下拉列表中选择他们的虚拟机。您必须在所有管道中定义这些机器参数。