情况说明:Jenkins配置了多个分支构建,dev、test、prod,每个分支有多个项目。
一天,突然用户报了问题,后来检查发现是由于数据库字段字段不全导致的,然后看表记录,发现5月31号及之前的记录都是字段全的,发现问题那天是6月4号,为什么突然现在就不行了呢?那时候只知道6月1号某个应用有重新发版生产,也没有具体继续想。
这部分逻辑是这样的:应用A会向应用B发送数据,应用B保存到数据库。
现在少了字段,打开应用B的日志,在生产重现问题,发现B接收到的数据就少了字段,说明问题出现在应用A。
由于应用A没有打发送数据的日志,只能看代码逻辑。看了好久,正常来说数据字段应该是全的。看了好久,看不出什么东西,决定本地连生产数据库启动DEBUG。为了不影响生产环境的数据,所以关闭了定时任务。
开始用POSTMAN调本地启动的服务器,一步步DEBUG了。DEBUG到发送数据前,发现确实是少了字段,于是继续仔细看代码逻辑。
看着看着,突然发现被发送的POJO就少了几个字段。
代码逻辑是这样的:发送前,先把一个POJO(这里称为POJO-A)的属性COPY到另一个POJO(这里称为POJO-B),再把POJO-B转成JSON发送出去,POJO-A字段是全的,后面的POJO-B字段不全,所以就在COPY属性的时候丢失了。
去生产服务器拿下来war包,发现POJO-B确实是少了字段。因为想到5月31号之前是没问题的,然后又拿了5月31号之前的war包,发现字段是全的。
这些POJO定义在另一个工程里面的,这里称为工程C,然后记得因为要改一点东西,在前一段时间在Jenkins用dev分支打过版,而dev分支的POJO-B恰恰是少了字段的。
最重要的一点,应用A依赖有引用工程C。
所以问题就出现在这里了,先用工程C的dev分支打版,接着再打版应用A的prod分支时,导致打出来的war包依赖工程C的代码是dev分支的,所以就出现了问题~
网友评论