写点什么

另一个 CI/CD 构建工具

作者:weichenqi
  • 2023-05-08
    浙江
  • 本文字数:2470 字

    阅读完需:约 8 分钟

另一个CI/CD构建工具

CI/CD 是 DevOPS 中的重要一环,目前常见 CI/CD 工具主要分为几类:基于 Gitlab 的 runner,Jenkins,托管式平台有 Travis CI,CircleCI,还有最近几年冒出来的诸如 GoCD 的平台。平台很多,究其设计原理大同小异。使用方法其实也差不多,通过插件,定义 yaml 文件去定义整个 CI,CD 流程。


在运维脚本化,自动化的年代,这类产品足够我们使用,通过拼装来实现我们的需求。进入平台化时代后,如何将这类开源产品和内部系统、流程有机的集成起来成为一个难题了。开源用的爽,开箱即用,到后期都是坑,想必大家都深有感触。


我一直都不喜欢 Jenkins,gitlab 的 runner 配置又复杂,托管平台不具备条件,后期目标要把相关运维平台都集成起来,怎么办呢,自己撸一个吧,说干就干。

00. 先取个名字

取名比写代码难多了,问了下 GPT,也没给出太好的建议,忽然灵光一现,就叫 OpsGoCD 吧,寓意就是一个 ops 用 golang 写了一个 CD(CI)系统,完美。

01. 软件设计


设计流程,webHook Server 收到来自 git 仓库的 push event 后插入 task_details 和 task_states 两张表,然后写入 task_list 队列。工作节点(agent)每个 5 秒发送一个心跳包给 Tcp Server,更新 agent_states 表,服务端收到客户端的心跳包后判断 agent 是否合法,任务并发是否小于等于 3; 满足条件后,从 task_list 中取构建任务返回给 agent(如果 task_list 没有任务,不返回);agent 继续每隔五秒钟发送心跳包,主要是当前 agent 的并发任务量,同时更新 node_states 表。由于每个任务由自己的协程管理,所以每个构建任务会单独发送 deploaystate 的包告诉服务端任务构建成功与否,同时更新 agent_states 表。

02. 功能

可以扩充大量工作节点,并可以高度自定义流水线环节的 CD 系统,目前功能主要从提交代码到上传镜像仓库为止,相关状态数据已经入库,可以通过开发界面,加入审批等功能,形成一个可视化的 CI/CD 系统。

03. 部署:

启用 git 的 webhook 功能,相关代码段在


cicdServer/server.go


func gitLabWebhook() {hook, _ := gitlab.New(gitlab.Options.Secret("*****"))
http.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { payload, err := hook.Parse(r, gitlab.PushEvents) if err != nil { if err == gitlab.ErrEventNotFound { } }
switch payload.(type) {
case gitlab.PushEventPayload: release := payload.(gitlab.PushEventPayload) pushDate := release.Commits[0].Timestamp.String() projectName := strings.Split(release.Repository.Name, "/")[0] branch := strings.Split(release.Ref, "/")[2] branchName := release.Ref gitSshUrl := release.Repository.GitSSHURL gitHttpUrl := release.Repository.GitHTTPURL pushUserName := release.UserUsername //insert task to redis and mysql dtd := new(todo.DeployTaskDetails) dtd.TaskId = tools.CreateTaskId() dtd.PushDate = tools.UtcDateConvert(pushDate) dtd.ProjectName = projectName dtd.BranchName = branchName dtd.Branch = branch dtd.GitSshUrl = gitSshUrl dtd.GitHttpUrl = gitHttpUrl dtd.PushUserName = pushUserName todo.AddDeployTask(dtd, sqldb, rdb) }
})http.ListenAndServe(":6060", nil)
复制代码


}


部署 mysql,版本随意,主流版本即可,导入三个 sql。


部署 redis,版本随意,主流版本即可。


修改数据库相关信息:


mysql:配置在 cicdSerevr/mypack_mysql/myMysql.go 中


func InitConn() *sql.DB {  // Set up the DSN  dsn := "cicd_user:******@tcp(127.0.0.1:3306)/wcicd"  // Open a connection to the database  sqldb, err := sql.Open("mysql", dsn)  if err != nil {    dlogger.Error(err.Error())    os.Exit(1)}
复制代码


redis:配置在 cicdSerevr/mypack_redis/myRedis.go 中


func InitRedisConn() *redis.Client {  rdb := redis.NewClient(&redis.Options{    Addr:     "localhost:6379",    Password: "******", // no password set    DB:       0,        // use default DB    PoolSize: 8,  })  err := rdb.Ping(ctx).Err()  if err != nil {    dlogger.Error(err.Error())    os.Exit(1)  }  return rdb
复制代码


}


不提出配置文件的目的在于一个二进制包就能启动,不依赖于其他文件。


目前只支持 java 项目,maven 的私服 setting.xml 文件需要自己准备,不同的 maven 镜像的工作目录和 config 目录可能所有区别,需要修改相关路径等。目前支持在 ci.yaml 自定义镜像的工作目录,不支持定义 settings 所在的目录。


需要匹配 setting.xml 路径涉及的文件在 Agent 机器上,具体文件在 cicdAgent/deploy_code/deployCode.go


func (di *DeployBasicInfo) DeployJar() (deployStat int) {...


resp, err := cli.ContainerCreate(ctx, &container.Config{  Image:      di.DeployBaseImage, //"maven:3.3-jdk-8"  Cmd:        di.DeployCmd,       //"mvn package -Dmaven.test.skip=true"  Tty:        false,  WorkingDir: di.WorkDir,}, &container.HostConfig{  AutoRemove: false,  //settings.xml in /tmp/cicdAgent/conf  Binds: []string{codeDir + ":" + di.WorkDir, "/tmp/cicdAgent/conf:/usr/share/maven/ref/"}},  nil, nil, deployImgName)
复制代码


...}


自动构建依赖 git 仓库中有 ci.yaml 文件存在,目的是为了定义项目构建的命令。


build:language: javaimage: maven:3.3-jdk-8workdir: /usr/src/mymavenscript: mvn package -Dmaven.test.skip=true
复制代码


agent 所在服务器需要安装 docker 环境,安装 git,定义好镜像仓库,定义 git 仓库等


cicdAgent/deal_image/dealImage.go中修改镜像仓库的地址,用户名,密码等
cicdAgen/deal_code/dealCode.go中修改git仓库信息,考虑通用性使用http连接,用户名,密码的方式
复制代码


分别编译运行 server 端和 agent 端。

04. 待完成工作

支持 golang 和 python 项目;缺少可视化,不会前端,大概率不会做了;代码比较粗糙,golang 初学者。

05. 仓库地址

https://github.com/weichenqi/OpsGoCD

发布于: 刚刚阅读数: 8
用户头像

weichenqi

关注

吃饭,睡觉,养娃 2021-12-17 加入

摆地摊的全能型选手

评论

发布
暂无评论
另一个CI/CD构建工具_DevOps_weichenqi_InfoQ写作社区