【问题标题】:Re-use YAML sequence inside azure devops pipelines在 azure devops 管道中重用 YAML 序列
【发布时间】:2021-03-15 09:47:37
【问题描述】:

我想在多个部署中重复使用服务器列表。我在某些模板中所做的简化版本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'

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

【问题讨论】:

标签: azure-devops yaml azure-devops-pipelines


【解决方案1】:

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

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

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

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

解决方法:

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

deploy-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
      

【讨论】:

  • 感谢您提供详细的示例,我对没有简单的解决方法感到有点失望,本来会很好的。我也尝试将其保存为逗号分隔的字符串,但没有拆分操作(并且有连接)。
  • 嗯。我正在尝试应用它,但缺点是你不能再在 deployTasks 中有真正的参数(你不能通过 infra.yml 解析它们)。
  • 嗨@Sunib。我完全可以理解你的要求。但是暂时没有这样的方法可以满足您的要求。因为参数字段不支持模板。有关支持的模板,请参阅此文档:docs.microsoft.com/en-us/azure/devops/pipelines/…
  • 在已有模板的基础上,我也测试了使用变量传值。但它无法将正确的值传递给对象类型参数。对于您的要求:我建议您可以在UserVoice Site 上提交建议票。希望以后有简单的方法
  • @Sunib。这张票有更新吗?如果答案可以给你一些帮助,你可以考虑接受它。谢谢
猜你喜欢
  • 2020-05-23
  • 2020-08-07
  • 2022-08-02
  • 2022-11-14
  • 2019-02-18
  • 2019-04-06
  • 1970-01-01
  • 2019-05-14
  • 2021-11-23
相关资源
最近更新 更多