情況說明:Jenkins配置了多個分支構(gòu)建,dev、test、prod,每個分支有多個項目。
一天,突然用戶報了問題,后來檢查發(fā)現(xiàn)是由于數(shù)據(jù)庫字段字段不全導(dǎo)致的,然后看表記錄,發(fā)現(xiàn)5月31號及之前的記錄都是字段全的,發(fā)現(xiàn)問題那天是6月4號,為什么突然現(xiàn)在就不行了呢?那時候只知道6月1號某個應(yīng)用有重新發(fā)版生產(chǎn),也沒有具體繼續(xù)想。
這部分邏輯是這樣的:應(yīng)用A會向應(yīng)用B發(fā)送數(shù)據(jù),應(yīng)用B保存到數(shù)據(jù)庫。
現(xiàn)在少了字段,打開應(yīng)用B的日志,在生產(chǎn)重現(xiàn)問題,發(fā)現(xiàn)B接收到的數(shù)據(jù)就少了字段,說明問題出現(xiàn)在應(yīng)用A。
由于應(yīng)用A沒有打發(fā)送數(shù)據(jù)的日志,只能看代碼邏輯??戳撕镁茫碚f數(shù)據(jù)字段應(yīng)該是全的??戳撕镁?,看不出什么東西,決定本地連生產(chǎn)數(shù)據(jù)庫啟動DEBUG。為了不影響生產(chǎn)環(huán)境的數(shù)據(jù),所以關(guān)閉了定時任務(wù)。
開始用POSTMAN調(diào)本地啟動的服務(wù)器,一步步DEBUG了。DEBUG到發(fā)送數(shù)據(jù)前,發(fā)現(xiàn)確實是少了字段,于是繼續(xù)仔細看代碼邏輯。
看著看著,突然發(fā)現(xiàn)被發(fā)送的POJO就少了幾個字段。
代碼邏輯是這樣的:發(fā)送前,先把一個POJO(這里稱為POJO-A)的屬性COPY到另一個POJO(這里稱為POJO-B),再把POJO-B轉(zhuǎn)成JSON發(fā)送出去,POJO-A字段是全的,后面的POJO-B字段不全,所以就在COPY屬性的時候丟失了。
去生產(chǎn)服務(wù)器拿下來war包,發(fā)現(xiàn)POJO-B確實是少了字段。因為想到5月31號之前是沒問題的,然后又拿了5月31號之前的war包,發(fā)現(xiàn)字段是全的。
這些POJO定義在另一個工程里面的,這里稱為工程C,然后記得因為要改一點東西,在前一段時間在Jenkins用dev分支打過版,而dev分支的POJO-B恰恰是少了字段的。
最重要的一點,應(yīng)用A依賴有引用工程C。
所以問題就出現(xiàn)在這里了,先用工程C的dev分支打版,接著再打版應(yīng)用A的prod分支時,導(dǎo)致打出來的war包依賴工程C的代碼是dev分支的,所以就出現(xiàn)了問題~