问题背景
目前工程打包是有一套完整的自动化流程的
- 由idea提交代码到git
- 在jenkins中访问git并check对应分支打包成docker镜像上传
- 在云平台上拉取相应的镜像并部署
整套自动化部署过程非常方便,但是相应的也因为一环套一环都是由外部系统来进行一些打包工作,灵活性会稍微差一些。这一次的问题就是一个需要通过联动解决的问题。
具体问题描述如下:
在工程中会需要使用每次打包的版本号,比如说用在做缓存key的hash以防不同版本的包之间缓存冲突。但是版本号属于打包时的参数,如果是写在properties配置文件里面,每次版本变动的时候都在ide里面修改完版本号然后提交到git上这种做法会有以下问题: - 会忘,这是最重要的,因为版本号和逻辑没有关系,在提交代码的时候没有修改配置文件的版本号会忘太正常了。
- git管理混乱,会提交出非常多只为了修改一下配置文件的版本号的版本。
上面罗里吧嗦说了一大堆,问题其实可以简化成:
在用jenkins打包Maven管理的java工程时,如何动态的用在jenkins输入的参数代替掉java工程properties配置文件的参数
解决方案
首先是jenkins打包时的输入参数
图中可以看到,我给出了三个外部输入参数用于打包。其中我需要版本号version来替换工程中的默认值。为了达到这个目的需要几步操作配合。
-
在properties配置文件定义好默认参数,程序可以读取该参数值做为版本号的参考,值填写el表达式。
-
在pom文件中准备变量的默认值
-
在pom文件的resource标签中定义扫描el表达式的范围,filtering标签为true代表会去扫描el表达式并用环境变量去覆盖。也就是在第一步中填写的值
- 打包时的maven命令,先随意填一个版本号进行测试
mvn clean package -Dcache_version=V123456 -DskipTests -Pdev
可以看到上面的打包命令中携带了所要定义的版本号,打包结束后看到target目录下的classes目录下,properties文件果然被替换为mvn命令中的参数。
maven的工作算是完成了,接下来要如何将jenkins和maven联系起来 -
回到jenkins的配置界面,在build一栏中,也用el表达式来替换刚才填写的测试版本号
到这里,就实现了在jenkins填写版本号就可以一步到位修改配置文件里面的版本号从而避免大量的麻烦和可能存在的失误打包问题。
后续总结
其实是一个比较常见的需求以及并不算复杂的问题,但是困难在于无法搜索到现成的方案可以解决以及多套系统的串联,所以就自己去思考并设计方案来串联起整条链路,权当记录。
网友评论