首页 > 其他分享 >利用CI机制管控jar依赖树 | 京东云技术团队

利用CI机制管控jar依赖树 | 京东云技术团队

时间:2023-08-16 12:01:44浏览次数:38  
标签:CI 依赖 jar tree dependency git doc 京东

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 空文件

利用CI机制管控jar依赖树 | 京东云技术团队_CICD

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流水线)配置

利用CI机制管控jar依赖树 | 京东云技术团队_依赖关系_02

在「下载代码」原子和「Maven构建」原子中间增加原子:「自定义脚本」(必须此顺序)

利用CI机制管控jar依赖树 | 京东云技术团队_jar_03

Shell代码块:

cd ${globalParams.system.APP_IDENTIFIER}
make
  • 流程控制选择:失败继续(原因:CI修改代码需要mr评审,所以评审机制会导致push失败,无碍)

利用CI机制管控jar依赖树 | 京东云技术团队_CICD_04

4.4 配置coding

增加xn\_testdev\_ci账号 master权限,同时增加到保护分支列表权限中

利用CI机制管控jar依赖树 | 京东云技术团队_jar_05

利用CI机制管控jar依赖树 | 京东云技术团队_git_06

5. 实现效果

5.1 bamboo日志

运行完毕可以看到日志success,push发起评审即可

利用CI机制管控jar依赖树 | 京东云技术团队_git_07

5.2 coding MR记录

可以查看到bamboo账号「测试开发_持续集成」发起的mr,评审即可(只改动依赖树文件)

利用CI机制管控jar依赖树 | 京东云技术团队_CICD_08

利用CI机制管控jar依赖树 | 京东云技术团队_CICD_09

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

利用CI机制管控jar依赖树 | 京东云技术团队_git_10

利用CI机制管控jar依赖树 | 京东云技术团队_jar_11

7. 简要总结

【jar包冲突】是每个code repo和每位研发的难题 !

  • 如果我们「可以将问题避免、可以将风险前置」,那后期「维护成本必然是降低的,日常效能必然是提升的」
  • 利用CI/CD机制,将jar包依赖树作为doc文件管控到git中,将每一次变动都记录快照,按照“敏捷”思想拆解迭代(周期是每天23:00定时)自动扫描依赖关系,最早发现最早处理,别再被动了,主动出击吧!

作者:京东物流 周奕儒

来源:京东云开发者社区 自猿其说Tech 转载请注明出处

标签:CI,依赖,jar,tree,dependency,git,doc,京东
From: https://blog.51cto.com/u_15714439/7106036

相关文章

  • RPA+智能问答实现微信端智能客服 | 京东云技术团队
    背景:由于业务发展迅速,服务的商家越来越多,目前我们售后团队都是通过企业微信群和客户进行沟通,平时客户的相关问题也是在企业微信中来讨论解决;但是我们售后团队资源有限,而且有的问题客户会重复问,周末或者晚上售后同学回复不及时影响体验;最重要的一点商家客服习惯于在微信端进行咨询交......
  • 什么是 SAP CDS view 的 exposed Association
    SAPCDS是SAPHANA数据库中的一种新的数据定义语言。它允许开发者定义语义富裕的数据模型,这些数据模型可以以数据库独立的方式在ABAP服务器上使用。因此,通过CDS,开发者可以创建复杂的视图来构建ABAP程序或应用。关联(Association)在CDS视图中是一个非常重要的概念。它在C......
  • SAP CRM 的 pricing 数据库表 PRCD_HEAD
    在SAPCRM系统中,PRCD_HEAD是一个重要的数据库表,用于存储定价计划(PricingPlan)的主要信息。定价计划是一个关键的概念,它定义了在销售和定价过程中使用的价格策略和规则。PRCD_HEAD表记录了每个定价计划的基本属性和配置信息,以支持在销售交易中正确地应用定价。以下是一个详细说明S......
  • Apipost CICD怎么配置?
    配置CI/CDApipost自动化测试新增CI/CD,配置运行环境、循环次数、间隔停顿后点击保存会生成命令,在安装Apipost的服务器中输入命令即可运行测试脚本。自动化测试创建自动化测试脚本在创建好的测试用例中选择「CICD」,点击新建,配置好运行参数会生成命令。接口用例接口用例页面可以进入C......
  • Apipost CICD怎么配置?
    配置CI/CDApipost自动化测试新增CI/CD,配置运行环境、循环次数、间隔停顿后点击保存会生成命令,在安装Apipost的服务器中输入命令即可运行测试脚本。自动化测试创建自动化测试脚本在创建好的测试用例中选择「CICD」,点击新建,配置好运行参数会生成命令。  接口用例接口用例页......
  • NetSuite: Get specific Custom Record Types and related sub Custom Fields
    背景以前当使用search.create({})来获取数据时,我们需要制定特定的数据返回列;例如:search.createColumn(options)而query可以使用SELECT*FROM来动态返回所有的数据列(这在有的时候是一个优点),那么如何让search也动态返回所有的数据列呢?vararrColFlds=query.runSuiteQL({......
  • [COCI2015-2016#7] Prokletnik
    [COCI2015-2016#7]Prokletnik有那么一点点启发性。假设右端点是最大值,思路很简单很经典,考虑扫描线+线段树,那么修改涉及到的点就是当前的后缀最小值,维护一个单调不减的单调栈,那么单调栈里面的点都要改。难道我们要遍历单调栈吗?哈哈,并不用,我们直接在单调栈上面建一棵线段树就行......
  • Python库SciPy在Anaconda中的配置
      本文介绍在Anaconda环境中,安装Python语言SciPy模块的方法。  SciPy是基于Python的科学计算库,用于解决科学、工程和技术计算中的各种问题。它建立在NumPy库的基础之上,提供了大量高效、易于使用的功能,包括统计分析、信号处理、优化、线性代数、图像处理、常微分方程等等。这篇......
  • Unveiling the Power of Diagnostic Tools: Cat Caterpillar ET, Volvo Vocom II Inte
    Intherealmofautomotivediagnostics,therighttoolscanmakeallthedifference.Whetheryou'reaprofessionalmechanicoranavidcarenthusiast,havingaccesstoreliablediagnostictoolsiscrucial.Inthisblogpost,wewillexplorethecapab......
  • Go - A Tour of Go Exercise: Fibonacci closure
    packagemainimport"fmt"//fibonacciisafunctionthatreturns//afunctionthatreturnsanint.funcfibonacci()func()int{f0,f1:=0,1returnfunc()int{f:=f0f0,f1=f1,f+f1returnf}}......