• 解决Jenkins 中无法展示 HTML 样式的问题


    问题

    将本地的jmeter脚本部署到Jenkins上时,可以运行成功也可以在本地生成正确的HTML。但在Jenkins中查看HTML report时内容显示不出来。

    because the document's frame is sandboxed and the 'allow-scripts' permission

    问题分析

    出现该现象的原因在于Jenkins中配置的CSP(Content Security Policy)。

    简单地说,这是Jenkins的一个安全策略,默认会设置为一个非常严格的权限集,以防止Jenkins用户在workspace、/userContent、archived artifacts中受到恶意HTML/JS文件的攻击。

    默认地,该权限集会设置为:

    sandbox; default-src 'none'; img-src 'self'; style-src 'self';
    

    在该配置下,只允许加载:

    • Jenkins服务器上托管的CSS文件
    • Jenkins服务器上托管的图片文件

    而如下形式的内容都会被禁止:

    • 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-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样式展示异常的问题了。

    引用

    https://zhuanlan.zhihu.com/p/28080975

  • 相关阅读:
    java内部类
    接口与继承
    数据结构
    数据I/O流
    课程总结
    第六次实训作业异常处理
    常用类的课后作业
    窗口实训1
    实训作业4
    实训作业3
  • 原文地址:https://www.cnblogs.com/sker/p/9253740.html
Copyright © 2020-2023  润新知