博客 / 詳情

返回

利用CI機制管控jar依賴樹 | 京東雲技術團隊

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 轉載請註明出處

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.