我们有管道,通常有以下阶段:
- Build (+ UnitTests)
- 部署到Dev
- 部署到测试
- 部署到生产
另外-在Test和Prod环境中-批准是定义的-所以如果PR被合并,它只被部署到Dev,然后需要手动批准部署到Test,等等。
我们有很多组件(API A, API B,一些后台worker,等等),因为我们想要独立地管理和部署这些组件——它们都有自己定义的管道(它们看起来都很相似——如上所述)。
有时会发生一个PR影响多个组件,然后并行触发2或3或更多管道的情况。
我们还有一组端到端测试-验证所有组件是否可以很好地一起工作。
当单个PR被合并并影响多个组件时-我们真的不想多次触发这些端到端测试。我们只想在所有受影响组件的管道部署到特定环境时触发它。因此,我们为这些端到端测试分离了管道。
我们想要实现的流程是:
- PR被合并
- 组件A、B和C的管道被触发。
- 组件A、B、C的管线已完成阶段:"部署到开发";下一阶段:"部署到测试"状态为"等待">
- 端到端测试流水线已启动
- 组件A、B和C的管道将运行阶段"部署到测试";只有当有人手动批准(我们现在有这个)和管道的E2E测试已经成功完成
你知道我们怎样才能达到最后一个条件吗?
您需要在管道中编写一个自定义Powershell/Shell任务,该任务基本上轮询更新以检查您的外部端到端测试管道是否完成,并在端到端测试完成时完成该过程。
下面是另一个答案的链接,这个答案有一个如何完成这个任务的例子:
- 如何使Azure DevOps管道等待外部进程完成?
但是,使用此方法时,如果E2E测试需要运行几个小时,则可能会遇到作业超时的问题。默认超时为:
- 360分钟自托管作业
- 60分钟的微软托管作业
以下是关于超时的文档:
- https://learn.microsoft.com/en-us/azure/devops/pipelines/process/phases?view=azure-devops&标签= yaml #超时