当前位置:首页 > 科技  > 软件

vivo 互联网自研代码评审 VCR 落地实践

来源: 责编: 时间:2024-06-27 17:19:23 88观看
导读代码评审是软件质量保证一种活动,由一个或者多个人对一个程序的部分或者全部源代码进阅读理解。一般来说分为作者和评审者两种角色,作者方提供代码逻辑的介绍和代码,评审者则对提供的代码基于设计,功能性和非功能性等方面

YQ628资讯网——每日最新资讯28at.com

代码评审是软件质量保证一种活动,由一个或者多个人对一个程序的部分或者全部源代码进阅读理解。一般来说分为作者和评审者两种角色,作者方提供代码逻辑的介绍和代码,评审者则对提供的代码基于设计,功能性和非功能性等方面认知进行阅读并提出问题。常见的评审组织形式是有同行评审(Peer Review)和小组检查 (Team Inspection)两种方式。YQ628资讯网——每日最新资讯28at.com

在代码评审中,评审的目的在通过代码的评审发现潜在的问题,同时分享和表达是代码评审的重要收获,我们知道人相同在不同的文化下生产力是不同的,代码评审是一个工具,工具受文化的影响的同时也影响着文化,最终朝着我们希望的责任共担、持续改进的方向发展。YQ628资讯网——每日最新资讯28at.com

一、代码评审演进


YQ628资讯网——每日最新资讯28at.com

4)插件运行调试打包安装YQ628资讯网——每日最新资讯28at.com

Gradle构建方式进行调试打包安装YQ628资讯网——每日最新资讯28at.com

运行/调试:runIde 可以选择Debug模式或者是Run模式YQ628资讯网——每日最新资讯28at.com

图片YQ628资讯网——每日最新资讯28at.com

打包YQ628资讯网——每日最新资讯28at.com

图片YQ628资讯网——每日最新资讯28at.com

安装:可以将打的包发布市场(本地idea配置插件仓库),从Marketplace搜索插件或者是直接从Settings->plugins->Install->Install Plugin from Disk安装YQ628资讯网——每日最新资讯28at.com

图片YQ628资讯网——每日最新资讯28at.com

步骤2:研究Gerrit插件源码,搞清楚整理开发流程和模块YQ628资讯网——每日最新资讯28at.com

图片YQ628资讯网——每日最新资讯28at.com

步骤3:基于Gerrit插件规划VCR插件模块,增加clone、branch、mergeRequest、VCR模块,并对各组件增强YQ628资讯网——每日最新资讯28at.com

图片YQ628资讯网——每日最新资讯28at.com

步骤4:定制原有流程模块push,自动化关联工作项YQ628资讯网——每日最新资讯28at.com

图片YQ628资讯网——每日最新资讯28at.com


YQ628资讯网——每日最新资讯28at.com

图片YQ628资讯网——每日最新资讯28at.com

在使用Git依赖插件之前,先了解一下插件的扩展以及扩展点(Extensions、Extension Points)。YQ628资讯网——每日最新资讯28at.com

Intellij 平台提供了允许一个插件与其他插件或者 IDE 交互的 extensions 以及 extension points 的概念。YQ628资讯网——每日最新资讯28at.com

  • Extension Points:如果你想要你的插件可以被其他插件使用,那么你必须在你的插件内声明一个或多个扩展点(extension points)。每个扩展点定义了允许访问这个点的类或者接口。
  • Extensions:如果你想要你的插件扩展其他插件或者 Intellij 平台,你必须声明一个或多个 extensions。

可以在 plugin.xml 中的和块中定义 extensions 以及 extension points。YQ628资讯网——每日最新资讯28at.com

图片YQ628资讯网——每日最新资讯28at.com


YQ628资讯网——每日最新资讯28at.com

plugin.xmlYQ628资讯网——每日最新资讯28at.com

<!--依赖插件包--!><depends>Git4Idea</depends><!—idea第一次打开, 实际上就是订阅了应用程序打开的事件--><application-components><component><implementation-class>com.demo.intellij.plugin.vcr.push.VcrPushExtension$Proxy</implementation-class></component></application-components>

上述我们看到依赖的Git4Idea 包,如果我们想修改原生的的Git,先看下push依赖包中如何实现的。YQ628资讯网——每日最新资讯28at.com

Git4Idea(plugin.xml)YQ628资讯网——每日最新资讯28at.com

<extensions defaultExtensionNs="com.intellij"><pushSupport implementation="git4idea.push.GitPushSupport"/>...</extensions>

intellij-dvcs.jar(plugin.xml)YQ628资讯网——每日最新资讯28at.com

<extensionPoints>  <extensionPoint name="pushSupport"                  interface="com.intellij.dvcs.push.PushSupport"                  area="IDEA_PROJECT"                  dynamic="true"/>....</extensionPoints>

从上述可看到,Git4Idea 的GitPushSupport扩展实现push的功能点,接下来我们主要对GitPushSupport进行javassist字节码修改以达到扩展git push组件能力。YQ628资讯网——每日最新资讯28at.com

扩展使用GitPushSupport之前,需要将需要的类进行装载至GitPlugin中,然后再对GitPushSupport进行字节码改造,至此对git Push原生插件页进行改造。YQ628资讯网——每日最新资讯28at.com


YQ628资讯网——每日最新资讯28at.com

图片YQ628资讯网——每日最新资讯28at.com

步骤5:使用树状列表模式,展示一次push请求VCR提交内容及多个CR情况YQ628资讯网——每日最新资讯28at.com

主要是实现JTreeTable,对VCR与CR进行管理。YQ628资讯网——每日最新资讯28at.com

一次评审请求VCR包含所有CR的提交变更记录,可针对该变更记录进行代码评审,单个CR也可以进行评审。YQ628资讯网——每日最新资讯28at.com


YQ628资讯网——每日最新资讯28at.com

图片YQ628资讯网——每日最新资讯28at.com


YQ628资讯网——每日最新资讯28at.com

步骤6:展示变更文件视图及定制评论展示模块,精准定位代码YQ628资讯网——每日最新资讯28at.com

代码评审主要根据编辑器获取代码行及位置,评论可精准定位到代码行。YQ628资讯网——每日最新资讯28at.com

图片YQ628资讯网——每日最新资讯28at.com

1)changeBrowser变更视图展示VCR变更文件信息YQ628资讯网——每日最新资讯28at.com

图片YQ628资讯网——每日最新资讯28at.com

2)双击文件,diff视图展示inline和side-by-side两种代码差异YQ628资讯网——每日最新资讯28at.com

声明扩展,针对扩展类进行定制化改造。YQ628资讯网——每日最新资讯28at.com

plugin.xmlYQ628资讯网——每日最新资讯28at.com

<diff.DiffTool implementatinotallow="com.demo.intellij.plugin.vcr.ui.diff.VcrCommentsDiffTool$Proxy"/>


YQ628资讯网——每日最新资讯28at.com

图片YQ628资讯网——每日最新资讯28at.com

3)添加代码块评论,定位代码块YQ628资讯网——每日最新资讯28at.com

AddCommentAction.javaYQ628资讯网——每日最新资讯28at.com

public class AddCommentAction extends AnAction implements DumbAware {public AddCommentAction(String label,                        Icon icon,                        CommentsDiffTool commentsDiffTool,                                         Editor editor,                         List<CommentInfo> fileComments                        ....                        ) {    super(label, null, icon);}private CommentInput createComment() {//获取用户选择代码位置位置//行的情况下,默认是开头和行结束  得到光标的位置caretModel.getOffset();/*取到插字光标模式对象 CaretModel caretModel = editor.getCaretModel();得到光标的位置int caretOffset = caretModel.getOffset();//得到一行开始和结束的地方int lineNum = document.getLineNumber(caretOffset);int lineStartOffset = document.getLineStartOffset(lineNum);int lineEndOffset = document.getLineEndOffset(lineNum);获取一行内容String lineContent = document.getText(new TextRange(lineStartOffset, lineEndOffset));*/Document document = editor.getDocument();int lineNum  = document.getLineNumber(editor.getCaretModel().getOffset()) ;int lineStartOffset = document.getLineStartOffset(lineNum);int lineEndOffset = document.getLineEndOffset(lineNum);String lineContent = document.getText(new TextRange(lineStartOffset, lineEndOffset));.....}}

所有评论展示列表如何精准定位代码YQ628资讯网——每日最新资讯28at.com

SafeHtmlHistoryComments.javaYQ628资讯网——每日最新资讯28at.com

public class SafeHtmlHistoryComments extends JPanel {    private Iterable<CommentInfo> fileComments;    private List<CommentInfo> commentInfos = new ArrayList<>();    private CommentInfo currentCommentInfo;    private SelectedComment selectedComment;    private SelectedComment operatorSelectedComment;    private Editor editor;    public SafeHtmlHistoryComments(Editor editor,Iterable<CommentInfo> fileComments, Comment selectedComment) {        super(new BorderLayout());        ....      HistoryCommentListPanel historyCommentListPanel = new HistoryCommentListPanel(fileComments);               //双击table某行触发代码定位        historyCommentListPanel.addTableMouseDoubleHit(new Consumer<CommentInfo>() {            @Override            public void consume(CommentInfo commentInfo) {                 codeTextHit(editor,commentInfo);            }        });    }    /**     * 定位代码     * @param editor     * @param commentInfo     */    private static void codeTextHit(Editor editor, CommentInfo commentInfo) {        SelectionModel selectionModel = editor.getSelectionModel();        // 优化:如果文件修改过了,则不进行选中操作,换为提示        if (null != commentInfo.startIndex && null != commentInfo.endIndex && commentInfo.startIndex != 0 && commentInfo.endIndex != 0) {            editor.getCaretModel().moveToOffset(commentInfo.endIndex);            selectionModel.setSelection(commentInfo.startIndex, commentInfo.endIndex);        } else if (null != commentInfo.line && commentInfo.line != 0) {            int lineNum = commentInfo.line - 1;            editor.getCaretModel().moveToOffset(lineNum);            CharSequence charsSequence = editor.getMarkupModel().getDocument().getCharsSequence();            if(null!=commentInfo.range) {                RangeUtils.Offset offset = RangeUtils.rangeToTextOffset(charsSequence, commentInfo.range);                selectionModel.setSelection(offset.start, offset.end);            }else{                Document document = editor.getDocument();                int lineStartOffset = document.getLineStartOffset(lineNum);                int lineEndOffset = document.getLineEndOffset(lineNum);                selectionModel.setSelection(lineStartOffset, lineEndOffset);            }        }        editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE);    }....}

六、未来展望

6.1 自动化代码评审

  1. 代码提交评审或代码合并之前,先自动化检查(Sonar/安全扫描)快速发现并纠正潜在问题,检查成功后提交评审。
  2. 代码评审通过之后,结合流水线,自定义部署构建策略,实现快速迭代。
  3. 自动汇聚测试报告,根据评审问题类型进行分类,不断改进Sonar检查规则,从而形成良性循环。

6.2智能化代码评审

  1. 提交代码评审之后,通过AI大模型对代码进行综合评价,并给出建议。
  2. 通过智能代码评审,产生评审报告,并进行智能化分析。

本文链接:http://www.28at.com/showinfo-26-96989-0.htmlvivo 互联网自研代码评审 VCR 落地实践

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: React Query 的 useQuery 竟也内置了分页查询支持!

下一篇: 掉了两根头发后,我悟了!Vue3的Scoped原来是这样避免样式污染

标签:
  • 热门焦点
Top