Golang Go语言中 CI 如何按代码变更构建某个镜像?

因为 Golang 项目可以包含多个二进制文件,那 CI 构建就需要考虑仅构建代码变更的镜像。

目前解决方案根据 commit scope 来定义影响范围,但难点在于共享包修改的情况,偷懒的话可以定义粗范围,比如某个共享包影响所有或者某个大范围的镜像。

我想问你们团队一般都是怎么解决的?感谢!


Golang Go语言中 CI 如何按代码变更构建某个镜像?
9 回复

用 bazel

更多关于Golang Go语言中 CI 如何按代码变更构建某个镜像?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


分支法, 每个分支对应一个应用
文件夹法, 写 ci 判断文件夹变动了才去构建这个目录下的镜像
app/
/service1
/service2

go/callgraph 从各个入口遍历,收集所有涉及到的文件,然后和 git diff 的结果再做一个 diff 就知道了。
不过我觉得有点多余,go 编译已经挺快的了,图啥,又不是 C++编译一个小时

把多个二进制改成一个二进制的多个子命令,可以用 cobra 实现。比如,你之前是 编译出来 cli_a 、cli_b 、cli_c 三个二进制,现在用 cobra 改成一个程序入口,cli a, cli b, cli c 三个子命令,这样只有一个二进制,并且公用代码相当于只编译了一次

为啥有多个二进制?不能合在一起吗?

确实,源代码可以分开,但是集成最好做在一起,提供一个统一的工具界面

我们增加了优先级 P (比如 com 和 app 俩个分类), 确认 commit scope , 根据 P 定义顺序,P.com 全部完成之后执行 P.app 部分 。 这方法比较通用,不仅是在 Golang 项目。

针对大的 monorepo ,就一个方法,通过依赖图反查改动 package 的影响范围。但这个事情还是挺麻烦的,所以用 bazel 吧嘿嘿嘿,它设计思路就是这个。除了学习成本有点高,用了你就会喜欢上的

在Go语言中,通过持续集成(CI)系统根据代码变更来构建特定镜像,通常涉及以下几个关键步骤:

  1. 代码版本控制:确保代码变更通过Git等版本控制系统进行管理。每次代码提交都会触发CI系统的构建流程。

  2. CI配置:在CI配置文件中(如.github/workflows/ci.yml对于GitHub Actions,或.gitlab-ci.yml对于GitLab CI),定义触发构建的条件(如代码推送到特定分支)。

  3. Dockerfile:在项目的根目录或特定目录中创建Dockerfile,该文件定义了镜像的构建步骤。包括基础镜像、复制代码、设置环境变量、构建Go项目等。

  4. 构建脚本:在CI配置中调用Docker构建命令,如docker build -t your-repo/your-image:tag .。确保使用CI环境变量(如${GIT_COMMIT})来标记镜像版本,以便于追踪。

  5. 镜像推送:构建成功后,将镜像推送到Docker Hub或其他容器镜像仓库。使用docker push your-repo/your-image:tag命令,并配置相应的认证信息。

  6. 缓存优化:为了加快构建速度,可以利用CI系统提供的缓存功能,缓存依赖项下载和构建中间产物。

  7. 通知与监控:配置CI系统发送构建状态通知,集成到Slack、邮件等通讯工具,确保团队成员及时了解构建结果。

通过上述步骤,可以有效实现Go项目中基于代码变更的自动化镜像构建流程。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!