当前位置: 首页 > news >正文

Ebay开源:Eclipse Plugin Repository Portal

作者:Vivien Shen, Eric Cai,Caddie Song, Paul Zhang

背景

Eclipse插件的开发工作,通常包括插件的开发测试和插件的发布管理,开发周期大致如下:开发人员开发插件,完成后移交测试人员,测试通过后再发布到Update Site,用户通过Eclipse从指定的Update Site安装插件。对于开发和测试人员来说,他们的首要工作是确保插件满足用户需求,而非频繁的管理和发布插件。由于插件的管理和发布通常需要执行一系列冗长的命令,不仅低效,且易于出错,因此我们开发了Eclipse Plugin Repository Portal(下文简称EPRP) ,旨在让插件管理变得简单且更有条理。这个工具目前已经开源,感兴趣的朋友可以从https://github.com/eBay/P2Portal下载并安装,也可以通过在Github上提交pullrequest参与开发讨论。

概述

 


EPRP简而言之就是一个Eclipse插件(Plugin)管理系统,如图1所示,它提供了一个统一的web接口供开发和测试人员进行插件的发布和升级等等,终端用户通过其生成的Update Site进行插件的安装与更新。它具有如下的特点:

1)      可视化管理界面

2)      简化的流程和操作

3)      可靠的发布流程

通过这个系统,用户可完成如下操作:

1)      创建和管理Repository 和Composite

2)      发布(Publish)和镜像(Mirror)插件

3)      编辑用于插件分组的Category信息

4)      查看及回滚(Rollback)操作历史

5)      同步(Synchronize)Site


EPRP相关术语如下:

1)      Plugin----译作插件,指一个独立的符合OSGI规范的Bundle,可导出为一个自包含(self-contained)和自描述(self-describing)的 Java™Archive (JAR),插件可依赖别的插件。

2)      Feature----本文特指插件的组合,便于分发安装

3)      Product----本文特指用于创建一个类Eclipse的富客户端产品(也叫RCP),包含了一组Feature及产品的基本信息如启动参数,图标和闪屏等。

4)      Update Site----译作更新服务器, 用于发布和管理插件,用户通过该服务器安装或升级Eclipse插件。

5)      Repository----特指插件仓库,简单的说就是Eclipse安装软件的地方,位于UpdateSite上的一个目录,目录中存放相互关联的一组插件和插件安装所需的元信息。

6)      Composite----聚合多个子Repository作为一个统一入口。用户可以通过其URL查看到所有子Repository的内容。

7)      Category----用于将插件分组,如Findbugs,TestNG可以归类到测试工具。

8)      Publish----将插件发布到Repository。

9)      Mirror----将插件从第三方的Repository克隆至我们的Repository。

10)  Site----这是EPRP引入的一个术语,用于管理Repository在不同的软件开发阶段的状态。如Dev Site供开发人员使用,QA Site供测试人员使用,Release Site供最终用户使用。

 

如图2所示,EPRP可以管理Repository或Site,Repository操作包括新建Repository,通过Publish或Mirror来更新Repository内容, 使用Composite来聚合多个Repository,回滚到历史版本,编辑Category等。Site操作包括新建和删除一个Site以及Site间的同步。系统维护了相关的操作历史。

EPRP工作流程


如图3所示,插件开发人员通过Publish或Mirror的功能在Dev Site里创建多个Repository,用Composite聚合多个Repository,也可以为Repository添加分类信息,还可以对错误的操作进行回滚,在移交QA测试之前将Dev Site 同步至QA Site。测试人员基于QA Site进行测试,在测试完成后把QA Site同步到Release Site。最终用户即可在Eclipse里看到相关的升级。

EPRP插件管理

EPRP对插件的管理操作是通过调用Equinox P2的一系列命令来实现的。这里Equinox是Eclipse对OSGI Core规范的一个实现。Equinox P2(Provisioning Platform)是Equinox用来为OSGI应用提供安装能力的子项目,多应用于Eclipse和Eclipse RCP应用。

以下是Equinox P2的相关术语:

1)      Artifacts----可安装的实际文件(Bytes)

2)      IU----对一个可安装Artifact的描述,描述该Artifact提供了什么,依赖了什么,有哪些属性,需要执行哪些配置。 IU可以有不同种形式存在,它可以是某一种Product,例如J2EE Product,也可以是某一个插件,也可以是多个Features通过分组形成的Category,当然也可以是包含多个插件的Feature。

3)      Metadata Repository----存放在content.jar,包含了大量的IU定义来描述可安装的内容

4)      Artifact Repository----存放在artifacts.jar,包含了大量artifact相关信息如文件大小,文件格式,存放路径。

Eclipse在安装时仅需下载 artifacts.jar、 content.jar就可以分析出具体的安装计划,然后下载完成安装所需的最少文件,相对于Eclipse 3.4的Update Manager,极大地提高了安装的速度。

 

典型的插件发布流程如下:

插件开发->导出插件并复制到UpdateSite ->执行相关Equinox P2命令将第三方插件Mirror到Update Site ->用户安装

下面介绍如何利用EPRP进行插件的管理发布。

插件上传

插件开发人员工作最后一步是导出已经创建的插件。Eclipse提供了专用的导出向导。要访问此向导,只需在Eclipse里单击 File > Export 并选择 Plug-inDevelopment 类别下的 Deployable Features。

导出的文件可以理解为一个Repository,包含了Plugin/Feature的jar文件,Metadata Repository和ArtifactRepository。目录结构如下


 

features

- feature1.jar

plugins

- plugin1.jar

- plugin2.jar

artifacts.jar

content.jar

 

在基于Eclipse3.4及以前版本导出的插件里是不包含artifacts.jar和content.jar的,因此Equinox P2提供了Publish功能,可以为本地的插件包生成P2安装所需的相关信息。

eclipse.exe

-application org.eclipse.equinox.p2.publisher.FeaturesAndBundlesPublisher

-metadataRepository file:/<some location>/repository

-artifactRepository file:/<some location>/repository

-source /<location with a plugin and feature directory>

-configs gtk.linux.x86

-compress

-publishArtifacts

 

EPRP封装了Equinox P2的Publish命令,插件开发人员只需要将导出的插件打成一个zip包,通过EPRP的Publish功能就可以将导出的插件发布到Update Site上。


插件镜像

有时我们需要从远程Repository下载插件。Equinox P2提供了将远程Repository复制到本地的Mirror命令,由于MetadataRepository和Artifacts Repository理论上可以位于不同地方,所以Mirror一个完整的Repository需要分别Mirror Metadata Repository和Artifacts Repository。
Mirror Metadata Repository:

eclipse.exe -nosplash -verbose

    -application org.eclipse.equinox.p2.metadata.repository.mirrorApplication

    -source Insert Source URL (e.g. http://download.eclipse.org/eclipse/updates/3.4milestones/)

    -destination Insert Destination URL

 

MirrorArtifacts Repository:

eclipse.exe -nosplash -verbose

    -application org.eclipse.equinox.p2.artifact.repository.mirrorApplication

    -source Insert Source URL (e.g. http://download.eclipse.org/eclipse/updates/3.4milestones/)

 -destination Insert Destination URL (e.g. file:/tmp/3.4milestonesMirror/)

在EPRP诞生之前,插件的下载都需要通过执行以上两条Mirror命令实现。

EPRP封装了Equinox P2的Mirror命令,隐藏了相关的技术细节,提供给终端用户一个web 界面,要镜像插件,用户只需在EPRP系统里面点击Mirror按钮,EPRP就会将插件从远端Mirror到本地的Update Site。


插件安装

EPRP为每一个Repository和Composite生成Update Site URL。凭借Update Site URL用户可以在Eclipse里进行插件的安装和升级。




聚合多个插件库

EPRP提供Composite功能,用于对多个插件库进行聚合,为多个插件提供一个统一的安装入口。EPRP中可以为Composite添加子Repository或子Composite,也可以直接将Site下面的Repository添加到Composite当中,比如将sonar和emma添加到3rdParty这个Composite当中,如图8所示。



添加插件分组信息

对于某些插件我们可以利用EPRP的Category功能将其归类到某一个组里面。比如sonar和emma,它们都是测试相关的插件,因此可以将sonar和emma添加相应的分组信息。如图9所示,给sonar和emma对应的Repository添加相应的分组信息为testtools。


当添加完分组信息后,在Eclipse里面进行插件安装时选择Groupitems by category,即可看到添加的分组,在该分组下可以看到所有的插件信息,如图10所示。



记录和回滚历史操作

EPRP会自动对所有的操作进行记录,在EPRP里面可以看到针对每一个Repository的操作历史,当错误操作发生时,可以通过Rollback功能进行回退。


同步Site

EPRP提供了一键同步的功能用于Site间的同步,如图12所示,Source Site为QA,Destine Site为Release,点击Confirm时,EPRP会自动将QA Site的内容同步至Release Site。


除了上文介绍的功能外,EPRP还提供其他功能,比如访问权限控制,对Repository、Composite或Site的增删改操作等,具体Use Case请参考https://github.com/eBay/P2Portal/wiki/Use-Cases

EPRP技术架构


我们使用Django作为EPRP的web框架。Django是一个基于Python的开源web应用框架,其核心包括一个面向对象的映射器,用作数据模型和关系型数据库间的媒介,一个基于正则表达式的URL分发器。EPRP使用Django的认证系统进行用户的授权,使用Git来实现历史版本的管理,通过Rsync实现Site间的同步。

小结

EPRP集中化的管理方式,可视化的操作界面简化了插件管理的流程,减少了人为因素引起的错误,使得插件开发和版本发布的效率得到极大提升,间接保证了软件开发的质量。


开源地址

https://github.com/eBay/P2Portal


相关文章:

  • eBay WebRex: 动态web资源优化工具
  • MapOutputBuffer理解的三重境界
  • Druid at Pulsar
  • AngularJS渲染性能分析
  • Ebay开源基于大数据的可视化框架:Pulsar Reporting
  • JavaScript 异步原理
  • 从数据仓库到数据视图
  • Griffin – 模型驱动的数据质量服务平台
  • 细数Kubernetes Service那些事-kubernetes 服务发布以及在eBay的实践
  • TCP BBR拥塞控制算法解析
  • React同构漫谈
  • 基于PWA的异步监控
  • 从dedup说起之JS数组去重
  • java中怎么把一组数字的变量赋值给数组_写给小白看的入门级 Java 基本语法,强烈推荐...
  • 去哪儿网查不到历史订单_前端vue 2.5 去哪儿(慕课网Dell Lee视频教学) 项目实战视频...
  • Git初体验
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • PHP CLI应用的调试原理
  • Python 反序列化安全问题(二)
  • 安装python包到指定虚拟环境
  • 多线程 start 和 run 方法到底有什么区别?
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 聊一聊前端的监控
  • 驱动程序原理
  • 如何合理的规划jvm性能调优
  • 如何利用MongoDB打造TOP榜小程序
  • 一道面试题引发的“血案”
  • 用element的upload组件实现多图片上传和压缩
  • 用mpvue开发微信小程序
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • %@ page import=%的用法
  • (C++20) consteval立即函数
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (三)docker:Dockerfile构建容器运行jar包
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)程序员技术练级攻略
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .dwp和.webpart的区别
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .sdf和.msp文件读取
  • .ui文件相关
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @html.ActionLink的几种参数格式
  • @RequestParam,@RequestBody和@PathVariable 区别
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [android] 练习PopupWindow实现对话框
  • [Avalon] Avalon中的Conditional Formatting.