4道数学题,求解极狐GitLab CI 流水线|第4题:合并列车
本文来自:
武让 极狐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- deploybuild-job: stage: buildscript:- 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- deploybuild-job: stage: build# 仅在MR中运行only:- merge_requestsscript:- 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个开发人员分别在 feature1
、feature2
、feature3
分支下进行开发,分别提交了合并请求 MR1、MR2、MR3,彼此之间可能有代码冲突或潜在的功能影响,若在相近或同一时间内进行合并,如何高效率进行合并并尽可能避免合并后的冲突以及流水线失败。
其实这就是系统架构中常见的高并发问题,只不过在 DevOps 中,如果进行协同开发的人比较多、MR 数量较多、流水线运行的频率较快也会出现类似问题。而合并列车就像一个消息队列,开发人员就是生产者,消息就是合并请求 MR,合并列车将并发生产的 MR 收集起来进行排队,然后转成串行任务并自动进行消费(合并),无法消费的任务就踢出,从而实现高效率合并并降低冲突和失败概率。如下图所示,是合并请求流水线、合并结果流水线、合并列车的运行逻辑视图,也是它们之间的区别,更是合并列车的演进历程。
合并列车是基于合并结果流水线的,也是极狐GitLab 专业版及以上版本的功能,也需要在项目中开启。
所以:
将多个 MR 进行排队,逐个运行合并结果流水线,运行通过就自动合并,运行不通过就踢出队列,这样的流水线称为合并列车。
最后用一张图对比 MR 中的三种流水线,需要说明的是合并结果流水线在实践中用到的更多,毕竟大部分企业和研发团队的协同效率和要求不会达到那么高,DevOps 建设也可以遵循架构设计的三原则:简单、适合、演进。
🌟 至此,极狐GitLab 4 种流水线介绍完毕,希望以上内容对您有帮助!
欢迎关注极狐GitLab ,一同开启研发效能提升之旅!
相关文章:
4道数学题,求解极狐GitLab CI 流水线|第4题:合并列车
本文来自: 武让 极狐GitLab 高级解决方案架构师 💡 极狐GitLab CI 依靠其一体化、轻量化、声明式、开箱即用的特性,在开发者群体中的使用率越来越高,在国内企业中仅次于 Jenkins ,排在第二位。 极狐GitLab 流水线有 4…...
代码规范简述
目录 命名规范 代码格式 OOP规约 集合规范 并发规范 SQL语句规范 SQL 建表规范 SQL 索引规范 SQL 查询规范 控制语句规范 Javadoc 规范 其他规范 命名规范 1、包名:使用小写字母,多个单词之间用"."分隔,例如ÿ…...
【Java集合框架】篇五:Map接口
1. Map及实现类特点 Map:存储key-value HashMap:线程不安全,效率高,key和value都可以为null,底层使用 数组单向链表红黑树 结构(jdk8)。 LinkedHashMap:是HashMap的子类࿰…...
Typroa安装教程
Markdown 是一种轻量级标记语言,创始人为约翰格鲁伯(John Gruber)。 它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者HTML)文档。这种语言吸收了很多在电子邮件中已有的纯文本标记…...
【MySQL】存储引擎
目录 1.MySQL体系结构 2.存储引擎介绍 3.存储引擎特点 4.存储引擎选择 1.MySQL体系结构 MySQL整体的逻辑结构可以分为4层,客户层、服务层、存储引擎层、数据层 客户层 客户层:进行相关的连接处理、权限控制、安全处理等操作 服务层 服务层负责与客户层进行连接处理、处…...
芯驰(E3-gateway)开发板环境搭建以及调试遇到问题的解决
1-Windows下环境配置 可以在Windows上使用命令行或者IAR IDE编译SSDK项目。Windows编译依赖的工具已经包含在 prebuilts/windows 目录中,包括编译器、Python和命令行工具。 1.1.1 CMD SSDK集成 msys 工具,可以在Windows命令行中完成SDK的配置、编译和…...
【大数据监控】Prometheus、Node_exporter、Graphite_exporter安装部署详细文档
目录Prometheus简介下载软件包安装部署创建用户创建Systemd服务修改配置文件prometheus.yml启动Prometheusnode exporter下载软件包安装部署添加用户创建systemd服务启动node_exportergraphite_exporter下载软件包安装部署创建systemd服务启动 graphite_exporterPrometheus 简介…...
《C++ Primer》 第十一章 关联容器
《C Primer》 第十一章 关联容器 11.1 使用关联容器 使用map: //统计每个单词在输入中出现的次数 map<string, size_t> word_count;//string到size_t的空map string word; while(cin>>word)word_count[word];//提取word的计数器并将其加1 for(const auto &w:…...
WebRTC标准与框架解读(1)
1、如果让我来设计webrtc框架我在分析源码的时候,都喜欢做这样一件事情:如果让我来设计它,我会怎么做?大家可以紧跟我的思路,分析一下WebRTC为什么如此设计。为了对整个框架有有一个全面的了解,我们首先要做…...
数据结构的一些基础概念
一 基本术语 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。 数据元素:是组成数据的,有一定意义的基本单位,在计算机中通常作为整体处…...
【Python每日一练】总目录(不断更新中...)
Python 2023.03 20230303 1. 两数之和 ★ 2. 组合总和 ★★ 3. 相同的树 ★★ 20230302 1. 字符串统计 2. 合并两个有序链表 3. 下一个排列 20230301 1. 只出现一次的数字 2. 以特殊格式处理连续增加的数字 3. 最短回文串 Python 2023.02 20230228 1. 螺旋矩阵 …...
latex插入图片(自用)
加入宏包:\usepackage{graphicx} 使用 \includegraphics 命令进行插图。 \includegraphics[]{}: 第一参数[]:对图片做一些适当的调整(设定图片的高度和宽度或者按比例缩放) 第二参数{}:图片的名字…...
【微信小程序】-- 网络数据请求(十九)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
K8S 实用工具之一 - 如何合并多个 kubeconfig?
开篇 📜 引言: 磨刀不误砍柴工工欲善其事必先利其器 K8S 集群规模,有的公司倾向于少量大规模 K8S 集群,也有的公司会倾向于大量小规模的 K8S 集群。 如果是第二种情况,是否有一个简单的 kubectl 命令来获取一个 kubec…...
阿里云ECS服务器的6大功能组件
阿里的云服务在国内可以说是首屈一指的了,因此他们家的云服务器也是最受欢迎的。那么,你知道阿里云服务器ECS有哪些功能组件吗?不清楚不要紧,下面服务器吧小编带大家来看看。 在了解之前我们来看一张阿里云服务器ECS的产品组件架…...
外贸建站多少钱?不同预算对应的建站方案!
外贸建站多少钱? 答案是:3000左右。 作为一个外贸企业的经营者,我们深知一个优质的外贸网站对于企业的重要性。 然而,建立一个优质的外贸网站需要耗费大量的时间和资金,因此我们需要在预算有限的情况下,…...
Vue3中hook的使用及使用中遇到的坑
目录前言一,什么是hook二, hook函数的使用2.1 铺垫2.2 hook函数的写法2.3 使用写好的hook函数后记前言 在学习Es6的时候,我们开始使用类与对象,开始模块化管理;在Vue中我们可以使用mixin进行模块化管理;Vu…...
数据库-差集交集并集
数据库-差集交集并集[toc]图示一、并集运算(UNION)并集:两个集合的并集是一个包含集合A和B中所有元素的集合。在T-SQL中,UNION集合运算可以将两个输入查询的结果组合成一个结果集。需要注意的是:如果一个行在任何一个输…...
spark性能调优(四):网络
网络 一、数据读写二、数据处理三、数据传输在平衡不同硬件资源的时候,相比于CPU、内存、磁盘,网络开销处理延迟最高 一、数据读写 对于大多数应用来说,第一步都是从分布式系统中读取数据,不论什么文件格式,也不管哪种文件存储系统,访问数据源是否会引入网络开销,取决于任务与…...
高性能 WPF 图表控件LightningChart.NET:支持从 Web 服务器获取数据 | 附最新版试用下载
LightningChart.NET 是一款高性能 WPF 和 Winforms 图表,可以实时可视化多达1万亿个数据点。可有效利用CPU和内存资源,实时监控数据流。同时,LightningChart使用突破性创新技术,以实时优化为前提,大大提升了实时渲染的效率和效果&…...
文科女生月入14k背后:转行IT软件测试不是谁都学得来!
转行软件测试背后,或许每个人都有自己的无奈。就拿今天要和大家分享的这位小姐姐来说吧,如果不是万不得已,又怎么会狠下心来转行到IT互联网? 应届生逃避就业,考研失败 和大多数人一样,小姐姐的大学生活过得…...
GB28181监控视频统一汇聚平台LiveGBS将海康大华华为宇视等厂家监控设备统一接入后如何生成固定播放链接或者固定的流地址可以直接无插件播放或者拉取
目前汇聚各种厂家监控设备的视频汇聚平台,基本都是通过GB28181标准协议实现的。下面介绍下LiveGBS Web无插件直播的GB28181视频平台将各厂家(包括海康、大华、华为、宇视、天地伟业等)监控汇聚到同一个服务器上后,如何或者直播链接…...
认识BUG
如何描述 bug一个合格的 bug 描述应该包括以下几个部分:发现问题的版本开发人员需要知道出现问题的版本,才能够获取对应版本的代码来重现故障,并且版本的标识也有利于统计和分析每个版本的质量。问题出现的环境环境分为硬件环境和软件环境&am…...
C++string类型内置的搜索函数
string的搜索操作 string类型一共提供了6种不同的搜索函数,每个函数都有4个重载版本。如果搜索成功,每个搜索操作都会返回一个 string::size_type类型的值,表示匹配发生位置的下标。 如果搜索失败,则会返回一个名位string::npos…...
Disruptor 消费线程丢失、写入无限阻塞问题
使用jstack打印后,发现 1)写入disruptor线程卡死在 java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:338) at com.lmax.…...
【禅道测试环境搭建及安装】Linux上的禅道安装教程,从环境搭建开始
目录 一、操作环境 二、安装VMware 三、安装FinalShell 四、在VMware里安装CentOS 1.前置:CentOS的下载 2.CentOS的安装 3.查看网络 五、用宿主机连接远程的虚拟机 六、禅道包的下载与CentOS配置的修改 七、上传项目包并安装禅道 一、操作环境 Windows 10…...
spring-boot rabbitmq整合
文章请参考:Springboot 整合RabbitMq ,用心看完这一篇就够了 mven依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></depende…...
CentOS7安装redis redis常用命令
Redis简介Redis是一个开源免费的、使用C语言编写的NoSQL 数据库。Redis基于内存运行并支持持久化(RDB、AOF方式将数据保存在磁盘),采用key-value (键值对)的存储形式。Redis数据类型Redis支持五种数据类型:string(字符串)…...
世界文明的脉络
人类文明大体上可分为农耕文明、海洋文明和游牧文明三大类别,文明的标志一般是文字、青铜器、城市以及礼仪性建筑等要素。据此,史学家目前已发现了巴比伦文明、埃及文明、印度文明、华夏文明、希腊文明和波斯文明六种主要文明,其中前四种文明…...
map和set 的封装
文章目录引入key-value模型map和set底层setset的几个重要接口mapmap几个重要的接口map和set的封装引入 对于map和set的引入,我们用一道在程序中常见的问题解决: 给定一个数组int arr[]{1,2,1,3,1,4,1,5,5,2,3,4,5};,给出以下问题的解决方案&…...
网站建设进度表 免费下载/b站推广
城市快报记者许佳“315”之际,腾讯手机管家发布的《手机短信病毒个人隐私泄漏报告》显示,信息时代隐私泄露渠道呈现多样化,个人隐私泄露防范难度大增。报告揭露了隐私泄露10大渠道,同时指出,每到周三、周四,…...
长垣县住房和城乡建设局网站/宁波企业seo推广
随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 有时候,程序需要管理系统音量,或者直接让系统静音,这就可以借助AudioManager来实现。在通过getSystemService(Service.AUDIO_…...
vs2015 手机网站开发/seo工程师招聘
原题链接:https://uva.onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&pageshow_problem&problem2031 题意 给你一个有向图,问你定义一个环的平均值为这个环上所有边的平均值,问你最小的环的平均值是多少。 题解 一种…...
用自己的身份做网站备案/培训网络营销的机构
Silverlight 4 七转载于:https://www.cnblogs.com/doubleyan/archive/2010/06/30/2164727.html...
毕设web网站开发/p2p万能搜索种子
一、概念 IoC是Inversion of Control的缩写,有的翻译成“控制反转”,还有翻译为“控制反向”或者“控制倒置”。二、什么是IoC IoC就是IoC,不是什么技术,与GoF一样,是一种设计模式。在Spring中控制反转是Spring框架的核…...
wordpress 内存清理/网站怎么开发
Unity 之 关于UnityHub无法打开项目的问题(弹出Unity启动界面有退回到Hub选择工程界面)方案一:万能的重启大法方案二:未开启许可证方案三:终极奥义 -- 弃用Hub(只支持2018之前的版本)Unity Hub …...