研发效能提升 maven依赖扫描 版本统一 漏洞版本提醒

大家好,我是烤鸭:

   整点干货,代码级别的版本统一,以及漏洞版本的扫描。

背景

两个方面吧。

  • 项目整体的架构不统一,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、最新代码增量等等,做一个效能输出。
  • 有了代码,还可以干代码级别的扫描,坏味道、漏洞等等,规范代码维度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[vue] 你期待vue3.0有什么功能或者改进的地方?

[vue] 你期待vue3.0有什么功能或者改进的地方&#xff1f; 用尤大的话说就是各种速度提升n倍。我希望在依赖node_modules能够做出调整&#xff0c;文件数目太多&#xff0c;开启项目每次都要下载个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&…

Spring boot actuator端点启用和暴露

1.启用端点 默认情况下&#xff0c;除了shutdown端点是关闭的&#xff0c;其它的都是启用的。配置一个端点的启用&#xff0c;使用management.endpoint..enabled属性&#xff0c;下面的例子是启用shutdown端点&#xff1a; management.endpoint.shutdown.enabledtrue如果你个人…

java执行sql慢 navicat不慢 见鬼了

大家好&#xff0c;我是烤鸭&#xff1a; 有点意思的问题&#xff0c;代码提示接口超时(10s)&#xff0c;接口逻辑很简单&#xff0c;就一个sql查询。本来也想是sql慢&#xff0c;可是拿sql去Navicat执行下&#xff0c;一点不慢(50ms)。 环境 DB&#xff1a;SqlServer 连接池…

[vue] vue边界情况有哪些?

[vue] vue边界情况有哪些&#xff1f; 访问根实例、访问父组件、子组件个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

函数的基础

函数的初识&#xff1a; 封装一个功能。 def 函数名(): 函数体 函数的返回值&#xff1a;return 1,结束函数。 2&#xff0c;返回给执行者&#xff08;函数名()&#xff09;值。 return ----> None return 单个值----> 单个值 return 多个值----> &#xff08;多…

windows docker mongodb

大家好&#xff0c;我是烤鸭&#xff1a; 今天翻博客&#xff0c;发现4年前的一篇草稿&#xff0c;抽空给完善下。原本草稿写的是linux下mongo使用&#xff0c;还有java的一些api&#xff0c;现在就用容器实现下。 容器部署 官方网站&#xff1a; https://www.mongodb.com/ w…

[vue] 如何在子组件中访问父组件的实例?

[vue] 如何在子组件中访问父组件的实例&#xff1f; this.$parent拿到父组件实例 this.$children拿到子组件实例&#xff08;数组&#xff09;个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录…

[vue] watch的属性用箭头函数定义结果会怎么样?

[vue] watch的属性用箭头函数定义结果会怎么样&#xff1f; 因为箭头函数默绑定父级作用域的上下文&#xff0c;所以不会绑定vue实例&#xff0c;所以 this 是undefind个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢…

tensorflow的keras 与 原生keras几点比较

tensorflow的keras 与 原声keras几点比较&#xff0c;不是全面的比较&#xff0c;因为只是就使用时候发现的差异&#xff01; 使用函数式API时&#xff1a; 1. 定义模型模型时&#xff0c;用到输入的张量&#xff0c;也就是给Input的tensor赋值为你的inputs&#xff0c;在编译时…

[vue] 在vue项目中如何配置favicon?

[vue] 在vue项目中如何配置favicon&#xff1f; 也可以在当前项目部署的端口主目录下存放favicon.ico文件&#xff0c;默认就会显示该图标个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与…

Is the byte array a result of corresponding serialization for DefaultDeserializer

大家好&#xff0c;我是烤鸭&#xff1a; 问题记录&#xff0c;上线之后懵逼的问题。只能回滚?每次都是上线来暴击&#xff0c;不然多查查文章也不至于这么被动。 报错日志 org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nes…

[vue] 你有使用过babel-polyfill模块吗?主要是用来做什么的?

[vue] 你有使用过babel-polyfill模块吗&#xff1f;主要是用来做什么的&#xff1f; Babel默认只转换新的JavaScript句法&#xff08;syntax&#xff09;&#xff0c;而不转换新的API&#xff0c;比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局对…

高级PHP工程师所应该具备的专业素养

高级PHP工程师所应该具备的专业素养 初次接触PHP&#xff0c;就为他的美所折服&#xff0c;于是一发不可收拾。 很多面试&#xff0c;很多人员能力要求都有“PHP高级工程师的字眼”&#xff0c;如果您真心喜欢PHP&#xff0c;并且您刚起步&#xff0c;那么我简单说说一个PHP高级…

容器环境 springcloud gateway grafana prometheus采集集成与问题

容器环境 springcloud gateway grafana prometheus采集集成与问题 大家好&#xff0c;我是烤鸭&#xff1a; 记录下网关上容器后&#xff0c;监控升级的过程。 原来的方式 grafana 和 prometheus 网上教程很多&#xff0c;就不细写了。 没上容器之前&#xff0c;可以在…

elasticsearch 问题

elasticsearch 的端口默认绑定到 127.0.0.1 上&#xff0c;对外开放 http 端口就配置 http.host&#xff0c;对外开放 tcp 端口就配置 network.host [1]: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]编辑 /etc/security…

[vue] 说说你对vue的错误处理的了解?

[vue] 说说你对vue的错误处理的了解&#xff1f; 分为errorCaptured与errorHandler。 errorCaptured是组件内部钩子&#xff0c;可捕捉本组件与子孙组件抛出的错误&#xff0c;接收error、vm、info三个参数&#xff0c;return false后可以阻止错误继续向上抛出。 errorHandler…

easyui Combotree 怎么加载数据 支持多选

1、开发环境vs2012 mvc4 c# 2、HTML前端代码 <% Page Language"C#" AutoEventWireup"true" CodeBehind"DataGridTest.aspx.cs" Inherits"MvcAppTest.DataGridTest" %><!DOCTYPE html><html xmlns"http://www.w3.…

[vue] 在vue事件中传入$event,使用e.target和e.currentTarget有什么区别?

[vue] 在vue事件中传入$event&#xff0c;使用e.target和e.currentTarget有什么区别&#xff1f; event.currentTarget指向事件所绑定的元素&#xff0c;而event.target始终指向事件发生时的元素。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&am…

idea 错误: 找不到或无法加载主类(汇总贴)

大家好&#xff0c;我是烤鸭&#xff1a; 现在是采坑实录。 idea 错误: 找不到或无法加载主类 xxx.xxx.xxxxx JDK环境&#xff0c;maven项目还是ee还是web项目&#xff0c;是否都正常。 如果是用idea打开的话,在源码目录上点击右键,然后找到Mark directory as->source ro…

C语言——生命游戏(初始

#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<windows.h> #include<time.h>#define High 25 #define Width 50 //游戏画面的尺寸int cells[High][Width]; //所有位置细胞生为1&#xff0c;死亡为0void gotoxy(…