Azure DevOps的流水线触发器无法触发

11

问题

Azure DevOps有一个功能(在此文档中记录),可以在另一个管道完成后触发管道。 在测试组织中,这很好用,但在我们的主要组织中无法正常工作。 可能是组织、项目、存储库甚至分支级别上的问题,但我目前陷入困境,需要任何帮助!

管道

当管道 Pipeline A 完成时,应自动运行管道 Pipeline B

管道 Pipeline A 的文件为 pipeline-a.yaml

pool:
  vmImage: 'ubuntu-latest'

steps:
- script: echo Hello, world!
  displayName: 'Do something'

管道 B 的文件 pipeline-b.yaml

trigger: none

pool:
  vmImage: 'ubuntu-latest'

resources: 
  pipelines:
  - pipeline: pipeline-a
    source: 'Pipeline A'
    branch: master
    trigger: 
      branches:
      - master

steps:
- script: echo Hello, world!
  displayName: 'Do something'

组织

在我的测试组织中,上述流水线运行得非常好。这意味着Pipeline A在提交时运行,在完成后,Pipeline B会自动运行。

然而在我们的生产组织中,Pipeline B不会自动运行。

发现

  • 在两个组织中,当手动启动时,两个流水线都可以正常运行
  • 在两个组织中,所有预览功能都相同,包括多阶段流水线功能。
  • 生产组织在主分支上有分支策略,而测试组织没有策略。我没有看到与流水线触发器的关系,并且没有进行调查。
  • 安装扩展程序使它们在测试和生产环境中保持一致没有任何区别。
  • 测试组织似乎处于缓慢更新环境中,仍然是Sprint 161。编辑:组织更新到Sprint 162后问题仍然存在。
  • 当我使用经典编辑器并手动创建构建完成触发器时,它可以正常运行。但是这将覆盖YAML流水线触发器,并且我不想这样做(我想生成流水线及其触发器)

我尝试复制您的设置。只有一个快速问题:两个管道都是“发布”管道,还是您所说的CI/CD是指“CI = Build”和“CD = Release”? - Jonas
1
@Jonas:它们都是YAML管道。CI/CD的区别在于功能应用,与手头的技术问题无关。我已经编辑了描述。 - Jan Wicher
好的,我已经复制了设置,并且遇到了与您的测试组织中相同的行为 - 一切正常。B会在A完成后自动触发。只是另一个问题需要澄清:您说所有预览功能都相同,包括“多阶段管道”功能。这个功能的实际状态是什么?它在两个组织中都启用还是禁用? - Jonas
1
我只有一个想法,可能是您问题的原因。在您的生产组织中,请打开 Pipelines > 在 Pipeline B 处从右侧的 3 点菜单中单击 Edit > 在右上角的 3 点菜单中单击 Triggers > 确保未选中“从此处覆盖 YAML 持续集成触发器”的选项。 - Jonas
很抱歉,目前我还没有看到问题的原因... - Jonas
显示剩余2条评论
3个回答

9

删除并重新添加管道就可以解决问题。因此保留YAML文件,但删除管道并重新添加。

Azure DevOps后端似乎会偶尔错过管道之间的关系。


截至今天,Pipeline API 仍处于预览阶段。有时会发生像这样不可预测的情况。如果使用 Web UI,由于浏览器缓存,这种情况可能会发生。 - Shehan Weerasooriya
今天我做了这件事。我有多个流水线,根据上面的例子,让流水线 a、x、y、z。如果任何一个流水线通过,我的流水线 b 就会触发。所以我删除了我的流水线 a,并使用相同的名称重新创建了它。现在流水线 a 的触发器不起作用,但 x、y、z 的触发器可以正常工作。我是否需要删除并重新创建流水线 b? - aryan

8
今天我们解决了一个类似的问题。我们将Pipeline-A定义为一个资源,旨在被Pipeline-B使用。
消费管道从未被触发。删除和重新创建管道对我们来说没有用。这个作业/管道是全新的,并且在一个功能分支上。这最终变得很重要。
最终的解决方法是将该功能分支定义为Pipeline-B中“手动和计划构建的默认分支”。您可以在Pipeline-> Edit -> triggers -> yaml -> Get Sources中找到这个设置。随着我们将此代码推广到主分支,我们需要更新该设置。
因此,看起来手动和计划构建的默认分支应以更好的名字命名: 手动和计划构建的默认分支和管道完成触发器

这正是我们遇到的问题。然而,在我的情况下,当我从主分支运行Pipeline-A时,它没有触发Pipeline-B。我认为这是因为它选择了Pipeline-A所在的分支,并且yaml管道在主分支上不存在。但是,我应该能够从我的特性分支运行Pipeline-A(B的默认值仍设置为主分支),但这也不起作用。不过,从特性分支运行A并将B的默认值也设置为特性分支确实可以工作。 - Andrew DiNunzio
谢谢!这个接口结合了WebUI和YAML文件,而且一般来说不太可靠,集成文档也不是很好处理,但是这帮助我让自动触发器在开发分支上工作,并能为团队编写清晰的指南,在PR合并后重新配置。 - Janne Enberg

0
在我的情况下,问题很简单,源管道完成时出现了错误。使用一个非常简单的无错误管道进行测试,代码可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接