一个简单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
随机推荐
- ZBX_NOTSUPPORTED: Cannot obtain filesystem information: [13] Permission denied
zabbix有默认两条自动发现规则,其中一条是自动发现已挂载文件系统,但笔者的三个挂载文件系统中两个监控成功了,一个失败 agentd端挂载情况: 仔细研究sdb1的挂载点,发现它是挂载在xiami用 ...
- Lint found fatal errors while assembling a release target
1.Android 打包错误信息 Generate signed Bundle or APK 打包时,报了一个错,错误信息如下: Error:Execution failed for task ´: ...
- python笔记-文件读写
文件操作过程一般为:打开.读写.关闭: 打开:open()或file() 读写:read().write(): 关闭:close(): 1.打开:open()或file() file_handler= ...
- openshift 容器云从入门到崩溃之六《Source-to-Image》
上次说到了怎么在oc上面部署应用而且说道了怎么定义模板部署应用,也许你会奇怪那个我代码打包编译在哪一步,那就要说道oc的s2i流程了 下面是基本s2i流程 1.制作base-image镜像 要使用s2 ...
- pwn学习日记Day4 基础知识积累
知识杂项 *:字符串重复 空指令NOP:\x90 cmp:是比较指令,cmp的功能相当于减法指令.它不保存结果,只是影响相应的标志位. xor:将两个操作数进行异或运算,并将结果存放到操作数1中. s ...
- Python基础(十一) 类继承
类继承: 继承的想法在于,充份利用已有类的功能,在其基础上来扩展来定义新的类. Parent Class(父类) 与 Child Class(子类): 被继承的类称为父类,继承的类称为子类,一个父类, ...
- 彻底解决(Microsoft Visual C++ 14.0 is required)的步骤123
之前要用协程gevent,安装pip install gevent包时遇到Microsoft Visual C++ 14.0 is required的报错提示,各种下载没有解决很头疼, 前两天安装sc ...
- Linux LVS_NAT DR
一.lvs-nat LVS是Linux Virtual Server的简写,意即Linux虚拟服务器.是由章文嵩博士开发的一个在内核层面的负载均衡调度器. lvs是在netfilter的INPU ...
- C++ Const指针
- 无需激活直接同步登入discuz,php代码(直接可用)
<?php /** * 抽奖 * @param int $total */ function getReward($total=1000) { $win1 = floor((0.12*$tota ...