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

Maven Build Tracking

Author:  Mao, Maode.

从这个项目的名字我们不难发现,Maven Build Tracking (以下简称MBT) 这个项目是用来跟踪/监控Maven 的构建(Build)。但我们不仅仅记录项目的成功/失败, 同时需要衡量构建时长, 构建的环境, 甚至收集应用级别的信息。利用这些信息我们就可以全局的审查我们构建系统的性能以及可靠性。

 

在我们详细讨论MBT之前,我们先来复习下Maven的几个基本概念.

Maven 基本概念

Maven 从本质上来讲是一个插件系统,几乎所有的功能都是通过插件来实现的。

Maven插件 (Plugin)

一个插件是由一个或者多个goal组成。 比如,Compiler plugin 包含一个编译源代码(src)的goal 和编译测试代码(test)的goal。

目标(Goal)

一个goal 是用来完成一个具体的单独的任务或者和其他goal一起组成一个比较大的构建活动。我们可以把一个goal 看作是Maven里的一个基本构建单元。比如在Compiler plugin 里有一个编译的goal, 他就是专门用来编译项目里所有的源代码。

阶段(Phase)

Plugin goals 可以被绑定在一个生命周期(lifecycle)的phase里. 每个phase 可以绑定有0个或者多个goals. 比如,当我们执行mvn jar的时候, Maven 会执行所有package phase之前所有的phases, 在这个过程中,Maven会执行所有绑定在这些phase上的goal。通过下面这个图我们大致可以了解到Maven基本的执行过程。 当然事实上phase 和goal 远远不止这些。

仓库(Repository)

当Maven 构建你的项目时,他会加载当前目录下的pom.xml 并且开始解析所有的依赖。 在你第一次运行Maven时候,你会发现Maven会从远端的仓库里下载一些文件到本地的仓库。当然即使不是第一次运行,有时候你也会发现Maven会下载一些文件到本地仓库,如果这些文件在本地是缺失的话。

当一个Maven构建结束时,Maven 通常会将每个项目的执行时间以及整个Maven构建的执行时间在命令行输出。如下图所示。

不过从另外一个角度来看,当我们分析一个Maven构建运行了多少时间的时候,也可以将他分成两大部分,第一部分是花在解析依赖以及下载的时间,第二部分是所有Plugin goals 的执行时间总和。如下图所示:

Maven在命令行的输出当然可以满足一个开发者日常工作的需要,通常我们在命令行看到这个构建花了多少时间就足够了。但是想象一下如果500多台Jenkins CI上都有Maven 构建在运行,你怎么来抓取/统计/分析Maven 构建的时间呢?

 

此外,Maven 构建结果的输出并没有告诉我们某一个Plugin运行的时长,某一个Phase运行的时长, 而这些信息对于我们分析Maven项目构建的瓶颈非常有用。他是我们分析某些Plugin 性能问题的第一手资料。

同时我们也想看看这些Maven 项目到底是运行在命令行,Jenkins CI, 还是IDE里面。

我们也想知道这些Maven 运行在什么版本的JVM上, 甚至我们想知道一些项目有关的信息(比如GIT repository URL, 项目的版本,平台的版本等等…)

当Maven构建失败时候,我们希望可以收集到出错的信息,log, stack trace, 以便我们可以进行错误的分类以及时候分析,甚至可以发出定制的警告。

 

而上面所有这些有待解决的问题,在MBT这个项目里都得到了解决。

Maven Build Tracking

设计思路

Maven Build Tracking 是设计用来跟踪/记录发生在各种环境下(IDE, CLI, CI 等等)的Maven构建, 这些数据通常被用来统计分析构建系统的性能和可靠性(performance/reliability),这些数据被记录到一个中心数据库里。数据库的信息可以被前端的报表系统、报警系统共享,来生成报表以及告警信息。

MBT本身应该尽可能低的占用系统资源, 尽可能少的占用系统时间,应该可以自我升级,容易维护。

基于以上这些设计原则,我们将整个系统大致分成三大块:

Profiler 是基于Maven 的扩展API来实现的, 他被安装在$MAVEN_HOME/lib/ext.

当Maven 核心启动时候,Maven会加载Profiler,Profiler会侦听Maven发出的各种事件 (比如session启动/停止, project 启动/停止, plugin 启动/停止等等), 在Maven session结束时, Profiler 会将搜集的信息导出到一个日志文件。

下图是Maven扩展API的示例:

LogPublisher 是一个可执行的Jar,他被安装在你执行Maven的主机上,他会加载Profiler产生的日志文件,分析并将数据导入中心数据库。在eBay的CI环境里,我们在每台CI机器上都安装了LogPublisher, 并且每隔5分钟运行一次。LogPublisher 本身是可以自行安装的,当他发现有一个更新的版本发布后,他会下载并安装这个Jar。 如果不是这样,你能想象手工安装500多台机器是多么恐怖的一件事情!

 

PostProcessor 用来处理那些需要很长时间才能运行结束的任务(Long-running tasks),这些任务显然不适合放在Profiler里去做,因为这样会使用户的Maven 构建时间加长,也会占用用户机器的系统资源。他也不适合放在LogPublisher里,因为那个也是运行在用户机器上。所以长时间任务最好放在单独的服务器上。PostProcessor 是由Restful Service 和 Quartz scheduled tasks 组成。可以让我们非常方便的进行系统集成,同时可以支持定时的运行某些长时间的任务。

 

MBT会收集统计以下一些信息:

·         Session status (Success/Fail)

·         Session duration

·         Session pure build duration

·         Session maven downloading duration

·         Project duration

·         Phase duration

·         Plugin duration

·         Environment (CLI/CI/RIDE)

·         Machine Name FQDN

·         User Name

·         Git URL

·         Jenkins URL

·         Maven version

·         Java version

·         Raptor Version

·         Error Category

·         Error Code

·         Fullstack Trace

 

架构

基于日志文件的架构

在eBay的CI 集群里,我们将Profiler 安装在每台CI的Maven里。利用cron来定时运行LogPublisher来讲日志文件里的内容提取发送到中心数据库里。 LogPublisher 利用一个非常简单的规则引擎来将失败的构建进行分类。

我们另外有BuildService 作为我们的PostProcessor来处理那些长时间运行的任务。比如我们会定时更新那些没有分类的Build, 我们会定时计算并更新Maven花在下载上的时间。同时我们在BuildService上安装了REST service 来提供一些config service,queue service 等等。当然我们也利用BuildService 来定时发送一些关于performance/reliability的报告。

基于REST Service 的架构

基于service 的架构是从上面的架构衍生出来的,区别在于Profiler并不产生日志文件存在CI机器上,而是将日志文件信息以JSON格式POST到Build Service 的Queue里,这样就可以省去在CI机器上安装LogPublisher了。LogPublisher的功能被转移到了BuildService里。

但是你可能会问,那如果REST调用失败了后,是不是这次的结果就不能记录到数据库里了?我们怎么来解决可靠性的问题呢?如果可靠性对你真的非常重要的话,我们还是建议你安装LogPublisher, 不过这次LogPublisher只是作为BuildSerivce Queue的客户端存在,这样他就轻量级多了。

展望

MBT目前被部署在eBay的CI集群里,eBay CI 集群是采用独立模式(Standalone CI)。当然MBT也可以被部署在PayPal 的 Master/Slave 这种模式,以及未来基于Mesos 的那种模式。

在MBT的路线图(Roadmap)上有很多未完成的功能,比如我们可以利用LogStash来收集日志,我们可以利用RabbitMQ来作我们的Queue,当然更常见的做法是抽取API来使类似的集成更通用,更灵活。

未来,我们考虑构建一个UI, 一个集成的Web界面来管理MBT,以及Jenkins CI 集群。通过这个界面我们可以监控MBT的运行情况,CI的运行状况,提供更加灵活的升级方法,更加直观的规则引擎,有了这样一个Web界面,CI的安装更新也将变得更加灵活。

 

我们已经将MBT开源, 欢迎您的加入 https://github.com/eBay/mTracker

 

* 本文版权和/或知识产权归eBay Inc所有。如需引述,请和联系我们DL-eBay-CCOE-Tech@ebay.com。本文旨在进行学术探讨交流,如您认为某些信息侵犯您的合法权益,请联系我们DL-eBay-CCOE-Tech@ebay.com,并在通知中列明国家法律法规要求的必要信息,我们在收到您的通知后将根据国家法律法规尽快采取措施。

相关文章:

  • 分布式文件系统概述
  • 调试Oracle 之一 基础篇
  • 基于Apache Mesos 构建高可靠,高可用的Jenkins CI
  • Kepler性能分析之M2E调优
  • Ebay开源 Pulsar:实时大数据分析平台
  • JS组件化验证检测
  • 基于云技术的集成测试代码覆盖率收集的一站式解决方案
  • 使用github pages + issues + api建立个人博客
  • MapReduce的详细过程
  • 基于Jmeter和Jenkins的自动化性能测试的一站式解决方案
  • jQuery动态载入JS文件研究
  • SolrCloud之分布式索引及与Zookeeper的集成
  • Kafka的分布式架构设计与High Availability机制
  • JS方法代理
  • Hadoop作业性能指标及参数调优实例 (一)Hadoop作业性能异常指标
  • Druid 在有赞的实践
  • Javascript编码规范
  • JavaScript函数式编程(一)
  • java正则表式的使用
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Mysql5.6主从复制
  • Protobuf3语言指南
  • Redis字符串类型内部编码剖析
  • SAP云平台里Global Account和Sub Account的关系
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • tweak 支持第三方库
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 来,膜拜下android roadmap,强大的执行力
  • 如何优雅地使用 Sublime Text
  • 探索 JS 中的模块化
  • 物联网链路协议
  • 移动端 h5开发相关内容总结(三)
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • puppet连载22:define用法
  • 带你开发类似Pokemon Go的AR游戏
  • ​Linux·i2c驱动架构​
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #define用法
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #QT项目实战(天气预报)
  • (1)(1.13) SiK无线电高级配置(六)
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (论文阅读40-45)图像描述1
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • ***原理与防范
  • *2 echo、printf、mkdir命令的应用
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET轻量级ORM组件Dapper葵花宝典