本文大纲
《我的敏捷软件项目管理实践》
在Jnekins查看覆盖率报告
目标
在Jnekins的“任务面板”上查看代码覆盖率报告。
这个报告之前已生成好了,本文只是讲在Jnekins的“任务面板”上加一个入口,点击可进行查看详情。
我们要做一些配置工作,使用之在Jnekins的“任务面板”上可查看html。 若没有配置,默认“任务面板”上是没有这个报告入口的。
安装HTML Publisher plugin插件(已自带)
要使用HTML Publisher plugin插件。(Jenkins默认已自带了本插件,不用再安装,若你没有有可安装一下)
这个插件不创建任何html内容的,它只把已有的html内容加入到Jnekins的“任务面板”上。
安装好HTML Publisher plugin之后,会在新建或者编辑项目时,在【增加构建后操作步骤】出现【Publish HTML reports】的选项。如下:

在“任务面板”添加覆盖率报告入口–常规(非Pipeline方)
配置
按照上面的说明,使用Publisher HTML reports,适当的做一些配置。
配置的参数:
HTML directory to archive: 是提前生成好的报告的路径。之前的配置中
index pages: 是首页的文件名,我去生成好的报告文件夹看过了,首页文件名是index.html
Report title: 标题,可自己起名,这里写入“代码覆盖率报告”,这个名称将出现在Jnekins的“任务面板”上,做为一个入口。
下图参数不对,请按上文填写参数。

注意1:这里的路径都不能使用环境变量。
注意2:这个插件不会自动按照上面的路径创建文件夹和文件,所以,一定要确保上面路径上的文件夹和文件已经在工作空间创建好,不然会出现报错。也就是说,这个插件是不创建任何html内容的。
注意3:这个插进不创建任何HTML报告,所以当你看到你的html内容时,会出现空白页。如果想要出现html的报告,可以配合一些xUnit plugin这样插件来生成html报告,然后再上面的路径中指向生成的html文件。
我只配置了HTML directory to archive的项,上面说了,这个路径是相对于工作空间的,所以我只填写了相对路径。而其余的选项按需要配置,我保持了默认。
提示:我上面填写之后,最终的输出目录为%workspace%/HTMLReport/index.html
注意:这里的路径都不能使用环境变量。
注意2:这个插件不会自动按照上面的路径创建文件夹和文件,所以,一定要确保上面路径上的文件夹和文件已经在工作空间创建好,不然会出现报错。也就是说,这个插件是不创建任何html内容的。
执行构建看效果


在“任务面板”添加覆盖率报告入口–流水线Pipeline方式
配置
为了实现目标这里要使用流水线的publishHTML命令。我们使用流水线语法工具生成一个带参数的PublishHTML命令。
这个publishHTML命令不创建任何html内容的,它只把已有的html内容加入到Jnekins的“任务面板”上。
配置的参数:
HTML directory to archive: 是提前生成好的报告的路径。之前的配置中
index pages: 是首页的文件名,我去生成好的报告文件夹看过了,首页文件名是index.html
Report title: 标题,可自己起名,这里写入“代码覆盖率报告”,这个名称将出现在Jnekins的“任务面板”上,做为一个入口。
参数按下图填写。

生成PublishHTML命令
publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false, reportDir: 'shop-junit-jacoco/target/jacoco-site', reportFiles: 'index.html', reportName: '代码覆盖率报告', reportTitles: '', useWrapperFileDirectly: true])
Jenkinsfile片段
//在“任务面板”添加覆盖率报告入口–流水线Pipeline方式
//这个publishHTML命令不创建任何html内容的,它只把已有的html内容加入到Jnekins的“任务面板”上。
//使用流水线的publishHTML命令。我们使用流水线语法工具生成一个PublishHTML命令。
//之前的配置中 <outputDirectory>target/jacoco-site</outputDirectory> 指定了输出目录:shop-junit-jacoco/target/jacoco-site
publishHTML([
allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false,
reportDir: 'shop-junit-jacoco/target/jacoco-site',
reportFiles: 'index.html',
reportName: '代码覆盖率报告', reportTitles: '', useWrapperFileDirectly: true])
Jenkinsfile片段截图

执行构建看效果
执行构建任务时控制台输出了以下日志,说明它只是copy了文件从workspace处到jobs处,就可实现在Jnekins的“任务面板”上加一个入口的目的 。

看下图左下文,多出了一个“代码覆盖率报告”,之前是没有的。

点击“代码覆盖率报告”可打开新页面查到的报告的详情。如下图。

问题:在Jenkins覆盖率报告css、js不加载
点击报告进入查看报告详情,可以发现展示出来的HTML报告样式全无。
在浏览器的Network中查看资源加载情况,会发现相关的CSS和JS都没法正常加载。这是jenkins中的一个安全策略导致的。

原因分析
Jenkins为了避免受到恶意HTML/JS文件的攻击,会默认将安全策略CSP设置为:
sandbox; default-src ‘none’; img-src ‘self’; style-src ‘self’;
在此配置下,只允许加载:
- 1、Jenkins服务器上托管的CSS文件
- 2、Jenkins服务器上托管的图片文件
以下形式的内容都会被禁止:
- 1、 JavaScript
- 2、 plugins (object/embed)
- 3、 HTML中的内联样式表(Inlinestyle sheets),以及引用的外站CSS文件
- 4、 HTML中的内联图片(Inlineimage definitions),以及外站引用的图片文件
- 5、 frames
- 6、 web fonts
- 7、 XHR/AJAX
解决办法–方法一(临时方案)
临时解决方案(重启Jenkins失效):在系统管理→脚本命令行:
修改CSP(ContentSecurity Policy)的默认配置,到Jenkins系统管理à脚本命令行,执行以下Groovy命令,然后点击运行。配置完成后,重新构建原有项目,HTML页面即可正常显示。

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src * 'unsafe-inline' 'unsafe-eval'; script-src * 'unsafe-inline' 'unsafe-eval'; connect-src * 'unsafe-inline'; img-src * data: blob: 'unsafe-inline'; frame-src *; style-src * 'unsafe-inline';")
PS:运行1~2次
解决办法–方法二(长期有效)
方法二:利用jenkins的以下两个插件可以巧妙解决这个问题
- 1、Startup Trigger: 可实现在Jenkins节点(master/slave)启动时触发构建;
- 2、Groovy plugin: 可实现直接执行Groovy代码。
解决步骤如下:
- 1、Jenkins中新建一个Job,该Job专用于Jenkins启动时、某任务构建时、定时 执行的配置命令。
- 2、在“构建触发器”模块,选择“Buildwhen job nodes start”选项。 我的jenkins没有这个选项,只有第2图的选项。


在“构建”模块,选择“Executesystem Groovy script”,执行如下Groovy命令:

在Groovy Script填写代码
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "default-src * 'unsafe-inline' 'unsafe-eval'; script-src * 'unsafe-inline' 'unsafe-eval'; connect-src * 'unsafe-inline'; img-src * data: blob: 'unsafe-inline'; frame-src *; style-src * 'unsafe-inline';")
立即构建此Job,返回原项目重新构建,再次访问HTML页面,你会惊喜的发现问题已经解决了!
触发时间
- 手动构建时执行此Job
- 某任务构建时执行此Job
- 定时 执行此Job