来源: https://testerhome.com/topics/9476css
对于测试报告来讲,除了内容的简洁精炼,样式的美观也很重要。经常使用的作法是,采用HTML
格式的文档,并搭配CSS
和JS
,实现自定义的样式和动画效果(例如展开、折叠等)。html
在Jenkins
中要展现HTML
文档,一般采用的方式有两种:java
- 使用
HTML Publisher Plugin
; - 使用
Files to archive
功能,在Build Artifacts
中显示HTML
文档连接。
第一种方式配合插件,能够经过图形化操做实现简易配置,而且展现效果也不错;而第二种方式的优点在于使用Jenkins
自带的功能,不依赖插件也能实现基本的需求。node
然而,不论是采用哪一种方式,都有可能会遇到一种状况,就是展现出来的HTML
报告样式全无。在浏览器的Network
中查看资源加载状况,会发现相关的CSS
和JS
都无法正常加载。web
Refused to load the stylesheet 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css' because it violates the following Content Security Policy directive: "style-src 'self'".
Refused to apply inline style because it violates the following Content Security Policy directive: "style-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-0EZqoz+oBhx7gF4nvY2bSqoGyy4zLjNF+SDQXGp/ZrY='), or a nonce ('nonce-...') is required to enable inline execution.
Blocked script execution in 'http://10.13.0.146:8888/job/SkyPixel-SmokeTest/34/artifact/reports/SkyPixel-smoketest/34.html' because the document's frame is sandboxed and the 'allow-scripts' permission is not set.
Refused to load the stylesheet 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css' because it violates the following Content Security Policy directive: "style-src 'self'".
问题分析
出现该现象的缘由在于Jenkins
中配置的CSP
(Content Security Policy
)。bootstrap
简单地说,这是Jenkins
的一个安全策略,默认会设置为一个很是严格的权限集,以防止Jenkins用户在workspace
、/userContent
、archived artifacts
中受到恶意HTML/JS
文件的攻击。浏览器
默认地,该权限集会设置为:安全
sandbox; default-src 'none'; img-src 'self'; style-src 'self';
在该配置下,只容许加载:服务器
- Jenkins服务器上托管的
CSS
文件 - Jenkins服务器上托管的图片文件
而以下形式的内容都会被禁止:app
- JavaScript
- plugins (object/embed)
- HTML中的内联样式表(
Inline style sheets
),以及引用的外站CSS文件 - HTML中的内联图片(
Inline image definitions
),以及外站引用的图片文件 - frames
- web fonts
- XHR/AJAX
- etc.
能够看出,这个限制很是严格,在此限制下也就不难理解为何咱们的HTML
无法正常展现样式了。
解决方案
临时解决方案
要解决该问题,方式也比较简单,就是修改Content Security Policy
的默认配置。
修改方式为,进入Manage Jenkins
->Script console
,输入以下命令并进行执行。
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
当看到以下结果后,则说明配置修改已经生效。
Result
Result:
再次进行构建,新生成的HTML
就能够正常展现样式了。须要说明的是,该操做对以前构建生成的HTML
报告无效。
永久解决方案
不过,该方法还存在一个问题:该配置只是临时生效,当重启Jenkins
后,Content Security Policy
又会恢复为默认值,从而HTML
样式又无法展现了。
当前,Jenkins
官方尚未相应的解决方法,咱们只能在每次启动或重启Jenkins
时,从新修改该安全策略。
若是手工地来重复这项工做,也是可行,但并非一个好的解决方案。
回到刚才的Script console
,会发现咱们执行的命令其实就是一段Groovy
代码;那么,若是咱们能够实如今Jenkins
每次启动时自动地执行该Groovy
代码,那么也就一样能解决咱们的问题了。
好在Jenkins
已经有相应的插件:
Startup Trigger
: 可实如今Jenkins
节点(master/slave)启动时触发构建;Groovy plugin
: 可实现直接执行Groovy
代码。
搜索安装startup-trigger-plugin
和Groovy
插件后,咱们就能够进行配置了。
配置方式以下:
- 新建一个job,该job专门用于
Jenkins
启动时执行的配置命令; - 在
Build Triggers
模块下,勾选Build when job nodes start
; - 在
Build
模块下,Add build step
->Execute system Groovy script
,在Groovy Script
中输入配置命令,System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
。
须要注意的是,添加构建步骤的时候,应该选择Execute system Groovy script
,而不是Execute Groovy script
。关于这二者之间的差别,简单地说,Groovy Script
至关因而运行在master/slave
系统JVM
环境中,而system groovy script
,则是运行在Jenkins master
的JVM
环境中,与前面提到的Jenkins Script Console
功能相同。如需了解更多信息,可查看Groovy plugin
的详细说明。
至此,咱们就完全解决HTML
样式展现异常的问题了。
但还有一点须要格外注意,在本文的演示中,咱们修改CSP
(Content Security Policy
)配置时关闭了的全部安全保护策略,即将hudson.model.DirectoryBrowserSupport.CSP
设置为空,其实这是存在很大的安全隐患的。
正确的作法,咱们应该是结合项目的实际状况,选择对应的安全策略。例如,若是咱们须要开启脚本文件加载,可是只限于Jenkins服务器上托管的CSS
文件,那么就能够采用以下配置。
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "sandbox; style-src 'self';")
除此以外,CSP
能够实现很是精细的权限配置,详细配置可参考Content Security Policy Reference
。