使用有向无环图实现更快、更灵活的管道

2020-05-12 21:45:41

最近,GitLab发布了一个令人兴奋的特性,它减少了管道运行时间,并在作业运行顺序上实现了更大的灵活性。该功能称为有向无环图(DAG),可在GitLab.com和自托管版本上免费获得。

在典型的CI/CD管道中,您有多个阶段,这些阶段代表DevOps流程(如构建、测试、打包、配置和部署)的自动化。每个阶段由一个或多个作业组成。在CI/CD配置文件.gitlab-ci.yml中,您可以定义阶段的顺序。通常,管道将从构建作业开始;在所有构建作业完成后,将启动测试作业,然后运行下一阶段的作业,依此类推。

虽然这个顺序很有意义,但在某些情况下,这可能会减慢总体执行时间。设想构建阶段由任务A和任务B组成,任务A在1分钟内完成,任务B非常慢(比方说5分钟)。任务C处于测试阶段,但它仅依赖于任务A。不过,任务C必须等待5分钟才能执行,结果浪费了4分钟。

DAG将允许您无序运行流水线步骤,打破阶段排序,并允许作业彼此直接相关,而不管它们属于哪个阶段。

使用DAG,作业可以在其从属作业完成后立即开始运行,即使上一阶段的某些作业仍在运行。此新功能加快了CI/CD流程,有助于更快完成部署。

在下面的示例中,一个项目在多阶段管道中同时生成Android、iOS和Web应用程序。iOS版本一通过,iOS测试就开始了,而不是等待所有的Android和Web版本也通过。IOS部署也是如此-它在IOS测试通过后完成,无需等待其他测试完成。总计算时间可能相同,但挂钟时间不同。在更复杂的情况下,通过准确声明哪些作业依赖于哪些其他作业,可以显著缩短管道的整体挂钟时间。

gitlab-ci.yml文件引入了一个新关键字:Nesids,该关键字获取它所依赖的一组作业的参数。

IOS:阶段:构建脚本:-ECHO";构建IOS.";IOS_TEST:阶段:测试脚本:-ECHO";测试内容.";需求:[";IOS";]

IOS_TEST作业是测试阶段的一部分,它将在处于构建阶段的IOS作业之后立即启动,并且无论构建阶段中其他作业的状态如何,它都将完成。

这对于日益流行的monorepo模式可能很有价值,在这种模式下,你的repo中有不同的文件夹,可以独立构建、测试甚至部署,就像上面的例子一样,iOS、android和web应用可以单独构建、测试和部署。

另一种用法可能是当您的管道包含一些需要大量时间执行的繁重测试时。尽早开始这些测试会更有意义,而不是等待不相关的任务完成,而不是只开始它们。

注册GitLab每月两次的时事通讯,探索即将到来的网络广播、操作博客,并随时了解每月发布的令人兴奋的新功能:

GitLab不仅仅是源代码管理或CI/CD。它是一个完整的软件开发生命周期&在单个应用程序中的DevOps工具。

免费试用GitLab