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

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

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

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

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

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

一、代码评审演进


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

plugin.xmlSKb28资讯网——每日最新资讯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依赖包中如何实现的。SKb28资讯网——每日最新资讯28at.com

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

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

intellij-dvcs.jar(plugin.xml)SKb28资讯网——每日最新资讯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组件能力。SKb28资讯网——每日最新资讯28at.com

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


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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

AddCommentAction.javaSKb28资讯网——每日最新资讯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));.....}}

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

SafeHtmlHistoryComments.javaSKb28资讯网——每日最新资讯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原来是这样避免样式污染

标签:
  • 热门焦点
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就&ldquo;胡锡进炒股是否知道认真报道&rdquo;展开讨论。有
  • 小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    7月14日消息,今日一名博主在社交媒体发布了一张疑似小米汽车电池信息的照片,显示该电池包正是宁德时代麒麟电池,容量为101kWh,电压为726.7V,可以预测小
  • 华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    在今日举行的2023年华为云数字文娱AI创新峰会上,华为云全球Marketing与销售服务总裁石冀琳表示,华为云将在后续推出盘古数字人大模型,可帮助用户12小
Top