zoukankan      html  css  js  c++  java
  • 一个简单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的配置信息。

    设计思路

    1. 启用端口监听 发布系统 发来的请求:
    • 请求包含4个部分 type Income struct { AppId string json:"app_id" Project string json:"project" TaskId string json:"task_id" Ref string json:"ref" }
    1. 进行以下处理:
    • 根据 AppId, 搜索该项目是否有特殊配置(构建前/后的命令执行),如果有,不执行刷新 job template 的操作,如果没有, 根据项目类型刷新对应的 job template
    • 根据 AppId, 获取该项目的 job url,并执行构建操作
    • Job Build 需要的参数 type Param struct { Ref string json:"Ref" TaskId string json:"TaskId" AppId string json:"AppId" Project string json:"project" Module string json:"Module" }
    1. 新增创建job端口,进行以下处理:
    • 接收发布系统的请求: type CreateIncome struct { AppId string json:"app_id" Project string json:"project" Type string json:"type"Module string json:"module" SzOrSh string json:"SzOrSh" }
    • 收到请求后,在 t_app_job 插入记录即可

  • 相关阅读:
    杂项
    导出查询数据(大数据量)
    设置现有字段自增
    C++ 矩形交集和并集的面积-离散化
    Python使用flask架构、跨域
    匈牙利命名法
    C++ main函数
    windows编译boost
    mfc HackerTools监控键盘按键
    mfc HackerTools远程线程注入
  • 原文地址:https://www.cnblogs.com/spillage/p/7047331.html
Copyright © 2011-2022 走看看