一个简单CI/CD流程的思考
因为公司有两地研发团队,在统一CI/CD上难度不亚于两家公司合并后的新流程建立,并非不可攻克,简单描述下心得。
首先,代码管理使用gerrit -> 因其强大的 codereview 功能被选中为 codebase 的选型,而且,我们依赖于 gerrit event 触发流程,取代沟通基本靠喊的简单粗暴的方式。
关于 gerrit event 介绍,请参考
https://gerrit-review.googlesource.com/Documentation/cmd-stream-events.html
原本,CI/CD 流程是重度依赖 jenkins 及其插件。但因 jenkins 的排队处理,及其插件 gerrit-trigger 的 miss 率达到将近 10%(针对本公司 gerrit 提交情况),导致 CI/CD 流程无法获得期望中的推广效果,故抛弃 jenkins 插件,降低 jenkins 使用权重,降低替代 jenkins 的成本
使用 python 开发 gerrit client, 监听 gerrit event 事件(目前只处理 PatchSet Create & ChangeMerged )
监听 gerrit event:
def run(self):
host = self.config.get("gerrit_host", "example.net")
user = self.config.get("gerrit_user", "engineer")
port = int(self.config.get("gerrit_ssh_port", "29418"))
fkey = self.config.get("gerrit_key_file", None)
etyp = self.config.get("gerrit_event_types", "").split(",")
events = queue.Queue()
listener = StreamEventListener(events, user, host, port, fkey)
listener.set_event_types(etyp)
listener.set_logger(self.logger)
listener.start()
while True:
e = events.get()
handler = GerritStreamEventHandler(e, self.logger, self.config)
handler.start()
eg:
if "patchset-created" == etype:
taskQueues[project][cs].put(self.event)
taskQueues[project][ut].put(self.event)
elif "change-merged" == etype:
#change-merged,启动ci构建job
url = 'http://127.0.0.1:9091/citrigger'
param = {"event":event}
header = {"Content-Type": "application/json"}
response = requests.post("http://127.0.0.1:3200/", json=param, headers = header)
log_trigger_fmt = "Trigger ci job on [{}], ref: {}, event created {}, responses :{}"
self.logger.info(log_trigger_fmt(project, ref, etime, response))
此处,通过使用自行开发的EventListner 及 handler,替代 jenkins 中 gerrit trigger的功能,解决了 miss 的问题!
另外,发布系统作为前端展示及任务调度的部分,可以完成数据统计,针对某个提交进行重复构建,记录发布历史,统一公司项目结构进行的技术限制,保证高度统一。
通过 trigger 的转发及过滤,可以确保每一次开发的提交在经过submit后得到构建,构建使用的工具还是采用了 jenkins (天坑jenkins,以后会丢掉的),通过参数化构建的方式,并依赖于公司内同一类型的项目的构建方式统一 (nodejs, maven, gradle),消息处理,更新模板,创建job, 更新job, 这个部分由一个独立的服务来维护, 服务与 jenkins 通信,维护 jenkins 中 job的配置信息。
设计思路
- 启用端口监听 发布系统 发来的请求:
- 请求包含4个部分 type Income struct { AppId string
json:"app_id"
Project stringjson:"project"
TaskId stringjson:"task_id"
Ref stringjson:"ref"
}
- 进行以下处理:
- 根据 AppId, 搜索该项目是否有特殊配置(构建前/后的命令执行),如果有,不执行刷新 job template 的操作,如果没有, 根据项目类型刷新对应的 job template
- 根据 AppId, 获取该项目的 job url,并执行构建操作
- Job Build 需要的参数 type Param struct { Ref string
json:"Ref"
TaskId stringjson:"TaskId"
AppId stringjson:"AppId"
Project stringjson:"project"
Module stringjson:"Module"
}
- 新增创建job端口,进行以下处理:
- 接收发布系统的请求: type CreateIncome struct { AppId string
json:"app_id"
Project stringjson:"project"
Type stringjson:"type"
Module stringjson:"module"
SzOrSh stringjson:"SzOrSh"
} - 收到请求后,在 t_app_job 插入记录即可
一个简单CI/CD流程的思考的更多相关文章
- 《CI/CD 流程以及原理说明》
自动化部署 CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法.CI/CD 的核心概念是持续集成.持续交付和持续部署.作为一个面向开发和运营团队的解决方案,CI/CD 主要针对在 ...
- PHP应用的CI/CD流程实践与学习:一、PHP运行环境的准备
前言:一直以来想学习与实践一下敏捷开发,之前项目虽说口口声声我们项目是敏捷开发,其实很扯. 敏捷开发如果有持续集成.持续部署的支持,那样开发.测试.运维将节省不少精力. 此系列博客只为记录CI/CD的 ...
- Springboot 整合Activiti流程设计器 完成一个简单的请假流程
目录 1.前言 2.准备 3.下载解压 4.开始整合 mysql + activiti + thymeleaf 2.配置文件 3.复制文件 4.加入控制器 5.修改配置文件 6.剔除启动类里面的安全校 ...
- 一个简单算法题引发的思考<DNA sorting>(about cin/template/new etc)
首先是昨天在北京大学oj网上看到一个简单的算法题目,虽然简单,但是如何完成一段高效.简洁.让人容易看懂的代码对于我这个基础不好,刚刚进入计算机行业的小白来说还是有意义的.而且在写代码的过程中,会发现自 ...
- 一个简单的CD/CI流程思考,续
经过各种优化,最终一个非常简单的pipeline出现了,图中没有包含单元测试及静态代码检查的部分,有时间补上.至少实现了提交即构建,也能迅速反馈给开发者. 但是最大的问题是,研发团队还是习惯依赖于部署 ...
- 【Star CCM+实例】开发一个简单的计算流程.md
流程开发在CAE过程中处于非常重要的地位. 主要的作用可能包括: 将一些经过验证的模型隐藏在流程中,提高仿真的可靠性 将流程封装成更友好的界面,降低软件的学习周期 流程开发实际上需要做非常多的工作,尤 ...
- Workflow:实现一个简单的审批流程
1. 创建一个空白的项目,在其中创建Host – Windows Console Application,Client – Windows forms Application和DataExchange ...
- 基于SpringCloud的微服务架构实战案例项目,以一个简单的购物流程为示例
QuickStart 基于SpringCloud体系实现,简单购物流程实现,满足基本功能:注册.登录.商品列表展示.商品详情展示.订单创建.详情查看.订单支付.库存更新等等. 每个业务服务采用独立的M ...
- uiautomator 一个简单脚本创建流程
http://www.codeceo.com/article/android-ui-auto-test.html
随机推荐
- iptables精通
前提基础: 当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发. iptables实现防火墙功能 ...
- mysql /tmp目录爆满问题的处理
mysql /tmp目录爆满问题的处理 突然收到zabbix告警,说mysql服务器的/目录磁盘空间不足. 登录到服务器,看了下发现100GB的根目录,居然使用了差不多90GB.这台服务器上只跑了一个 ...
- Domain Driven Development相关概念
Entity 与 Value Object1,Entity有唯一的身份标识,是可变的对象.Value Object是immutable,创建了就不能改变.2,Value Object可以在多个领域之间 ...
- CSS样式中文字的换行
在我们做输出时可能会遇到这样一个问题,就是汉字和英文字母相遇,然后自动换行的问题.例如,当我在输出产品标题时,由于产品名称比较长,包括汉字和英文字母,FF下浏览是正常的,而IE下面 英文会出现换行.当 ...
- Cocos Creator 使用计时器(官方文档摘录)
在 Cocos Creator 中,我们为组件提供了方便的计时器,这个计时器源自于 Cocos2d-x 中的 cc.Scheduler,我们将它保留在了 Cocos Creator 中并适配了基于组件 ...
- angularjs 绑定多个属性到下拉框
绑定下拉框 angularjs 代码: //活动下拉切换 $scope.activityChange = function () { var cards = new Array(); var url ...
- mysql优化方案之sql优化
优化目标 1.减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先 ...
- Zookeeper应用之——栅栏(barrier)
Zookeeper应用之——栅栏(barrier) 栅栏(barrier)简介 barrier的作用是所有的线程等待,知道某一时刻,锁释放,所有的线程同时执行.举一个生动的例子,比如跑步比赛,所有 运 ...
- Vue用axios跨域访问数据
Vue用axios跨域访问数据axios是vue-resource的替代品,vue-resource不再维护.安装axios:npm install axios使用vue-cli开发时,由于项目本身启 ...
- swapper_pg_dir主内核页表、init和kthreadd、do_fork时新建子进程页表、vmalloc与kmalloc
都是以前看到一个点扯出的很多东西,当时做的总结,有问题欢迎讨论,现在来源难寻,侵删! 1.Init_task.idle.init和kthreadd的区别和联系 idle进程其pid=0,其前身是系统创 ...