1. 現狀·問題
你還記得你排查jar衝突的付出麼?
為了有效控制jar包更新帶來的未知jar引入和變動,我們經常使用dependency-tree來查看依賴關係排查問題,通常是出現問題再被動分析和排查,此時人力成本是巨大的,同時系統已出問題,沒有後悔藥。
2. 分析原因
jar包依賴是異變的,且隱形的,jar衝突導致的問題經常發生,研發無法每次都關注其變化。
3. 採取措施
採用“敏捷”思想,小步走,每天定時監控jar包依賴關係的變化,讓風險前置,主動顯現出未知的問題。
技術解決問題,CI/CD能力降低研發成本,每天23:00定時自動執行,All研發每天關注 jar doc change ~
—— 我們將依賴樹作為文件進行git版本控制,同時維護到CI上自動管控jar依賴關係的變更,這樣可以即時發現依賴關係的變動。流水線定時每日觸發掃描依賴樹,保證每日最新,發現有變動即時發起doc變更,當研發關注到mr後,可以查看前一日是who改動了what,有效管理jar包。
4. 實踐步驟
4.1 創建Makefile文件
根目錄:doc/dependency-tree.txt 空文件
Makefile
dependency-tree:
@mvn clean -U package -Dmaven.test.skip=true dependency:tree -Dverbose -DoutputFile=target/dependency-tree.txt --settings settings.xml
@grep -v 'omitted for' wms-outbound-web/target/dependency-tree.txt | grep -vw "tests" | grep -vw "test" | sed -e 's/TEST-SNAPSHOT/SNAPSHOT/g' > doc/dependency-tree.txt
@git add doc/dependency-tree.txt
@git commit -m "fix: [CI make dependency-tree]依賴樹變更"
@git push origin HEAD:master
settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"
xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<localRepository>./maven/repository</localRepository>
<profiles>
<profile>
<id>Repository</id>
<repositories>
<repository>
<id>nexus</id>
<name>local private nexus</name>
<url>***</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>libs-releases</name>
<url>***</url>
</repository>
<repository>
<snapshots>
<updatePolicy>always</updatePolicy>
</snapshots>
<id>snapshots</id>
<name>libs-snapshots</name>
<url>***</url>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>***</activeProfile>
</activeProfiles>
</settings>
4.2 修改gitignore文件
- gitignore添加內容
/maven
4.3 配置bamboo
選擇定時觸發的流水線(master流水線)配置
在「下載代碼」原子和「Maven構建」原子中間增加原子:「自定義腳本」(必須此順序)
Shell代碼塊:
cd ${globalParams.system.APP_IDENTIFIER}
make
- 流程控制選擇:失敗繼續(原因:CI修改代碼需要mr評審,所以評審機制會導致push失敗,無礙)
4.4 配置coding
增加xn\_testdev\_ci賬號 master權限,同時增加到保護分支列表權限中
5. 實現效果
5.1 bamboo日誌
運行完畢可以看到日誌success,push發起評審即可
5.2 coding MR記錄
可以查看到bamboo賬號「測試開發_持續集成」發起的mr,評審即可(只改動依賴樹文件)
6. 效能提升
2021/10/19~至今,此實踐 發現42次依賴變動,其中7次發現了代碼問題(研發已即時處理,否則每次未知的依賴變動都對應 >1 的研發成本)
效能量化 模擬:2021/10/19~至今
| 提效前(/人天) | 提效後(/人天) | |
|---|---|---|
| 出現jar包衝突問題第1次 | 2(今日發現,問題jar已引入半年之久,人力排查成本代價巨大) | 0.1(已前置發現異常並處理,早期成本代價極低,此衝突被避免) |
| 出現jar包衝突問題第2次 | 2.5(明日發現,需要mvn依賴樹一一排查,發現jar引入更早,成本更大) | 0.5(即時出現衝突,分析doc的git history直接定位引入變動) |
| 出現jar包衝突問題第3次 | 3(多日後發現,問題jar已無法溯源引入時機,依賴關係混亂,只能研發互相詢問,回憶) | 0.5(同上,doc git history定位引入變動) |
| ...... | ...... | ...... |
| 出現jar包衝突問題n次以上,總成本計算 | >2*n | <0.5*n |
7. 簡要總結
【jar包衝突】是每個code repo和每位研發的難題 !
- 如果我們「可以將問題避免、可以將風險前置」,那後期「維護成本必然是降低的,日常效能必然是提升的」
- 利用CI/CD機制,將jar包依賴樹作為doc文件管控到git中,將每一次變動都記錄快照,按照“敏捷”思想拆解迭代(週期是每天23:00定時)自動掃描依賴關係,最早發現最早處理,別再被動了,主動出擊吧!
作者:京東物流 周奕儒
來源:京東雲開發者社區 自猿其説Tech 轉載請註明出處