概述
项目中做了一套接口自动化测试并部署到jenkins上,过程中遇到了很多问题,但最终全部得到了解决。主要涉及多节点,参数化构建,报告不显示css样式,报告乱码。
本次我的环境信息如下:
- linux:jenkins服务器
- win:jenkins的一个节点
一、添加节点
位置:系统管理>节点管理>添加节点
配置详情如下:
注意事项:
- 启动方式有很多种,这里我选择的ssh,所以要保证该机器上启动了ssh服务
- 因为我的项目是java工程,需要jdk,所以设置了jdk目录,顺便也设置了git目录
- 节点启动后,会在远程工作目录中产生对应的文件
二、参数化构建
因为我这很多项目跑的都是同一套自动化代码,仅仅是用例不相同。所以可以利用maven的profile配置多个环境来实现。
现在我有三个项目,对应了三个配置文件
主配置文件:
spring:
profiles:
active: @spring.active@
pom.xml配置
<profiles>
<profile>
<id>api</id>
<properties>
<spring.active>api</spring.active>
</properties>
</profile>
<profile>
<id>saas</id>
<properties>
<spring.active>saas</spring.active>
</properties>
</profile>
<profile>
<id>temp</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<spring.active>temp</spring.active>
</properties>
</profile>
</profiles>
上述配置代表弄了三个环境,默认使用的配置文件为application-temp.yml;
如果想在maven打包的时候指定使用temp项目的配置文件,那么使用以下命令即可:
maven clean package -Ptemp
备注
如果项目打包还想要将本地jar一起打包,在build可以加入以下配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>src/main/resources/testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<!--根据你把lib放的位置-->
<compilerArguments>
<extdirs>${project.basedir}/src/main/resources/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
</plugins>
</build>
jenkins设置参数化构建
General页签:
-
取名为env就代表,后续构建过程中可以通过%env%来引用该变量(linux需要使用${env}引用)
-
构建步骤中引用该参数
-
执行构建时,可用选择使用哪个项目的配置
三、HTML报告不显示css样式
在构建后操作中使用Publish HTML reports插件,即可展示报告
tips:如果每次构建想要保存结果,就需要勾上上述两个选项;否则只保留最后一次结果。
可能不会展示css样式
临时解决方案:
在系统设置>脚本命令行中输入:
每次重启后失效
System.setProperty(“hudson.model.DirectoryBrowserSupport.CSP”, “”)
四、报告显示中文乱码
通过检查发现,win这边产生的报告文件编码格式为:GBK
然而,linux上的jenkins上的编码格式为UTF-8,所以需要两边格式保持一致。
尝试过修改监听器中的编码,但是这个似乎只能影响HTML中的meta中的charset属性,整个文件的编码还是gbk的
我不想对jenkins做任何修改(因为我感觉utf-8就已经是一个靠谱的编码了),那么现在就是要让我本地的html报告的文件编码变成utf8(但是在我本身代码层面,我没有找到合适的方法)
以下命令或许有些帮助:
linux查看文件编码: file index.html
linux修改文件编码: 将index.html 文件编码从gbk修改为utf-8
iconv -f GBK -t UTF-8 -o index2.html index.html
win查看文件编码: 使用notepad++等工具即可看到编码
win修改文件编码(cmd): 将index.html的编码修改为utf8,修改后的文件保存为index2.html
PowerShell -Command “& {get-content index.html -encoding default| set-content index2.html -encoding utf8}”
我猜想,jenkins在远程构建脚本的过程是:构建前脚本>构建脚本>构建后脚本>publish HTML report。所以当构建命令执行完成后,会在我远程机器上产生报告,然后再publish html report阶段会将该报告直接拷贝到jenkisn服务器上的某次build中。如果我想在“构建后脚本”这个阶段修改报告的编码,显然是不行的,因为那个时候报告都还没有开始拷贝呢,怎么修改?那么还能在publish HTML report后修改嘛?我似乎没有找到相关功能,除非你在构建后触发另外一个构建项目来专门修改该文件的编码。
最终我的解决方案是:在远程机器构建完成后,就修改其编码格式为UTF-8,然后再拷贝到jenkins服务器
所以我的构建命令可能会是这样:
cd /D D:\yangqin\coding\sw-sdrp-interfaceAuto\sdrpAutotest
mvnw clean package -P%env%
PowerShell -Command “& {get-content> test-output\index.html -encoding default| set-content> test-output\report.html -encoding utf8}”
此时遇到的另外一个问题是,如果我的测试用例中含有失败的情况,那么PowerShell后面的命令根本不会执行。如果在linux上遇到这种情况,通常的解决方案是:
此时无论command执行成功还是失败,后面的命令都照样运行
command || true
由此启发,在win上应该这样:
此时无论command1执行成功还是失败,command2命令都照样运行
command1 || command2
所以我最后的构建命令长这样: