4道数学题,求出极狐GitLab CI 流水线之最优解|第1题:有向无环图流水线

算法栖月人
• 阅读 863
本文来自:
武让 极狐GitLab 高级解决方案架构师

💡 极狐GitLab CI 依靠其一体化、轻量化、声明式、开箱即用的特性,在开发者群体中的使用率越来越高,在国内企业中仅次于 Jenkins ,排在第二位。

极狐GitLab 流水线有 4 种不同类型,分别是:

有向无环图流水线
父子流水线
多项目流水线
合并列车

事实上,仅靠这些流水线类型名称和官方描述,我们很难理解其意义和用途。

因此,作者结合众多用户反馈和自身实践,简明扼要 “重新定义” 了这些流水线类型:

  • 有向无环流水线,是一个数学题
  • 父子流水线,是一个判断题+选择题
  • 多项目流水线,是一个排列组合题
  • 合并列车,需要追溯其起源,弄清楚合并请求流水线、合并结果流水线合并列车

何以言之?接下来,我们将通过 3 篇连载文章为您解答,帮助您掌握极狐GitLab CI 流水线。

本文为第1篇——有向无环图流水线 ,enjoy~

有向无环图流水线 DAG Pipelines

1. 官方定义

DAG Pipelines 全称是 Directed Acyclic Graph Pipelines,即有向无环图流水线,官方定义和介绍如下:

  • 有向无环图可以在 CI/CD 流水线上下文中,用于在作业之间建立关系,以便以最快的方式执行,无论阶段如何设置;
  • 例如,您可能拥有作为主要项目的一部分而构建的特定工具或单独网站。使用 DAG,您可以指定这些作业之间的关系,系统会尽快执行作业,而不是等待每个阶段完成。

并附上了一个不明觉厉的图:
4道数学题,求出极狐GitLab CI 流水线之最优解|第1题:有向无环图流水线

相信这段介绍已经击败了 95% 的初学者,那 DAG 流水线到底是什么?它用在什么场景解决什么样的问题?

2. 重新定义

DAG 流水线解决一个数学题

主要功能

  • 消除木桶效应,降低构建时间,提高构建效率;
  • 对流水线 Job 进行编排。

这段介绍相对比较简洁了,但要理解 DAG 流水线,还需要展开来看看这个数学题是什么,以及 DAG 是怎么解决问题的。

展开这个问题前,有些基础概念比如 Runner、Stage、Job 就不再复述了,如果对这些概念不了解,建议先学习极狐GitLab CI 入门知识,可以参考:

3. 问题解答

问题1-1

假设有一个跨平台项目,它通过极狐GitLab CI 分别完成 Android、iOS、PC 三个平台的构建、测试和打包。流水线的 Stage 和 Job 如下所示,Job 中标识了该 Job 执行所需时间。忽略所有 Job 的启动时间,问 PC 平台打包需多长时间?Android 平台打包需多长时间?

4道数学题,求出极狐GitLab CI 流水线之最优解|第1题:有向无环图流水线

需要注意,极狐GitLab CI 中,默认每个 Stage 中,所有 Job 都执行完成才能执行下一个 Stage。即 build 需要等这个 Stage 中用时最久的 Job 即 build_ios 执行完成后才能执行 test,也就是需要 60s。

所以:

  • PC 平台打包用时=60s+30s+40s=130s;
  • Android 平台打包用时=60s+30s+40s=130s。

这就是所谓 “木桶效应”,理论上 PC 平台的打包与 iOS 和 Android 平台没有关系,但却要等待它们相关 Job 执行,被严重拖了后腿。

为了解决这个问题,就可以使用 DAG 流水线。它的原理和使用方式非常简单,通过给 Job 加上 needs 关键字,将 Job 的依赖关系进行编排,比如:

build_pc_dll
    stage: build
    script:
        - echo 'pc dll building'
        
build_pc
    stage: build
    script:
        - echo 'pc building'

build_android
    stage: build
    script:
        - echo 'android building'

test_pc:
    stage: test
    needs: [build_pc, build_pc_dll]
    script:
        - echo 'pc testing'
        
test_android:
    stage: test
    needs: [build_android]
    script:
        - echo 'android testing'
        
pkg_pc:
    stage: package
    needs: [test_pc]
    script:
        - echo 'pc packaging'

pkg_android:
    stage: package
    needs: [test_android]
    script:
        - echo 'android packaging'

这样 PC 平台打包就仅与 PC 平台的构建和测试 Job 相关,与其他 Job 无关了,也不需要等待其他 Job 执行。当然,这个例子为了更丰富的体现 DAG 流水线的特性,又增加了一个 build_pc_dll Job,并且让 test_pc 同时依赖 build_pc 和 build_pc_dll 。

问题1-2

使用 DAG 流水线后,PC 平台打包需多长时间?Android平台打包需多长时间?

4道数学题,求出极狐GitLab CI 流水线之最优解|第1题:有向无环图流水线

解答:

  • PC 平台打包用时=40s+30s+30s=100s;
  • Android 平台打包用时=30s+20s+40s=90s;
  • iOS 平台打包用时=60+15+20=95s;
  • 流水线总用时=Max(100, 90, 95)=100s。

可以看到,不论是各平台最终 Job 的用时还是流水线的总用时都降低了,这也就是为什么说 DAG 流水线是解决一个数学题,以及它是如何消除木桶效应、降低构建时间、提高构建效率以及如何实现对流水线 Job 进行编排的

最后,我们可以在极狐GitLab 的 “CI/CD 流水线”,选择指定流水线,然后点击 “依赖关系图”,就可以看到上文中这张不明觉厉的图了。这时候相信大家也能更好的理解这张图,更好的理解 DAG 流水线了。

4道数学题,求出极狐GitLab CI 流水线之最优解|第1题:有向无环图流水线

4. 总结 DAG 流水线使用场景

1.  流水线中有多个并行业务逻辑:比如 Monorepo(一个代码仓库中有多个模块/包)中多个模块同时构建、测试、打包,或类似上文中的跨平台编译打包,这些业务彼此之间相对独立。可以使用 DAG 流水线降低构建时间,提高构建效率。
2.  流水线 Job 有依赖关系:比如 Monorepo 中构建模块 C 需要模块 A 和模块 B 的构建产物,可以使用 DAG 流水线的 needs 关键字对这些 Job 进行编排。

🌟 极狐GitLab 4 种流水线之 “有向无环图流水线” 暂且搁笔,希望以上内容对您有帮助!接下来我们的连载内容是:

父子流水线 + 多项目流水线;
合并列车。

欢迎关注极狐GitLab 公众号,及时 “追番” 不迷路!

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
算法栖月人
算法栖月人
Lv1
阳春二三月,草与水同色。
文章
2
粉丝
0
获赞
0