在项目得运维中,大致分为如下几种情况,这里不谈容器化
1、jar包形式,直接部署,多用于springboot 项目中
2、war+jar形式
3、war+class形式
那么针对第一种情况,最方便也无需过多得考虑,就是全量部署、但是不乏有很多老旧得项目,增量好几年甚至10来年得项目,无法全量上,这时候如何通过jenkins 进行增量自动化上线呢?
大家一定头疼于通过开发人员打增量包得情形,环境得不同,开发人员得马虎大意等情况上线出现各种各样得问题。
对于第二种与第三种方案差不多,讲解下第三种方案,适用于第二种
首先先提出一个思路、项目编译还是通过maven 或者 ant 文件提取还是通过,git命令+shell处理逻辑,那么其实这里与jenkins 没任何关系。jenkins在其中是可以被随意替换掉的。
下面开始讲解思路:
让测试,预生产与生产环境保持同一套操作流程是最优选择
开发人员开发过程中创建了一个分支开发完成后将分支合并到测试分支(或master),这个时候去点击jenkins 立即构建,构建完成后,需要取出本次变更内容,并且提取相关class文件(排除配置文件,当然如果你用上配置中心当然最好,否则如果配置文件有变更,你需要手动添加测试环境或者生产环境得配置)。然后将相关class以及相关环境得配置,打成一个增量包,后续通过sh进行发布处理。
如何从 git中获取本次得变更记录呢?
可以通过以下方法
1、将当前id与上一次id进行对比,提取出变更得文件
可以使用git命令 git diff --name-status pre_id current_id|egrep "A|M"|awk '{print $2}'
pre_id与 current_id 在系统中存在两个环境变量分别是$GIT_PREVIOUS_SUCCESSFUL_COMMIT和$GIT_COMMIT
意味着可以直接使用这两个环境变量代替或者也可以直接指定两个提交id,这里看大家自己得策略。
获取出来得路径应该如下
xxx/yyy/src/main/java/com/aaa/bbb/controller/
参考自己的项目机构看看编译后的项目class路径与这个路径有什么异同。通过求同的思想,将其做相应处理之后得到class路径如下:
\classes\com\aaa\bbb\controller\
(如果有内部类\classes\com\aaa\bbb\controller\UserContreller$)
这个提取需要注意的点:
1、一些内部类
2、删除的文件处理
3、同名不同包的文件
关于如何处理这些问题。大家自行思考吧。
提取出来后就可以根据文件路径进行创建目录以及拷贝文件。可以直接使用命令
mkdir -p \tmp\com\aaa\bbb\controller\
直接创建好目录,然后copy path\classes\com\aaa\bbb\controller\ \tmp\com\aaa\bbb\controller\ 下
最后 压缩成包,scp至目标tomcat 解压大功告成