如何防止基于提交标签触发Azure DevOps构建管道?

时间:2019-03-18 15:25:58

标签: azure-devops azure-pipelines

我正在将Azure管道用于基于Github的项目。我建立了仅由带标签的提交触发的构建管道,以使其与每次提交时进行的每日自动构建分开。

我想从触发每日构建管道中排除带标签的提交。在Yaml脚本中这样做的正确方法是什么?

这是我所做的,没有成功。

根据this page上的Azure文档,据我所知,应该可以通过以下方式排除标签:

[Fact]
public async Task DeleteBygg_ExistingIdPassed_RemovesOneItem()
{        
    // Arrange
    var id = 1;
    _mockRepo.Setup(repo => repo.GetByggByIdAsync(id)).ReturnsAsync(new Bygg(){});
    _mockRepo.Setup(repo => repo.DeleteByggAsync(It.IsAny<Bygg>())).Returns(Task.CompletedTask);

    // Act
    await _controller.DeleteBygg(id);

    // Assert
    _mockRepo.Verify(repo => repo.DeleteByggAsync(It.IsAny<Bygg>()),Times.Once);
}

但是,这是行不通的,只会阻止构建管道在任何提交(无论是否带标签)上运行。

我也尝试过:

trigger:
  tags:
    exclude:
    - projectname_v*

但这显然不受支持,因为它会产生错误:

trigger:
  tags:
    include:
    - *
    exclude:
    - projectname_v*

我还尝试了文档页面上建议的替代语法:

/azure-pipelines.yml: (Line: 12, Col: 7, Idx: 220) - (Line: 12, Col: 8, Idx: 221): While scanning an anchor or alias, did not find expected alphabetic or numeric character.

以及带有/不带有花括号和通配符的变体,但都失败,并出现“意外值”或“输入字符串格式不正确”错误。

2 个答案:

答案 0 :(得分:0)

@ acasta69

我认为我找到了解决您问题的方法。我一直在做相反的情况,仅构建功能分支,并排除其他任何内容。

为此,请在azure-pipelines.yml上使用此yml代码段

resources:         
  repositories:
  - repository: myNetProject
    type: GitHub
    connection: myGitHubConnection
    source: wkrea/DockerHubImages
    trigger:
      batch: true
      branches:
        include:
        - releases/*
        exclude:
        - '*'
      paths:
        exclude:
        - README.md

我能够从以下版本构建DevOps

builds triggered succesfuly

  

如果该答案对您有用,请告知我并评论我的答案,以使其在下次有人需要帮助时更加轻松,因为DevOps Pipelines文档暂时还不清楚并令人困惑:'(

在这里您可以在releases分支上查看我最后一次提交的检查

enter image description here

答案 1 :(得分:0)

this page中记录了构建管道触发器的语法。
关于问题中暴露的内容,有几个细节值得强调:

  1. 有一个默认的隐式触发器,其中包括所有分支,并且会被任何用户定义的触发器覆盖。因此,不可能指定仅排除某些内容的触发器:这样做最终将不会包含任何内容,并且触发器将永远不会触发。
    这解释了为什么问题中显示的第一个代码片段不会触发任何内容。
  

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

  1. 默认的隐式触发器如下所示(请注意最后一行中的注释,该注释解释了问题中第二个代码段产生的错误):
trigger:  
  branches:  
    include:  
    - '*'  # must quote since "*" is a YAML reserved character; we want a string  

总结一下,一种正确的方法来将标记的提交排除在触发管道之外应该是问题的编辑部分所示的方法:

trigger:
  branches:
    include:
    - '*'
    exclude:
    - 'refs/tags/*'

或者,相当于:

trigger:
  branches:
    include:
    - '*'
  tags:
    exclude:
    - '*'

但是,这不能获得理想的效果。而是发生以下情况:

  • 按下不带标签的提交会触发管道
  • 仅按下标签不会触发管道
  • 按带标记的提交仍会触发管道

Azure DevOps支持的建议是尝试以下操作,将包括限制为某些特定分支:

trigger:
  branches:
    include:
    - master
    exclude:
    - 'refs/tags/*'

但是,结果没有改变。

已经报告了该问题,需要进一步调查,我正在等待更多反馈。我将在得到答案后立即对其进行编辑。同时,我希望此信息对面临此问题的其他人有用。

我在此间找到的解决方法(如评论中所述)是仅使用一个管道,该管道始终由任何提交(无论是否标记)触发,并使用专用脚本检测标记的使用以激活特定的必要时执行管道步骤。