Golang Go语言中 CI 如何按代码变更构建某个镜像?
因为 Golang 项目可以包含多个二进制文件,那 CI 构建就需要考虑仅构建代码变更的镜像。
目前解决方案根据 commit scope 来定义影响范围,但难点在于共享包修改的情况,偷懒的话可以定义粗范围,比如某个共享包影响所有或者某个大范围的镜像。
我想问你们团队一般都是怎么解决的?感谢!
Golang Go语言中 CI 如何按代码变更构建某个镜像?
分支法, 每个分支对应一个应用
文件夹法, 写 ci 判断文件夹变动了才去构建这个目录下的镜像
app/
/service1
/service2
把多个二进制改成一个二进制的多个子命令,可以用 cobra 实现。比如,你之前是 编译出来 cli_a 、cli_b 、cli_c 三个二进制,现在用 cobra 改成一个程序入口,cli a, cli b, cli c 三个子命令,这样只有一个二进制,并且公用代码相当于只编译了一次
为啥有多个二进制?不能合在一起吗?
确实,源代码可以分开,但是集成最好做在一起,提供一个统一的工具界面
针对大的 monorepo ,就一个方法,通过依赖图反查改动 package 的影响范围。但这个事情还是挺麻烦的,所以用 bazel 吧嘿嘿嘿,它设计思路就是这个。除了学习成本有点高,用了你就会喜欢上的
在Go语言中,通过持续集成(CI)系统根据代码变更来构建特定镜像,通常涉及以下几个关键步骤:
-
代码版本控制:确保代码变更通过Git等版本控制系统进行管理。每次代码提交都会触发CI系统的构建流程。
-
CI配置:在CI配置文件中(如
.github/workflows/ci.yml
对于GitHub Actions,或.gitlab-ci.yml
对于GitLab CI),定义触发构建的条件(如代码推送到特定分支)。 -
Dockerfile:在项目的根目录或特定目录中创建Dockerfile,该文件定义了镜像的构建步骤。包括基础镜像、复制代码、设置环境变量、构建Go项目等。
-
构建脚本:在CI配置中调用Docker构建命令,如
docker build -t your-repo/your-image:tag .
。确保使用CI环境变量(如${GIT_COMMIT}
)来标记镜像版本,以便于追踪。 -
镜像推送:构建成功后,将镜像推送到Docker Hub或其他容器镜像仓库。使用
docker push your-repo/your-image:tag
命令,并配置相应的认证信息。 -
缓存优化:为了加快构建速度,可以利用CI系统提供的缓存功能,缓存依赖项下载和构建中间产物。
-
通知与监控:配置CI系统发送构建状态通知,集成到Slack、邮件等通讯工具,确保团队成员及时了解构建结果。
通过上述步骤,可以有效实现Go项目中基于代码变更的自动化镜像构建流程。