在 azure devops 管道中重新使用 YAML 序列

Re-use YAML sequence inside azure devops pipelines

我想在多个部署中重复使用服务器列表。我在某些模板中所做的简化版本 deploy-tasks.yml:

parameters:
- name: servers
  type: object

- ${{ each server in parameters.servers }}:
  - task: CopyFiles@2
    inputs:
      sourceFolder: ${{parameters.sourceFolder}}
      targetFolder: '\${{server}}\some-path'
      cleanTargetFolder: true

然后我就可以在这个 pipeline.yml

中使用它
steps:
- checkout: self
- template: deploy-tasks.yml
  parameters: 
    servers:
    # How can I define this list somewhere else?!
    - server1
    - server2
    sourceFolder: '$(Build.SourcesDirectory)\something'

到目前为止它有效:但我想提取常用的服务器列表。所以像 infra.yml:

my-production-webservers:
- production1
- production2

然后类似(但这不起作用):

steps:
- checkout: self
- template: deploy-tasks.yml
  parameters: 
    servers:
    !!! something that includes my-production-webservers !!!
    sourceFolder: '$(Build.SourcesDirectory)\something'

变量在这种情况下不起作用,因为它们只是字符串。我错过了什么技巧?

恐怕没有这样的方法可以满足您的要求。

正如你所说,变量是字符串类型。因此变量无法将值列表传递给对象类型参数。

模板中只定义参数是无效的,因为主yaml中的parameters字段不能引用模板

因此您不能在yaml模板中只保存参数值。您需要在模板中添加额外的步骤。

解决方法:

您可以尝试以下示例:它不是纯参数。需要引用deploy-tasks.yml file

部署-tasks.yml

parameters:
  - name: servers
    type: object
    default: []

steps:
 - ${{ each server in parameters.servers}}:
    - script: echo ${{ server }}

infra.yml

parameters:
  - name: buildTemplate
    type: string
    default: ""

steps:
- template: ${{parameters.buildTemplate}}
  parameters:
    servers:
      - Server1
      - Server2
      - Server3

pipeline.yml

trigger:
- none

pool:
  vmImage: ubuntu-latest

steps:
- template: infra.yml
  parameters:
    buildTemplate: deploy-tasks.yml