大家好,我是烤鸭:
整点干货,代码级别的版本统一,以及漏洞版本的扫描。
背景
两个方面吧。
-
项目整体的架构不统一,springboot/cloud 配置/注册中心也用的不统一,版本更是五花八门,怎么快速的找到问题,给出合理建议。
-
去年年底的时候都被log4j搞过,漏洞安全也被提到第一线,快读定位漏洞版本。
思路
先画一个功能大点的业务流程图,再从具体某一个点详细说下
架构统一:
- 制定规则,比如 都用springboot+cloud ,配置/注册中心 都用nacos。
- 统一版本,像springboot 2.6.7 针对不同的版本,用的基础包也不一样,尤其是nacos-client这种的,spring跨版本,这玩意就报错。
- 维护一致性,有的项目太老了,也不建议一步升级到位,需要先小幅升级一个大版本后再继续升级,这种的就需要维护一个列表范围,以及对应的中间件包。
- 做好升级指南,
- 通知提示,架构不规范的要做好醒目的提醒和提示,类似下面这种。
代码实现
maven-invoker
<!-- https://mvnrepository.com/artifact/org.apache.maven.shared/maven-invoker --><dependency><groupId>org.apache.maven.shared</groupId><artifactId>maven-invoker</artifactId><version>3.0.1</version></dependency>
指定pom路径下扫描依赖包,相当于执行 mvn dependency:list
public List<String> mvnDependencyList(String pomPath) {InvocationResult result = null;List<String> list = new ArrayList<>();try {String mavenHome = System.getenv("MAVEN_HOME");InvocationRequest request = new DefaultInvocationRequest();request.setPomFile(new File(pomPath));request.setGoals(Collections.singletonList("dependency:list"));Invoker invoker = new DefaultInvoker();invoker.setMavenHome(new File(mavenHome));invoker.setLogger(new PrintStreamLogger(System.out, InvokerLogger.INFO));final boolean[] isStart = {false};invoker.setOutputHandler(hanlder -> {if (hanlder.contains("The following files have been resolved") || hanlder.contains("---<")) {isStart[0] = true;}if (hanlder.contains("[INFO] BUILD SUCCESS")) {isStart[0] = false;}if (isStart[0]) {list.add(hanlder);}});result = invoker.execute(request);} catch (MavenInvocationException e) {e.printStackTrace();}logger.info("mvnDependencyList result =[{}]",result);return list;
}
效果如图:
解析每行的版本和版本号,和标准的进行匹配。
这个就不贴代码了,解析过程也不难。
将解析后的结果存储,进行页面展示或者邮件发出。
做成定时个功能,可以定期扫描版本。
尤其是针对需要漏洞升级的时候,特别管用,之前公司出了一版扫描pom文件中的文本内容,真的是无力吐槽了,maven项目不扫依赖扫文本,何况还有多版本冲突问题,肯定取实际编译的。
总结
- 用在公司项目的架构版本统一,方便制定规则和监控进度。
- 用于漏洞升级这种特别事件,跟上面的功能类似。
- 有git信息了,能干的事情就更多了。获取分支、tag、最新代码增量等等,做一个效能输出。
- 有了代码,还可以干代码级别的扫描,坏味道、漏洞等等,规范代码维度。
- …