情況說(shuō)明:Jenkins配置了多個(gè)分支構(gòu)建夭坪,dev文判、test、prod室梅,每個(gè)分支有多個(gè)項(xiàng)目戏仓。
一天,突然用戶報(bào)了問(wèn)題亡鼠,后來(lái)檢查發(fā)現(xiàn)是由于數(shù)據(jù)庫(kù)字段字段不全導(dǎo)致的赏殃,然后看表記錄,發(fā)現(xiàn)5月31號(hào)及之前的記錄都是字段全的间涵,發(fā)現(xiàn)問(wèn)題那天是6月4號(hào)仁热,為什么突然現(xiàn)在就不行了呢?那時(shí)候只知道6月1號(hào)某個(gè)應(yīng)用有重新發(fā)版生產(chǎn)浑厚,也沒(méi)有具體繼續(xù)想股耽。
這部分邏輯是這樣的:應(yīng)用A會(huì)向應(yīng)用B發(fā)送數(shù)據(jù),應(yīng)用B保存到數(shù)據(jù)庫(kù)钳幅。
現(xiàn)在少了字段,打開(kāi)應(yīng)用B的日志炎滞,在生產(chǎn)重現(xiàn)問(wèn)題敢艰,發(fā)現(xiàn)B接收到的數(shù)據(jù)就少了字段,說(shuō)明問(wèn)題出現(xiàn)在應(yīng)用A册赛。
由于應(yīng)用A沒(méi)有打發(fā)送數(shù)據(jù)的日志钠导,只能看代碼邏輯震嫉。看了好久牡属,正常來(lái)說(shuō)數(shù)據(jù)字段應(yīng)該是全的票堵。看了好久逮栅,看不出什么東西悴势,決定本地連生產(chǎn)數(shù)據(jù)庫(kù)啟動(dòng)DEBUG。為了不影響生產(chǎn)環(huán)境的數(shù)據(jù)措伐,所以關(guān)閉了定時(shí)任務(wù)特纤。
開(kāi)始用POSTMAN調(diào)本地啟動(dòng)的服務(wù)器,一步步DEBUG了侥加。DEBUG到發(fā)送數(shù)據(jù)前捧存,發(fā)現(xiàn)確實(shí)是少了字段,于是繼續(xù)仔細(xì)看代碼邏輯担败。
看著看著昔穴,突然發(fā)現(xiàn)被發(fā)送的POJO就少了幾個(gè)字段。
代碼邏輯是這樣的:發(fā)送前提前,先把一個(gè)POJO(這里稱為POJO-A)的屬性COPY到另一個(gè)POJO(這里稱為POJO-B)傻咖,再把POJO-B轉(zhuǎn)成JSON發(fā)送出去,POJO-A字段是全的岖研,后面的POJO-B字段不全卿操,所以就在COPY屬性的時(shí)候丟失了。
去生產(chǎn)服務(wù)器拿下來(lái)war包孙援,發(fā)現(xiàn)POJO-B確實(shí)是少了字段害淤。因?yàn)橄氲?月31號(hào)之前是沒(méi)問(wèn)題的,然后又拿了5月31號(hào)之前的war包拓售,發(fā)現(xiàn)字段是全的窥摄。
這些POJO定義在另一個(gè)工程里面的,這里稱為工程C础淤,然后記得因?yàn)橐囊稽c(diǎn)東西崭放,在前一段時(shí)間在Jenkins用dev分支打過(guò)版,而dev分支的POJO-B恰恰是少了字段的鸽凶。
最重要的一點(diǎn)币砂,應(yīng)用A依賴有引用工程C。
所以問(wèn)題就出現(xiàn)在這里了玻侥,先用工程C的dev分支打版决摧,接著再打版應(yīng)用A的prod分支時(shí),導(dǎo)致打出來(lái)的war包依賴工程C的代碼是dev分支的,所以就出現(xiàn)了問(wèn)題~