当合并提交包含 [skip ci] 提交

时间:2021-04-13 11:58:34

标签: azure github azure-devops continuous-integration azure-devops-pipelines

背景

我们的管道触发器:

trigger:
  branches:
    include:
      - develop
      - master

pr:
  - master

我们的管道根据一些条件进行操作,这些条件检查它位于哪个分支上,或者是什么触发了管道。

  • 提交开发触发器会影响版本,提交回开发、构建和工件
  • PR 触发部署以接受
  • 提交到 master 触发部署到生产

为了不让开发分支触发器本身,它在提交消息中使用 [skip ci] 提交。

我已经验证,当我合并一个不包含任何 [skip ci] 提交的 PR 时它可以工作。所以触发器本身是有功能的。


问题

当我们将 PR 合并到 master 时,它根本不会触发 CI 触发器。在 azure devops 面板中它永远不会出现,表明它被忽略了。

删除 [skip ci] 提交使这个问题消失,但引入了管道不断触发自身的问题。

我们的存储库在 GitHub 中,防止我根据提交作者或其他内容手动过滤掉。

我对合并提交(包含带有 [skip ci] 的旧提交)阻止触发器触发感到有些困惑。

我是否误解了此处的预期行为?

我也愿意接受解决方法。

抱歉,如果已经在某处回答了这个问题,但我找不到任何有此确切问题的人。


提交日志

红色:一个合并的 PR 没有一个 [skip ci] 提交——这正确地触发了 CI 主分支(见带复选标记的带下划线的提交)

黄色:合并一个[skip ci]提交——这不会触发CI主分支(见下划线提交,不带复选标记)

合并提交的内容均不超过提交消息中的标题。

GitHub Commit Log


Azure DevOps 管道日志

为了清楚起见,我标记了与 github 屏幕截图中相同的部分。如您所见,黄色部分中缺少 master 的单个 CI。

Azure DevOps Pipeline Log

3 个答案:

答案 0 :(得分:1)

我的猜测是合并提交会生成一个注释,列出所有包含提交的所有提交消息。因此,合并的提交消息包含 [skip-ci]

我猜处理这个问题的理想方法是在合并之前编辑提交消息,或者确保您的 skip-ci 标记位于原始提交消息的描述部分。

This is the first.line of the commit
[skip-ci] < on the second line

这样它就会在合并提交消息中被省略。

答案 1 :(得分:1)

<块引用>

当我们将 PR 合并到 master 时,它根本不会触发 CI 触发器。在 azure devops 面板中它永远不会出现,表明它被忽略了。

使用 Github 存储库,我几乎可以重现这个问题。

如果我们为主管道设置触发器,例如:

trigger:
  branches:
    include:
      - develop
      - main

pr:
  - main

为了避免来自develop分支的CI触发,我们在commit for develop时在commit消息中添加了[skip ci]

enter image description here

显然,我们的管道不会被触发。它也可以正常工作。

但是,如果我们在创建 PR 时在上下文中没有创建一个 PR 到主分支:

enter image description here

结果是只有有主分支的 PR 触发器。

PR完成后主分支的CI触发:

enter image description here

如果从develop分支提交时不加[skip ci],PR完成后会触发main分支的CI。

然后我使用 Azure Devops Git 存储库创建了一个类似的示例。我得到了不同的结果。

无论我们在 PR 上下文中是否包含 [skip ci],都会在 PR 完成后触发 Main 分支的 CI 构建。这是预期的结果,和github repo的结果明显不同

enter image description here

enter image description here

因此,我们不确定这是问题还是默认行为。我已经提交了一张关于它的新票:

https://developercommunity.visualstudio.com/t/Azure-DevOps-Pipeline-not-triggered-for-/1400393

答案 2 :(得分:0)

我现在通过删除 [skip ci] 提交并在 CI 触发器上使用一些排除路径过滤器来规避这个问题。

这引入了一些其他小问题,但目前这对我们有用。显然这不是一个真正的解决方案,所以我暂时不会将任何内容标记为答案。