首页 > 解决方案 > 如何在 azure 管道中通过分支 AND 标签触发?

问题描述

我想创建一个天蓝色的管道,这样当我推送到分支(开发)标签(测试 *)时,管道将被触发。但是,当我在没有标签的情况下推送到分支(开发)时会触发管道,这表明在推送到(开发)分支时触发器正在执行(测试*)标签时正在执行。

例子:

trigger:
  branches:
    include:
      - develop
      - refs/tags/{test*}

仅当推送到 (develop) 分支也引用 (test*) 标签时,如何才能触发触发器?

标签: azure-devopsazure-pipelines

解决方案


根据关于触发器的文档

当您指定触发器时,它会替换默认的隐式触发器,并且只有推送到明确配置为包含的分支才会触发管道。首先处理包含,然后从该列表中删除排除。

我认为文档中缺少(或只是令人困惑)的是,满足给定部分(分支、路径、标签)中的任何 1 的项目都针对该部分列出,如果它们满足该部分的任何 1 exclude 子句,则将其删除。除非使用所有三个部分。然后以下注释适用:

如果您结合包含文件路径的分支过滤器指定标签,则如果满足分支过滤器并且满足标签路径过滤器,则触发器将触发。

概括

include:集合首先创建并excludes从该列表中删除。

部分是OR ed together (branches OR tags)(branches OR paths)除非使用了所有部分,否则它们是(branches AND (tags OR paths))

考虑到这一点:

如果您只想继续使用分支部分,则需要使用一个选项,从列表中删除所有不需要的分支,并且只明确包含标记 ref(像分支一样处理)。

包含标签并排除不需要的分支模式

trigger:
  branches:
    include:
    - refs/tags/test*
    exclude:
    # a list of the branches for which you don't want to trigger
    - master
    - features/*
    - bugs/*
    - hotfix/*

如果您不限于仅使用分支部分,那么使用所有 3 个部分将通过包括develop分支和test*标签但不包括所有路径来到达那里。

包括标签和期望的分支,但排除该分支上的所有路径

trigger:
  branches:
    include:
      - develop
  tags:
    include:
      - test*
  paths:
    exclude:
      - /*

第二个选项基本上shouldFire = (branch == develop && (tag == test* || false))相当于shouldFire = (branch == develop && tag == test*)


推荐阅读