Azure DevOps - 使用参数在 yaml 管道定义中设置路径触发器

Posted

技术标签:

【中文标题】Azure DevOps - 使用参数在 yaml 管道定义中设置路径触发器【英文标题】:Azure DevOps - Use parameter to set path trigger in yaml pipeline definition 【发布时间】:2022-01-17 18:08:25 【问题描述】:

我想使用 yaml 模板设置 Azure 管道。我挣扎的是路径触发定义。我希望启动各个管道,前提是它们实际上与早期版本不同。

core.yaml 是一个通用模板,用于不同的项目。

parameters:
- name: projectPath
  type: string

trigger:
  branches:
    include:
    - master
    - feature/*
  paths:
    include: 
    - $ parameters.projectPath  # this is the problematic part

steps:
  ... # restore, build, test, etc tasks are defined here

build.yaml 文件是为每个项目定义的。它们仅在 core.yaml 上扩展并提供 所需参数:

extends:
  template: core.yaml
  parameters:
    projectPath: src/project1

使用值$ parameters.projectPath 失败,因为“给定上下文中不允许模板表达式”。如果我用引号括起来也会发生同样的情况。

使用值$(parameters.projectPath) 有效,但即使我更改定义路径之外的文件也会触发。

我也尝试使用实际值而不是参数(例如“src/project1”),但它也会触发每次更改,即使我只触摸文件“src/project2/foo.md”。

我看到的示例没有在模板中使用触发器。但通常情况下,当我放错节点时触发管道(例如意外值)时会出现语法错误。所以这只是我的期望,它应该可以工作。

有什么建议吗?

【问题讨论】:

老实说,听起来你很清楚——你不能在那种情况下使用模板表达式。我想您需要将触发器放在每个单独的管道中,而不是放在模板中。 @VinceBowdren 正确,这也是我的结论,但我希望我只是忽略了一些东西。因为这样我需要将“触发器”块复制并粘贴到一堆 yaml 文件中,而不仅仅是将其添加到模板中。 【参考方案1】:

这是不可能的,因为这部分

trigger:
  branches:
    include:
    - master
    - feature/*
  paths:
    include: 
    - $ parameters.projectPath  # this is the problematic part

需要在编译时知道,但您提供在运行时评估的参数。

$(parameters.projectPath)这个语法没有任何意义,可能会被评估为空值,然后所有内容都包含在触发器中。

【讨论】:

我尝试使用实际值(而不是参数),但还是不行。

以上是关于Azure DevOps - 使用参数在 yaml 管道定义中设置路径触发器的主要内容,如果未能解决你的问题,请参考以下文章

Azure DevOps 中的多个 YAML 构建管道

请参阅使用 YAML 管道在 Azure DevOps 中构建工件

Azure DevOps、YAML 发布管道? [关闭]

如何在 azure devops 中解析 yaml 文件

有没有办法从 Azure DevOps YAML 读取文件?

是否可以在资源的 ref 属性中使用变量:Azure DevOps YAML 的存储库?