4道数学题,求解极狐GitLab CI 流水线|第4题:合并列车

news2024/11/25 20:15:43

本文来自:

武让 极狐GitLab 高级解决方案架构师

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

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

有向无环图流水线

父子流水线

多项目流水线

合并列车

但仅靠这些流水线类型名称和官方描述,我们很难理解其意义和用途。因此,作者结合众多用户反馈和自身实践,简明扼要 “重新定义” 了这些流水线类型,并通过 3 篇连载文章为您解答,帮助您掌握极狐GitLab 流水线。

【前文回顾】

1. 🔗有向无环图流水线

2. 🔗父子流水线+多项目流水线

本文是最后一篇——合并列车 ,enjoy~

合并列车 Merge Trains


官方定义

Merge Trains 即合并队列或者叫合并列车,我记得当初可能得花了 2、3 天才彻底弄明白这东西到底是干嘛的,先看看官方定义

使用合并队列对合并请求进行排队,并在将它们合并到目标分支之前验证它们的更改是否可以协同工作。

在频繁合并到默认分支的项目中,不同合并请求的更改可能会相互冲突。合并结果流水线确保更改适用于默认分支中的内容,但不适用于其他人同时合并的内容。

懵没懵?GitLab Inc 甚至写了一整篇 Blog 来介绍 Merge Trains 以及 Merge Trains 工作流,详见:《How starting merge trains improve efficiency for DevOps》,内容很丰富,但是我真的没看懂。

经过一番折腾,我发现要想理解 Merge Trains,得先了解它的前世今生。

重新定义

熟悉极狐GitLab CI 的朋友一定知道在极狐GitLab 的合并请求(MR)中是可以看到与这个 MR 相关的流水线的运行情况,如下图所示,共有两部分流水线,其中:

  • 上面的流水线是发起 MR 后一直到 MR 合并之前,如果源分支 test 有代码提交就会运行流水线,也就是流水线运行在源分支上;

  • 下面的流水线是 MR 被执行合并后,在目标分支 main 上运行流水线:

这个逻辑是说,当发起一个 MR 时,假设从 test 分支合并到 main 分支,那么极狐GitLab 首先会在 test 分支下跑流水线,只有当 test 分支的流水线跑成功时,才说明至少 test 分支的代码是跑得通的,也意味着可以合并到 main 分支。如果 test 分支的流水线都跑不通,那么合并到 main 分支后会导致 main 分支的代码也无法正常执行,这就失去了多分支协同开发的意义。

当 test 分支被成功合并到 main 分支后,极狐GitLab会在 main 分支下再跑一次流水线,用来验证合并后的代码是否能够跑通流水线,或者直接执行部署任务。

基于这个逻辑,在合并请求的基础上,极狐GitLab CI 又延伸出 3 种用法。

1. 合并请求流水线

回到上面那张图,假设这个项目的流水线脚本是:

stages:          
  - build
  - test
  - deploy

build-job:      
  stage: build
  script:
    - echo "Compiling code..."
    - echo "Compile complete."

unit-test-job:   
  stage: test    
  script:
    - echo "Running unit tests... This will take about 60 seconds."
    - sleep 6
    - echo "Code coverage is 90%"

deploy-job:      
  stage: deploy  
  script:
    - echo "Deploying application..."
    - echo "Application successfully deployed."

那么如果在这个项目中发起一个 MR,从 test 分支合并到 main 分支,首先会在 test 分支下运行上面的流水线。

但假设开发人员仅仅想在 test 分支下运行 build 和 test 阶段的任务,不希望执行 deploy 阶段,这时候就需要用到 if 或 only 关键字,比如:

stages:          
  - build
  - test
  - deploy
  
build-job:      
  stage: build
  # 仅在MR中运行
  only:
    - merge_requests
  script:
    - echo "Compiling code..."
    - echo "Compile complete."
    
unit-test-job:   
  stage: test    
  # 仅在MR中运行
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
  script:
    - echo "Running unit tests... This will take about 60 seconds."
    - sleep 6
    - echo "Code coverage is 90%"

deploy-job:      
  stage: deploy  
  script:
    - echo "Deploying application..."
    - echo "Application successfully deployed."

这样设置之后,当开发人员向 test 分支提交代码时,如果没有基于 test 分支的 MR,那么流水线脚本中的所有任务都会执行;如果有基于 test 分支的MR,那么只在 test 分支下执行流水线脚本中的 build、test 阶段的任务,不会执行 deploy 的任务。并且在 MR 中,极狐GitLab 会标识出来源分支的流水线是 “合并请求流水线”。

所以:

当一条流水线中的某些 Job 仅在合并请求 MR 中运行时,则该流水线称为合并请求流水线。

2. 合并结果流水线

接着上文的逻辑继续,从 test 分支合并到 main 分支,如果 test 分支的合并请求流水线跑通了,那只能说明 test 分支的代码可能没问题,并不能说明合并到 main 分支后的代码或者流水线没问题。

因为基于多分支的开发是同步进行的,假如有人已经向 main 分支提交了一些修改,虽然代码上可能没冲突,但运行逻辑上可能会产生一些影响。这时候可能会出现 MR 被执行合并后,目标分支流水线跑不通,需要进行回退或调试,从而影响其他人的情况。

很显然我们不希望这样的情况产生,所以极狐GitLab 为了解决这个问题,提供了 “合并结果流水线” 功能,可在项目中开启。需要注意的是这个功能属于极狐GitLab 专业版及以上版本功能,免费版不提供该功能。

当开启 “合并结果流水线” 时,极狐GitLab 会在源分支的流水线任务中,本地模拟将源分支合并到目标分支(不会影响到服务端),然后再运行流水线,这样就能一定程度上实现 “预测未来” 的效果,从而避免或降低合并后流水线跑不通的情况。并且在 MR 中,极狐GitLab 会标识出来源分支的流水线是 “合并结果流水线”。

所以:

在合并请求 MR 中,模拟将源分支合并到目标分支,然后再运行流水线,称为合并结果流水线。

3. 合并列车

书接上回,虽然合并结果流水线实现了 “预测未来”,但这个预测是短暂的。因为即便合并结果流水线运行成功,还需要有权限的用户执行合并动作,如果忘记执行合并或者拖了很久的时间才执行合并,这中间就又产生时间差了,预测也就不准了。所以极狐GitLab 祭出了大招,就是 Merge Trains 合并列车。

问题解答

问题 4

假设现在有3个开发人员分别在 feature1feature2feature3 分支下进行开发,分别提交了合并请求 MR1、MR2、MR3,彼此之间可能有代码冲突或潜在的功能影响,若在相近或同一时间内进行合并,如何高效率进行合并并尽可能避免合并后的冲突以及流水线失败。

其实这就是系统架构中常见的高并发问题,只不过在 DevOps 中,如果进行协同开发的人比较多、MR 数量较多、流水线运行的频率较快也会出现类似问题。而合并列车就像一个消息队列,开发人员就是生产者,消息就是合并请求 MR,合并列车将并发生产的 MR 收集起来进行排队,然后转成串行任务自动进行消费(合并),无法消费的任务就踢出,从而实现高效率合并并降低冲突和失败概率。如下图所示,是合并请求流水线、合并结果流水线、合并列车的运行逻辑视图,也是它们之间的区别,更是合并列车的演进历程。

合并列车是基于合并结果流水线的,也是极狐GitLab 专业版及以上版本的功能,也需要在项目中开启。

所以:

将多个 MR 进行排队,逐个运行合并结果流水线,运行通过就自动合并,运行不通过就踢出队列,这样的流水线称为合并列车。

最后用一张图对比 MR 中的三种流水线,需要说明的是合并结果流水线在实践中用到的更多,毕竟大部分企业和研发团队的协同效率和要求不会达到那么高,DevOps 建设也可以遵循架构设计的三原则:简单、适合、演进

🌟 至此,极狐GitLab 4 种流水线介绍完毕,希望以上内容对您有帮助!

欢迎关注极狐GitLab ,一同开启研发效能提升之旅!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/385134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NFT Insider #87:The Sandbox 收购游戏开发工作室 Sviper,GHST 大迁徙即将拉开帷幕

引言:NFT Insider由NFT收藏组织WHALE Members(https://twitter.com/WHALEMembers)、BeepCrypto(https://twitter.com/beep_crypto)联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周…

洛必达求极限法则的通俗理解

洛必达求极限法则的通俗理解 洛必达法则是用于计算函数在某一点的极限的方法 它的基本思想是利用函数在该点的导数来逼近极限值。 洛必达法则成立的主要原因是因为它是利用函数的导数来逼近函数值的方法。当函数在某一点处存在导数时,函数的变化趋势可以由导数来…

24小时稳定性爆肝测试!国内外5款远程控制软件大盘点

本文目录前言一、ToDesk远程控制二、向日葵远程控制三、RayLink四、TeamViewer五、AnyDesk总结前言 不论你的职业是什么,从事互联网工作基本就离不开远程,从远程安装系统到远程搞设计,再到做服务器的调控,都需要靠远程来协助完成…

如何实现《电子签名法》要求的可靠电子签名?

电子文档的电子签名怎么弄?我们在工作中经常需要在一些Word、pdf等电子版文件中插入签名,而很多人可能不知道,电子签名怎么弄?怎么做电子签名才有效?电子印章或签名图片属于电子签名吗?当工作或商务交易中&…

Typroa安装教程

Markdown 是一种轻量级标记语言,创始人为约翰格鲁伯(John Gruber)。 它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者HTML)文档。这种语言吸收了很多在电子邮件中已有的纯文本标记…

中小型企业综合组网及安全配置(附拓扑图和具体实现的代码)

目录 一、实验目的 二、设备与环境 三、实验内容及要求 四、实验命令及结果 五、实验总结 六、实验报告和拓扑图下载链接 一、实验目的 1.了解企业网络建设流程 2.掌握组建中小企业网络的组网技术; 3.掌握组建中小企业网络的安全技术 二、设备与环境 微型…

Nginx国密支持问题记录

文章目录添加国密支持可能出现的问题国密不生效,查看 Nginx 可执行文件路径是否正确证书无法解析Nginx无法启动添加国密支持 NGINX添加国密支持 添加国密支持可以直接按照官网的操作顺序操作即可 参考网址:https://www.gmssl.cn/gmssl/index.jsp 可能出…

【解决】ScrollView 子 Content 在应用 Contentt Size Filter 出现位置自偏移错误问题

开发平台:Unity 2022 开发语言:CSharp 6.0   问题描述 问题表现: Scroll View 出现 Content 的 RectTransform 偏移值会出现自变化情况,但此变化情况不符合预期表现。 问题背景: Scroll View 添加 四周型 适配与 P…

Word控件Spire.Doc 【书签】教程(3): 使用 HTML 代码编辑/替换 Word 书签的内容

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

Python爬虫-阿里翻译_csrf

前言 本文是该专栏的第37篇,后面会持续分享python爬虫干货知识,记得关注。 笔者在前面有介绍过百度翻译的案例,感兴趣的同学,可往前翻阅查看(JS逆向-百度翻译sign)。而本文,笔者要介绍的是阿里翻译,相对于百度翻译的参数被逆向需要花点时间,阿里相对于易上手。 下面…

【java】java消息推送至微信公众号详细教程

文章目录读前必看测试号推送谁说程序员不懂浪漫? 将的关心 推送至微信公众号 给女朋友及时的关怀~(这位同学 你女朋友呢?) 读前必看 关于微信开发平台,小程序和公众号是不一样的,而公众号又会区分订阅号、服务号、测…

西湖论剑 2022复现

目录 <1> [西湖论剑 2022] Node Magical Login <2> [西湖论剑 2022] real_ez_node(ejs原型链污染&http拆分攻击) <3> [西湖论剑 2022] 扭转乾坤 (RFC差异绕过header头内容限制) <4> [西湖论剑 2022] unusual php(IDA拿rce密钥&利用rce密钥…

DSS 部署环境需求清单

文章目录 DSS系统需求项目地址计算资源计算基准:计算引擎程序硬件需求表 :DSS计算及存储资源需求计算资源计算基准:计算程序硬件需求表:DSS系统需求 项目地址 https://github.com/WeBankFinTech/DataSphereStudio 计算资源计算基准: 1.日活用户10万。 2.单用户单日总…

网络安全怎么学?20年白帽子老江湖告诉你

很多人都知道龙叔是个老程序员&#xff0c;但却不知道其实我也是个H客&#xff0c;20年前我就开始痴迷于H客技术&#xff0c;可以说是网络安全方面的老江湖了。 到现在&#xff0c;我还依然会去研究这一块&#xff0c;偶尔会和一些网安的朋友交流技术&#xff0c;比如说红盟的…

Nginx的三大特点

作为一个 Web 服务器&#xff0c;Nginx 的功能非常完善&#xff0c;完美支持 HTTP/1、HTTPS 和 HTTP/2&#xff0c;而且还在不断进步。 1、进程池 Nginx 作为“轻量级”的服务器&#xff0c;它的 CPU、内存占用都非常少&#xff0c;同样的资源配置下就能够为更多的用户提供服…

Android 绘图基础:Canvas画布——自定义View基础(绘制表盘、矩形、圆形、弧、渐变)

Canvas画布&#xff0c;通过它我们可以自定义一个View&#xff0c;设置View的相关效果之类的。感觉用法差不多&#xff0c;重要的是要理解方法中传入的参数的含义&#xff0c;比如float类型的参数&#xff0c;传递的是坐标,已开是没有注意传入的参数时坐标&#xff0c;导致我迷…

windows编译x265

msys2的安装参考&#xff1a; MSYS2安装_蜡笔小方的博客-CSDN博客 将下载好的x265放入msys2能找到的目录下&#xff1a; 打开msys2&#xff0c;切换到x265/build/msys-cl目录下 其中&#xff0c;build目录下是x265为了各种平台或者不同编译工具配的编译脚本&#xff1f;&…

儿童护目台灯哪种好用?几款真的保护视力的台灯品牌推荐

儿童眼睛还未发育完全&#xff0c;眼睛比较脆弱&#xff0c;但是现在的小孩子学习任务也比较繁重&#xff0c;经常晚上看书写字&#xff0c;所以选择合适的护眼台灯来保护眼睛很重要。 选择儿童护目台灯需要注意以下几个方面&#xff1a; &#xff08;一&#xff09;色温和亮…

图解KMP算法

子串的定位操作通常称作串的模式匹配。你可以理解为在一篇英语文章中查找某个单词是否存在&#xff0c;或者说在一个主串中寻找某子串是否存在。朴素的模式匹配算法假设我们要从下面的主串S "goodgoogle" 中&#xff0c;找到T "google" 这个子串的位置。…

“终于我从腾讯离职了...”一个年薪40W的测试工程师的自白....

”我递上了我的辞职信&#xff0c;不是因为公司给的不多&#xff0c;也不是因为公司待我不好&#xff0c;但是我觉得&#xff0c;我每天看着我憔悴的面容&#xff0c;每天晚上拖着疲惫的身体躺在床上&#xff0c;我都不知道人生的意义&#xff0c;是赚钱吗&#xff1f;是为了更…