JMETER+ANT+JENKINS持续集成并⽣成html报告及碰到的坑
持续集成的⼤致步骤:
1.下载ant,配置ant环境变量,将jmeter主⽬录下的extras\ant-jmeter-1.1.1.jar拷贝到ant主⽬录\lib⽬录下。
这样运⾏ant的时候不会报错。
2.修改jmeter.properties⽂件如下部分,我这⾥都修改成true,这样执⾏完脚本后就会保存这些结果到.jtl⽂件⾥⾯:
jmeter.save.saveservice.data_type=true
jmeter.save.saveservice.label=true
jmeter.sponse_code=true
# response_data is not currently supported for CSV output
jmeter.sponse_data=true
# Save ResponseData for failed samples
jmeter._error=false
jmeter.sponse_message=true
是不是爱情 伴奏
jmeter.save.saveservice.successful=true
jmeter.save.saveservice.thread_name=true
jmeter.save.saveservice.time=true
jmeter.save.saveservice.subresults=true
jmeter.save.saveservice.assertions=true
jmeter.save.saveservice.latency=true
jmeter.t_time=true
jmeter.save.saveservice.samplerData=true
范玮琪的老公幽灵主题曲jmeter.sponseHeaders=true
jmeter.questHeaders=true
jmeter.ding=false
jmeter.save.saveservice.bytes=true
jmeter.save.saveservice.url=true
jmeter.save.saveservice.filename=true
jmeter.save.saveservice.hostname=true
jmeter.save.saveservice.thread_counts=true
jmeter.save.saveservice.sample_count=true
jmeter.save.saveservice.idle_time=true
2.配置运⾏的l⽂件,xml⽂件说明:
在这⾥插⼊代码⽚<?xml version="1.0" encoding="UTF-8"?>
<project name="ant-jmeter-test" default="run" basedir=".">
<tstamp>
<format property="time" pattern="yyyyMMddhhmm" />
</tstamp>
<property name="basedirectory" value="C:\Users\qiujingping\Desktop\apache-jmeter-5.1.1\extras" />
<!-- 需要改成⾃⼰本地的 Jmeter ⽬录-->
<property name="jmeter.home" value="C:\Users\qiujingping\Desktop\apache-jmeter-5.1.1" />
<!-- jmeter⽣成jtl格式的结果报告的路径-->
<property name="sult.jtl.dir" value="${basedirectory}" />容祖儿
<!-- jmeter⽣成html格式的结果报告的路径-->
<property name="sult.html.dir" value="${basedirectory}" />
<!-- Name of test (without .jmx) -->
<property name="test" value="mywh"/>
<!-- ⽣成的报告的前缀-->
<property name="ReportName" value="TestReport1" />
<property name="sult.jtlName" value="C:\Program Files (x86)\Jenkins\workspace\jmeter/index.jtl" />
<property name="sult.htmlName" value="C:\Program Files (x86)\Jenkins\workspace\jmeter/index.html" />
<path id="xslt.classpath">
<fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/>
<fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/>
</path>
<target name="run">
<antcall target="test" />
<antcall target="report" />
</target>
<target name="test">
<taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
<jmeter jmeterhome="${jmeter.home}" resultlog="${sult.jtlName}">
<!-- 声明要运⾏的脚本。"*.jmx"指包含此⽬录下的所有jmeter脚本-->
<testplans dir="${basedirectory}\script" includes="${test}.jmx" />
</jmeter>
</target>
<target name="report">
<tstamp> <format property="report.datestamp" pattern="yyyy/MM/dd HH:mm" /></tstamp>
<xslt classpathref="xslt.classpath"
force="true"
in="${sult.jtlName}"
out="${sult.htmlName}"
>
<param name="dateReport" expression="${report.datestamp}"/>
</xslt>
<copy todir="${sult.html.dir}">
<fileset dir="${jmeter.home}/extras">
<include name="collapse.png" />
<include name="expand.png" />
</fileset>
</copy>
</target>
</project>
3.在本地运⾏ant run成功后,部署到jenkins上:
选择⼀个⾃由风格项⽬,增加⼀个构建步骤【invoke Ant】,如下
targets⾥⾯填写l⽂件 ⾥⾯ 的default的值
Build File⾥⾯填写build⽂件的路径
你也可以直接通过命令运⾏ :
1.到l当前⽬录下:
ant run
2.直接运⾏:
ant -buildfile ⽂件路径
3.然后在添加⼀个构建后操作【Public HTML Report】,如下:
这个插件不会帮你产⽣任何的html⽂件,只是把你workspace下对应项⽬产⽣的⽂件复制到对应的jobs⽬录下
HTML directory to archive :采⽤的是相对路径,这个对应的是当前jenkins的对应jobs⽬录下
Index pages:集成在jenkins中测试报告的名称
Report title:显⽰在Jenkins下的名称
4.运⾏结果如下:
在这⾥我碰到了测试报告在jenkins⾥⾯它不显⽰css样式
问题分析
出现该现象的原因在于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("del.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(“del.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)配置时关闭了的所有安全保护策略,即将del.DirectoryBrowserSupport.CSP设置为空,其实这是存在很⼤的安全隐患的。
正确的做法,我们应该是结合项⽬的实际情况,选择对应的安全策略。例如,如果我们需要开启脚本⽂件加载,但是只限于Jenkins服务器上托管的CSS⽂件,那么就可以采⽤如下配置。
System.setProperty(“del.DirectoryBrowserSupport.CSP”, “sandbox; style-src ‘self‘;”)许飞 我要的飞翔
红红的蝴蝶结