本文大纲

《我的敏捷软件项目管理实践》

在Jnekins查看覆盖率报告

第六章 如何做好编码

目标

在Jnekins的“任务面板”上查看代码覆盖率报告。

这个报告之前已生成好了,本文只是讲在Jnekins的“任务面板”上加一个入口,点击可进行查看详情。

我们要做一些配置工作,使用之在Jnekins的“任务面板”上可查看html。 若没有配置,默认“任务面板”上是没有这个报告入口的。

安装HTML Publisher plugin插件(已自带)

要使用HTML Publisher plugin插件。(Jenkins默认已自带了本插件,不用再安装,若你没有有可安装一下)

这个插件不创建任何html内容的,它只把已有的html内容加入到Jnekins的“任务面板”上。

安装好HTML Publisher plugin之后,会在新建或者编辑项目时,在【增加构建后操作步骤】出现【Publish HTML reports】的选项。如下:

image2023-6-9_15-54-48.png

在“任务面板”添加覆盖率报告入口–常规(非Pipeline方)

配置

按照上面的说明,使用Publisher HTML reports,适当的做一些配置。

配置的参数:

HTML directory to archive: 是提前生成好的报告的路径。之前的配置中 target/jacoco-site  指定了输出目录:target/jacoco-site

index pages: 是首页的文件名,我去生成好的报告文件夹看过了,首页文件名是index.html

Report title: 标题,可自己起名,这里写入“代码覆盖率报告”,这个名称将出现在Jnekins的“任务面板”上,做为一个入口。

下图参数不对,请按上文填写参数。

image2023-6-10_10-27-18.png

注意1:这里的路径都不能使用环境变量。

注意2:这个插件不会自动按照上面的路径创建文件夹和文件,所以,一定要确保上面路径上的文件夹和文件已经在工作空间创建好,不然会出现报错。也就是说,这个插件是不创建任何html内容的。

注意3:这个插进不创建任何HTML报告,所以当你看到你的html内容时,会出现空白页。如果想要出现html的报告,可以配合一些xUnit plugin这样插件来生成html报告,然后再上面的路径中指向生成的html文件。

我只配置了HTML directory to archive的项,上面说了,这个路径是相对于工作空间的,所以我只填写了相对路径。而其余的选项按需要配置,我保持了默认。

提示:我上面填写之后,最终的输出目录为%workspace%/HTMLReport/index.html

注意:这里的路径都不能使用环境变量。

注意2:这个插件不会自动按照上面的路径创建文件夹和文件,所以,一定要确保上面路径上的文件夹和文件已经在工作空间创建好,不然会出现报错。也就是说,这个插件是不创建任何html内容的。

执行构建看效果

image2023-6-10_10-38-7.pngimage2023-6-10_10-40-26.png

在“任务面板”添加覆盖率报告入口–流水线Pipeline方式

配置

为了实现目标这里要使用流水线的publishHTML命令。我们使用流水线语法工具生成一个带参数的PublishHTML命令。

这个publishHTML命令不创建任何html内容的,它只把已有的html内容加入到Jnekins的“任务面板”上。

配置的参数:

HTML directory to archive: 是提前生成好的报告的路径。之前的配置中 target/jacoco-site  指定了输出目录:shop-junit-jacoco/target/jacoco-site

index pages: 是首页的文件名,我去生成好的报告文件夹看过了,首页文件名是index.html

Report title: 标题,可自己起名,这里写入“代码覆盖率报告”,这个名称将出现在Jnekins的“任务面板”上,做为一个入口。

参数按下图填写。

image2023-6-9_18-14-41.png

生成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片段截图

image2023-6-9_18-20-14.png

执行构建看效果

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

image2023-6-9_18-27-17.png

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

image2023-6-9_18-28-17.png

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

image2023-6-9_18-28-32.png

问题:在Jenkins覆盖率报告css、js不加载

点击报告进入查看报告详情,可以发现展示出来的HTML报告样式全无。

在浏览器的Network中查看资源加载情况,会发现相关的CSS和JS都没法正常加载。这是jenkins中的一个安全策略导致的。

image2023-6-7_21-11-14.png

原因分析

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页面即可正常显示。

image2023-6-7_21-59-39.png

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图的选项。

image2023-6-10_14-12-19.pngimage2023-6-10_14-11-54.png

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

image2023-6-10_14-13-36.png

在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页面,你会惊喜的发现问题已经解决了!

触发时间

  1. 手动构建时执行此Job
  2. 某任务构建时执行此Job
  3. 定时 执行此Job