jenkins自动化构建maven项目时,如何避免重复构建代码无变更模块

程序散人 发布于 2020/06/19 17:17
阅读 762
收藏 0

我们使用jenkins自动化构建maven项目,构建完成后,将构建完成的所有的jar包 约11个 ,通过脚本脚本处理至打包服务器,打包服务器按照规则将每一个服务制作成docker镜象,统一使用。

长期下来发现,构建速度比较慢。因为服务拆分的比较多,任何一个子模块的变更都会触发整体项目重新构建,重新打包,造成大量的时间maven在构建没有变更的模块,docker镜象仓库也因为长期的无变更模块的也需要打包镜象而变得臃肿。

 

想了解下大家是怎么处理这个问题的? 

附CI-CD流程图一张:

加载中
0
哎码
哎码

让每一个模块触发各自的流程

哎码
哎码
回复 @四十大盗与阿里巴巴 : 大概就是这个意思,要不就拆分多个模块,每个模块触发不同的流程;如果非要用同一个流程,就在流程中判断,如果某个模块没有变化,就直接读取缓存,当然这样可能会不好实现。所以我觉得拆分是比较简单的
程序散人
程序散人
回复 @哎码 : 你的意思是把一个项目每个模块都导入jenkins作为项目么?
哎码
哎码
如果互相依赖的话,就按顺序触发各个模块
0
机器人-1
机器人-1

maven可以指定打包哪个子模块。

程序散人
程序散人
是的。但是如果每次打包都需要指定打包哪个子模块,这样子的话,每一次构建,就都需要开发人员去手动修改jenkins的配置,感觉有点儿麻烦呢。
0
巴拉迪维
巴拉迪维

不构建代码没有更改的模块,不是 jenkins 能决定的。

如果是 maven 构建的项目,一般情况而言,你每次打包的应该是「你需要启动的入口」模块就好,用下面的命令打包需要启动的入口模块,该模块依赖的其他模块(仅仅是依赖的)也会被打包处理。

mvn -pl 入口模块 -am clean install -DskipTests

如此,被「入口模块」依赖的模块会被 clean install,而其他不被依赖的模块就不会被处理了。

巴拉迪维
巴拉迪维
回复 @四十大盗与阿里巴巴 : 除了手工构建之外,你也可以配置 jenkins 定时构建。eg:上午上班的时候构建一次、中午休息时构建一次、下午再构建一次。前提是:git 提交的代码必须是能通过编译的,不允许提交不能通过编译的代码。
程序散人
程序散人
回复 @巴拉迪维 : 目前我们都是手工来点击构建的。git提交的规范性一直实行的不是很好,jenkins自动触发构建频率太高了,我们没有使用自动触发构建。 我仔细研究下回调,能不能可行。 感谢
巴拉迪维
巴拉迪维
回复 @四十大盗与阿里巴巴 : 用 git 回调去触发 jenkins 构建的话,是会出现这样的问题。你们可以对回调进行管理,只有入口模块有回调的时候,再触发 jenkins 构建是不是可行呢?
程序散人
程序散人
如果是这个样子的话,每次构建就需要去变更jenkins中 build的参数配置。我的理想状态当然是不希望开发搞这个的。
0
机器人-1
机器人-1

我们是每个模块单独创建了一个jenkins任务

程序散人
程序散人
我暂时没有找到创建项目,但是不指定Source Code Management来源的。 如果都使用同一来源,就会有一个项目如果分了11个模块,代码检出11份同样的代码。每个项目构建自己需要的模块这样的情况
程序散人
程序散人
每个模块单独创建一个jenkins任务,对应的,每个模块也都需要一个git地址吧?
0
HChan916
HChan916

这里可以选择增量构建,不晓得能不能满足你们的现有构建场景

 

程序散人
程序散人
不满足。 现在这个问题已经处理掉了,通过POM里边开关模块来确定需要构建哪些。
0
osc_13362983
osc_13362983

我现在也是遇到这个问题,一个项目多个模块,但是有时候只改一个模块的代码,jenkins会全部构建一次,请问你怎么解决的呢

 

程序散人
程序散人
回复 @osc_13362983 : 我们认为我们的构建频率不需要git触发。。手动点的。。 任务完成,手发动触发构建,上报测试镜象ID 测试在k8s UI上填入直接变更镜象ID运行就可以。
osc_13362983
osc_13362983
回复 @是胖十啊 : 那你们做没做触发式构建啊
程序散人
程序散人
回复 @osc_13362983 : 脚本不是在jenkins中弄的,是shell脚本,jenkins中负责调取shell脚本。shell脚本根据jenkins传输至构建服务器的构建结果jar包来判断,需要打包哪些服务镜象。
osc_13362983
osc_13362983
回复 @是胖十啊 : 我现在是这样,Root POM我是直接指定的是子模块的pom,如果改为主pom会报找不到pom,还有你说的增加模块化构建脚本是在jenkins中弄吗?你们现在解决后jenkins里就一个项目跑所有模块吗
osc_13362983
osc_13362983
不太懂
下一页
0
仇犹
仇犹

多模块项目会存在这样的问题,我是在jenkins里将每个模块做成一个任务,其中包括一个公共依赖的任务,让所有任务都从同一个git本地仓库拉代码,可以节省代码的同步时间,然后在公共依赖任务里打包公共的jar,扔到本地maven里,没改动时候不需要再次打包公共任务;其他单个项目只打包自己模块的代码,从maven里获取依赖的包。

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部