请教大佬, Golang 的 CI 如何按代码变更构建某个镜像?

206 天前
 istomyang

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

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

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

1927 次点击
所在节点    Go 编程语言
8 条回复
just1
206 天前
用 bazel
seth19960929
206 天前
分支法, 每个分支对应一个应用
文件夹法, 写 ci 判断文件夹变动了才去构建这个目录下的镜像
app/
/service1
/service2
GenericT
206 天前
go/callgraph 从各个入口遍历,收集所有涉及到的文件,然后和 git diff 的结果再做一个 diff 就知道了。
不过我觉得有点多余,go 编译已经挺快的了,图啥,又不是 C++编译一个小时
mshadow
206 天前
把多个二进制改成一个二进制的多个子命令,可以用 cobra 实现。比如,你之前是 编译出来 cli_a 、cli_b 、cli_c 三个二进制,现在用 cobra 改成一个程序入口,cli a, cli b, cli c 三个子命令,这样只有一个二进制,并且公用代码相当于只编译了一次
lysShub
206 天前
为啥有多个二进制?不能合在一起吗?
xhd2015
206 天前
@lysShub 确实,源代码可以分开,但是集成最好做在一起,提供一个统一的工具界面
uliah
205 天前
我们增加了优先级 P (比如 com 和 app 俩个分类), 确认 commit scope , 根据 P 定义顺序,P.com 全部完成之后执行 P.app 部分 。 这方法比较通用,不仅是在 Golang 项目。
just1
205 天前
针对大的 monorepo ,就一个方法,通过依赖图反查改动 package 的影响范围。但这个事情还是挺麻烦的,所以用 bazel 吧嘿嘿嘿,它设计思路就是这个。除了学习成本有点高,用了你就会喜欢上的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1028507

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX