概要node
Code Coverage API plugin 是 Jenkins 在 GSoC 2018 中的一个子项目。GSoC 是一个由谷歌举办的,帮助在校学生进入开源社区,为开源组织贡献代码的活动。 在这个项目中,个人 mentor 是 Steven Christou, Supun Wanniarachchi, Jeff Pearce 和 Oleg Nenashev。 目前在Jenkins中,有不少插件都实现了代码覆盖率工具的接入,例如 Cobertura Plugin, Jacoco Plugin, Clover Plugin…可是这些插件的配置项,结果页展现的图表和显示的内容都是相似的。 所以,相对于如今的为每个代码覆盖率工具都从头编写一个新的插件,咱们能提供一个 API 插件将会大大减小开发者的工做量。这个 API 插件将处理那些最重复的工做,将其封装成不一样的抽象层,并提供易于使用的 API 接口让其它插件去实现。 支持的代码覆盖率工具 内置 JaCoCo 其它实现了 Code Coverage API plugin 的插件 Cobertura (Cobertura Plugin) llvm-cov (llvm-cov Plugin)git
Featuresgithub
现代化的图表 代码覆盖率变化趋势图 支持源代码浏览 支持 Pipeline 和 Parallel Pipeline 支持 Report combining 提供 REST API 灵活的 Failed Conditionsjson
现代化的图表api
在概要表中咱们能够看到当前位置的代码覆盖率概况。架构
** 代码覆盖率变化趋势图**ide
咱们也支持代码覆盖率趋势图,来显示 Build 之间的代码覆盖率变化趋势。工具
** 源代码浏览**ui
** Pipeline 和 Parallel Pipeline**spa
API 插件提供 Pipeline 和 Parallel Pipeline 的支持,你能够在不一样的 Branch 中调用插件: node { parallel firstBranch: { publishCoverage adapters: [jacocoAdapter('target/site/jacoco/jacoco.xml')] }, secondBranch: { publishCoverage adapters: [jacocoAdapter('jacoco.xml')] } }
Reports Combining
经过给 publishCoverage 设置 tag,把含有相同 tag 的报告结合为一个报告。 node { parallel firstBranch: { publishCoverage adapters: [jacocoAdapter('target/site/jacoco/jacoco.xml')], tag: ‘t’ }, secondBranch: { publishCoverage adapters: [jacocoAdapter('jacoco.xml')], tag: ‘t’ } } REST API
咱们提供 REST API 供其它应用获取覆盖率信息。 覆盖率: …/{buildNumber}/coverage/…/result/api/{json|xml} 覆盖率变化: …/{buildNumber}/coverage/…/trend/api/{json|xml} 上一次Build的覆盖率: …/{buildNumber}/coverage/…/last/result/api/{json|xml} 上一次Build的覆盖率变化: …/{buildNumber}/coverage/…/last/trend/api/{json|xml}
灵活的 Failed Conditions
咱们能够在 Global 和 Adapter 级别为不一样的元素设置失败条件来控制 Build 的结果。
其余功能
咱们也支持其它一些像是自动检测报告,筛选覆盖率这样的功能,在插件的文档中能够找到 更多的信息。
架构
插件在运行过程当中主要会作下面几个事情: 根据用户的配置找到代码覆盖率报告文件 使用 Adapter 将报告文件转化为统一的标准格式 解析标准格式的报告文件并并合并它们 显示解析后的结果 因此,咱们能够简单编写一个 Adapter 来实现一个新的代码覆盖率工具。这个 Adapter 只须要作一件事,将其它格式的代码覆盖率报告转化为咱们插件的标准格式。Adapter的实现方式基于 ExtensionPoint,因此咱们能够将 adapter 的实现分离到不一样的插件中,插件将会自动发现它们。 同时,为了简化转化的过程,咱们也提供了一系列的抽象层。
The below diagram show the architecture of Code Coverage API plugin
实现一个新的代码覆盖率插件
咱们经过实现CoverageReportAdapter这个 extension point 来实现一个新的插件。经过使用咱们插件提供的抽象层,咱们能够像下面这样的简单来实现 JaCoCo: public final class JacocoReportAdapter extends JavaXMLCoverageReportAdapter {
@DataBoundConstructor
public JacocoReportAdapter(String path) {
super(path);
}
/**
* {@inheritDoc}
*/
@Override
public String getXSL() {
return "jacoco-to-standard.xsl";
}
/**
* {@inheritDoc}
*/
@Override
public String getXSD() {
return null;
}
@Symbol("jacoco")
@Extension
public static final class JacocoReportAdapterDescriptor extends JavaCoverageReportAdapterDescriptor {
public JacocoReportAdapterDescriptor() {
super(JacocoReportAdapter.class);
}
@Nonnull
@Override
public String getDisplayName() {
return Messages.JacocoReportAdapter_displayName();
}
}
复制代码
} 在这里咱们只作了两件事,实现了为 Java XML 报告编写的抽象层,提供了一个将 JaCoCo 报告转化为咱们标准格式的 XSL 文件。 假如你想要实现一个咱们没有提供抽象层的代码覆盖率工具,你还须要注册 CoverageElement 并实现一个简单的 Parser。可参考 llvm-cov Plugin,更多的信息参见插件的 GitHub wiki page。 附文中连接: Code Coverage API plugin:jenkins.io/projects/gs… Steven Christou:github.com/christ66 Supun Wanniarachchi:github.com/Supun94 Jeff Pearce:github.com/jeffpearce Oleg Nenashev:github.com/oleg-nenash… Cobertura Plugin:github.com/jenkinsci/c… llvm-cov Plugin:github.com/jenkinsci/l… repo:github.com/jenkinsci/c…