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

25次阅读

共计 2761 个字符,预计需要花费 7 分钟才能阅读完成。

本文来自:
武让 极狐 GitLab 高级解决方案架构师

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

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

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

事实上,仅靠这些流水线类型名称和官网形容,咱们很难了解其意义和用处。

因而,作者联合泛滥用户反馈和本身实际,简明扼要“从新定义”了这些流水线类型:

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

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

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

有向无环图流水线 DAG Pipelines

1. 官网定义

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

  • 有向无环图能够在 CI/CD 流水线上下文中,用于在作业之间建设关系,以便以最快的形式执行,无论阶段如何设置;
  • 例如,您可能领有作为次要我的项目的一部分而构建的特定工具或独自网站。应用 DAG,您能够指定这些作业之间的关系,零碎会尽快执行作业,而不是期待每个阶段实现。

并附上了一个不明觉厉的图:

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

2. 从新定义

DAG 流水线解决一个 数学题

次要性能

  • 打消木桶效应,升高构建工夫,进步构建效率;
  • 对流水线 Job 进行编排。

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

开展这个问题前,有些根底概念比方 Runner、Stage、Job 就不再复述了,如果对这些概念不理解,倡议先学习极狐 GitLab CI 入门常识,能够参考:

  • GitLab CI/CD 入门 | 极狐 GitLab
  • CI/CD 从入门到实际:yml 语法、罕用变量、Runner 装置配置

3. 问题解答

问题 1 -1

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

须要留神,极狐 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 平台打包需多长时间?

解答:

  • 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. 总结 DAG 流水线应用场景

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

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

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

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

正文完
 0