DevOps案例旨在帮助用户在实践中更好的运用DevOps

devops案例旨在帮助用户在实践中更好的运用devops。
问题描述
jenkins2.0 pipeline框架ipipeline(即plll库)对mergeci的触发条件的设置为change merged模式且固定不变,即需要由代码走查者+2分后,再由core成员点击submit按钮来将代码推入库,然后才来触发mergeci流程,该过程的verifyci和mergeci流程如下图所示:
结合上图我们可以发现,这里有个问题是: 一旦代码走查通过(+2分),然后core成员通过(submit)后,代码立即入库,然后触发mergeci流程,此时若mergeci运行出错,那错误此时已经入库并且影响后续开发人员合入代码。
再结合本项目协议开发自身的实际特点,很有可能verifyci通过后的mergeci会和他人产生互相影响,这样便可能导致主干分支代码有错,开发人员之间互相影响,最终影响代码提交合入的效率。
基于此种情况,我们提出的一种模式是,mergeci由代码审查人员在gerrit上打出+2分来触发,只有到mergeci运行通过,代码才会被推入库中,此种方式带来的一个最直接的好处就是主干分支上的代码永远正确的,而且不会因为mergeci报错而影响他人合代码,而且该方法带来的另外一个好处便是无需设定关键角色来负责submit代码入库,仅仅需要的是代码走查人员即可,这样也提高了自动化程度,节省人力。将该流程可以示意如下图:
因此plll库的这种mergeci的设置方式并不满足本项目,因此我们决定扩充plll库对于mergeci运行模式的支持。
优化实践
通过重载了plll库的属性设置函数,加入了根据ci类型来完成mergeci不同触发条件的设置:
/**
* 工具名称:set_default_properties
* 工具描述:设置默认的参数
* 参数说明:
* - citype : ci类型
* - args : 参数列表
**/
def set_default_properties(citype, args){
def buildparameters =[]
def buildtriggers =[]
set_parameters_properties(buildparameters, args)
set_cron_properties(buildtriggers, args)
set_gerrit_properties(citype, buildparameters, buildtriggers, args)
/* --------参数------- */
properties([
[$class:'gitlabconnectionproperty', gitlabconnection:''],
[$class:'rebuildsettings', autorebuild:false, rebuilddisabled:false],
builddiscarder(logrotator(artifactdaystokeepstr:'', artifactnumtokeepstr:'', daystokeepstr:'14', numtokeepstr:'100')),
parameters(buildparameters),
pipelinetriggers(buildtriggers)
])
/* 清空临时变量 */
buildparameters=null
buildtriggers=null
return
}
/**
* 函数名称:设置gerrit属性
**/
def set_gerrit_properties(citype, buildparameters, buildtriggers, args)
{
// ...此处代码省略...
if(verifyci==${citype}){
gerritevents =[
patchsetcreated(
excludedrafts:false,
excludenocodechange:true,
excludetrivialrebase:false
),
draftpublished()
]
// 如果ci类型是mergeci,则设置器触发条件为code-review +2方式来触发
}elseif(mergeci==${citype}){
gerritevents =[
commentadded(commentaddedtriggerapprovalvalue:'+2', verdictcategory:'code-review')
]
}
// ...此处代码省略...
}
由代码可知,在set_gerrit_properties函数中,做了特殊判断,若是mergeci,则单独将其触发条件设置为code-review +2,这样便可以满足需求。
使用举例:
在mergeci的jenkinsfile中调用plll.set_default_properties设置项目属性时明确指定mergeci类型即可,以本项目的jenkinsfile代码中设置默认属性参数为例:
def set_default_properties(){
plll.set_default_properties(mergeci,[
/* 关联gerrit */
gerrit:[
server:${env.gerrit_server_name},
projects:[[project:${env.gerrit_project}, branch:${plll.getjobbasename()}]]
],
/* 自定义参数 */
parameters:[
choice(choices:'yes\nno', description:'清空编译环境', name:'clean_all'),
string(defaultvalue:${plll.getjobbasename()}, description:'触发分支',name:'branch_tag')
],
]);
}
除此之外,还需要在jenkins系统管理中mergeci的gerrit trigger设置中作如下图所示的配置即可:
优缺点分析
1. 优点
开发人员互相独立,别人错误的代码无法入库,不影响他人
主干分支代码永远正确,不影响别人拉代码验证和正常合入代码
无需小组核心成员进行submit操作,mergeci一旦运行正确,代码则自动入库
2. 缺点
原理决定了其无法并行,所以需要根据不同的项目情况酌情考虑。但是从本项目实际实践的整局来看,本项目verifyci支持数个任务同时并发执行,而mergeci排队执行,但由于mergeci执行较快,而且冲突很少,因此mergeci的代码都能逐个顺利地合入,幸福感较以前有很大提升。

电磁流量计的选型要素
100套国产全志系列T3/A40i工业评估板限时试用,还不快来?
防止IE主页被修改 我有妙法
借助SAP创新技术 古井集团在新零售时代加速业务升级转型
剩余电流动作保护器一般要求
DevOps案例旨在帮助用户在实践中更好的运用DevOps
使用Rust和Nomad进行开源游戏服务器管理
OPPO丨vivo破局占领手机市场,新一轮“返璞归真”好难玩!
充气柜与环网柜二者之间的差别是怎样的
Synchronized multi-spark modul
单通道LTC1149可提供3.3V和5V
霍尔传感器产生误差的原因
Wanchain跨链机制怎样来改善
2019年第一场高端机之战开始 性价比时代的宣告结束
英特尔数据存储如何操作和实现
自动驾驶公交车来了 广州10台Apollo Robobus完成国潮皮肤上线
EPS容量计算方法
印度政府将在下周针对苹果在印度设厂而提供的相关优惠激励政策进行开会讨论
一颗IC3路CC管理的VR转接器方案
依图ReID算法创下新世界纪录