持续集成CI实施指南三--jenkins集成测试

前面几篇文章主要讲了jenkins搭建和项目构建相关内容,已经能满足自动编译,自动部署等功能,但还差一项很重要的工作:自动化测试!

作为敏捷开发必不可少的工作,我们需要每次构建后都要跑一遍自动化测试,做全量回归,如果有需要还有冒烟测试。那么下面就来介绍如何实现每次构建项目后自动执行一个自动化测试任务。

一、节点管理

一般来说,测试都基于windows操作系统,比如用selenium编写web项目的自动化测试,用teststack.white编写client项目自动化测试。而我们的jenkins是通过docker容器安装部署的,实际是linux环境,这里就会遇到操作系统不兼容的问题。

事实上,不仅仅是需要测试才会遇到这种情况,如果我们要通过jenkins for docker部署一个.net framework 项目,也是同样的问题。

但jenkins提供了节点管理的功能,能搭建起一个跨系统跨平台的集群,既能解决系统兼容问题,也能解决单点jenkins性能不足的问题。

1.1 添加节点

  • jenkins“系统管理”–“管理节点” 进入节点管理页面,点左边栏“新建节点”

    1

  • 填写节点名称,选择“Permanent Agent”

    2

  • 填写配置如下

    3

    • of executors:并发量,可同时执行job的数量,默认是1,根据需要填写
    • 远程工作目录:节点服务器的工作目录,目录不要有中文
    • 用法:默认为“尽可能使用该节点”,修改为“只允许运行绑定到这台机器的Job”
    • Environment variables:环境变量,如图所示,需要增加一个键值对,表示把节点服务器的PATH环境变量赋值到jenkins节点中,如果不配置环境变量,新建的这个节点将不能读取到节点服务器上的PATH环境,比如不能启动python命令
  • save后显示如下界面,点“Launch”按钮,下载“slave-agent.jnlp”文件

    4

1.2 节点服务器配置

登陆需要用于执行测试的windows服务器

  • 安装JDK
  • 创建工作目录,和1.1配置的远程工作目录一致,如“d:\jenkins”
  • 拷贝1.1章节最后一步下载的“slave-agent.jnlp”文件到该服务器,可以放到工作目录下,目录不要有中文
  • 运行“slave-agent.jnlp”即可

可将“slave-agent.jnlp”文件放在启动项里,使其开机启动,或者做成服务

成功运行后可在jenkins节点管理看到该节点,并且状态由红字提示“不在线”变成正常

二、 测试项目

添加测试项目和添加普通项目类似:

  • 添加自由软件风格项目

  • 指定第一章创建的节点执行该项目

    5

  • 添加测试项目的git源

    6

  • 配置构建触发器

    7

    • 勾选“Build after other projects are built”,选择“Trigger only if build is stable”,填写前置项目名称,表示当这些前置项目成功构建后,执行这个项目
    • 根据需要,勾选“Build when a change is pushed to GitLab.”,用于配置Gitlab webhook触发项目,可参考该系列第二篇文章 http://wurang.net/jenkins02_use/
  • 构建环境同样根据实际需要配置

    8

  • 添加构建脚本

    9

  • 最后构建后发送邮件通知

这里容易踩坑,找不到python命令,请参考1.2章节查看环境变量键值对设置。

另外生成的测试报告不方便查看,需要在节点服务器上搭建iis或者nginx,这对于jenkins集群来说并不是很好的做法。所以我们还需一个测试报告的插件。

三、测试报告插件

3.1 Publish HTML reports插件使用

  • 安装Publish HTML reports插件

  • 编辑jenkins测试项目

  • 构建后操作增加Publish HTML reports

    10

    • HTML directory to archive:测试报告目录,相对于项目工作目录
    • Index page[s]:测试报告页面
    • Report title:报告名称
    • Keep past HTML reports:保留旧的测试报告,默认不保留
    • Always link to last build:始终连接到最新的构建
    • Include files:包含文件,如果测试报告文件夹内还有css或js文件,需要根据需要填写
  • 配置完成后,重新构建测试项目,就可以在项目左边栏点击“HTML Report”查看测试报告了,如果保留了旧的测试报告,也可以在这里选择查看

    11

  • 除了上面的方式查看测试报告外,还可以使用URL:项目地址/HTML_Report/ 来访问,比如在邮件通知模板里用下面的代码在邮件显示测试报告地址

    1
    ${PROJECT_URL}HTML_Report

    修改该测试项目的邮件通知模板,拷贝“系统设置”里默认的邮件模板内容,加入自定义的代码

    12

3.2 测试报告无法加载CSS的问题

如果测试报告用到了CSS和JS,即使我们在3.1章节中配置了“Include files”,还是不能正常加载测试报告,会丢失CSS和JS文件,控制台报错跨域问题。这是因为Jenkins由java开发,默认对跨域做了安全限制,这是jenkins的CSP(Content Security Policy)默认配置的,配置项为:

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

在这种配置下,HTML内联样式,js,ajax都不可以使用。

解决这个问题的方式有两种,归根到底都是修改CSP:

3.2.1 临时方案

  • 进入Jenkins脚本命令行

    13

  • 输入以下命令并运行

    1
    System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")

PS:需要注意

  • 执行完命令后再次构建测试项目,对新生成的测试报告才有效
  • 重启jenkins后配置将失效

结合之前的项目配置经验,我们也可以创建一个专门用来自动执行这个脚本的项目,添加触发器,每次jenkins启动后,就执行项目。让它变成一个“永久”方案。

3.2.2 永久方案

由于上面那个“永久”方案操作起来有点麻烦,还不能治本,所以我们还是考虑其他方式。

还记得第一篇文章http://wurang.net/jenkins01_docker/ 关于Dockerfile里有一段代码吗?

1
2
3
4
5
...
RUN rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 设置环境变量,设置时区和降低安全配置以允许查看测试报告时访问到css
ENV JAVA_OPTS="-Duser.timezone=Asia/Shanghai -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';\""
USER jenkins

设置了java的环境变量JAVA_OPTS,其中就包含了CSP的修改

1
-Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';\"

所以我们在制作jenkins镜像的时候,从根本上就解决了问题。

至此,jenkins已经覆盖了编译、部署、测试整个软件开发流程。下一篇,将会介绍一下jenkins 的用户和项目权限管理。

持续集成CI实施指南三--jenkins集成测试

https://wurang.net/jenkins03_test/

作者

Wu Rang

发布于

2017-11-15

更新于

2021-12-06

许可协议

评论