问题描述:

遇到过几次这种情况:开发将代码提交之后,通过打包部署,发现部署到服务器上的代码不是最新的,还是修改之前的老代码。

打包部署流程背景说明:

gitlab——》jenkins服务器打jar包——》将打好的jar包过滤并推送到服务器A上build镜像——》将镜像推送到harbor仓库——》部署容器到服务器

1、代码没有提交成功

这个情况遇到过几次。

2、jenkins上的缓存没有清除

例如:test这个服务打包会生成一个api缓存目录,这个缓存目录就是在jenkins服务器的~/.m2/repository/com/run/test-api,里面有一些打包需要引用的模块。如果这个缓存目录不删除,打包的时候就不会去更新这些引用模块的内容,导致打的包里面代码还是原来的老代码。
因此在每次打包之前,脚本要写好先rm -rf ~/.m2/repository/com/run/test-api ,再进行打包操作,这样,在打包的时候每次都会去更新这个服务需要引用的模块。

3、jenkins上面的工程目录变更,而打包脚本没有更新

例如:jenkins上有一个叫“rpc”的构建项目。有一次同事将jenkins上面的rpc改成了“IOT”,然后构建部署,发现打出来的包里面的代码不是最新的。
原因是jenkins上构建项目原来的名字是rpc,所以在jenkins的工程目录下面生成的目录也是rpc,当将rpc改成了“IOT”再构建,就会在jenkins的~/.jenkins/workspace目录下面生成新的工程目录“IOT”,最新提交的代码打好的包也是在这里。但是jenkins的打包脚本并没有更新,还是默认去~/.jenkins/rpc目录下面找打成的jar包,导致不管构建多少次,每次找到的jar包都是rpc目录下面的,都是老的包,而且jenkins构建也不会报错。
因此将jenkins打包脚本修改成到jenkins服务器的 ~/.jenkins/workspace/IOT目录下过滤jar包就OK了

4、jar包命名规则变更,脚本原有命令过滤不到包

例如:test-0.0.1.jar 这个包,原本jenkins打出来的包就是这个名字。中途开发变更了命名规则,打好的jar包名字变成了tes-0.0.1.RELEASE.jar 。但是jenkins的打包脚本并没有更新,还是用原来的命令ls ~/.jenkins/workspace/tes/target/tes-|grep -E "[0-9.]{1,7}.jar\$"去找这个jar包,然后推送到服务器A上面去build镜像。
但是因为变更了jar包的名字,找不到最新的包,实际上在jenkins的脚本里面,推送jar包到服务器A的这个步骤是执行失败了,build镜像的时候还是用的A服务器上老的jar包,然后部署到服务器上,因此还是老的代码。
需要将jar包的命令规则改回来,或者修改jenkins上过滤jar包的命令为ls ~/.jenkins/workspace/tes/target/tes-|grep -E "[0-9.]{1,7}.RELEASE.jar\$"即可
(备注:因为推送jar包、build并push镜像、部署都是在jenkins脚本里面远程完成的,找不到tes-0.0.1.RELEASE.jar这个包,jenkins构建应该是会报错的,但是第一次遇到的时候jenkins日志并没有报错,所以没有及时看出问题,但是在构建第二次的时候,就报错了,提示找不到包,需要注意这个坑)

5、Dockerfile有变更,导致打包有问题

例如下面的这个构建,在jenkins构建的时候日志并没有报异常,但是部署好的镜像却是老的代码。
在服务器A上面去手动执行build镜像,发现少了一个文件,导致其实新的镜像并没有build成功,而且harbor仓库里面镜像的更新时间也没有变化。手动build镜像报错如下:

[root@slave-4 test]# /usr/bin/docker build -t registry.seff.com/seff/test:latest /usr/local/src/test
Sending build context to Docker daemon 35.51 MB
Step 1 : FROM docker.io/java:jre-alpine
 ---> fdc893b19a14
Step 2 : ADD test.jar /var/www/
 ---> Using cache
 ---> 9be1e7e46629
Step 3 : ADD server.properties /opt/settings/
 ---> Using cache
 ---> 1a42bca461fe
Step 4 : ADD localtime /etc/
 ---> Using cache
 ---> 5668e7e0f7bb
Step 5 : WORKDIR /var/www/
 ---> Using cache
 ---> adaee0558909
Step 6 : ADD crud-dump /etc/
 ---> Using cache
 ---> 4ab8834f71a9
Step 7 : ADD crud-heap_trace.txt /etc/
**lstat crud-heap_trace.txt: no such file or directory**

因此将缺失的文件补充好,然后重新build镜像,再部署就OK了