从零搭建Robot Framework+Jenkins持续集成环境

安装Jenkins

系统环境:CentOS Linux release 7.3.1611 x86_64 GNU/Linux

安装JDK

Jenkins是基于Java开发的持续集成系统(CI),所以运行环境必须安装JDK,安装JDK的方法有很多种,有些Linux系统可能会自带openjdk,需要注意的是较新版本的jenkins并不支持低版本的JDK.

[root@JDu4e00u53f7 ~]# java --version
java version "1.7.0_131"
OpenJDK Runtime Environment (rhel-2.6.9.0.el6_8-x86_64 u131-b00)

如果命令的输出如上,则这需要先卸载自带的低版本openjdk,然后手动安装sunjdk,sunJDK1.8 官网下载地址,下载.rpm和.tar.g格式的安装包都可以,但是要注意jdk位数。

jdk-8u11-linux-x64.tar.gz百度云 密码: 7kxw

我在安装的时候,遇到了一个坑,截至到目前,JDK最新版本为9.0.1,但是Jenkins最新版本v2.86并不支持JDK 9。官方说明如下:

Jenkins packages (deb IIRC) declared a Java 7+ dependency, in some configurations that resulted in Java 9 being downloaded.We no longer declare Java dependencies for that reason, as Jenkins does not work with Java 9.

使用JDK9,安装Jenkins后可能会遇到下面的错误。

下载成功后,上传到服务器,JDK安装步骤如下:

[root@JDu4e00u53f7 ~]# cd ~
[root@JDu4e00u53f7 ~]# mkdir /usr/java
[root@JDu4e00u53f7 ~]# mv jdk-8u11-linux-x64.tar.gz /usr/java/
[root@JDu4e00u53f7 ~]# tar -zxvf jdk-8u11-linux-x64.tar.gz 

···配置全局环境变量(所有用户均可用)···
[root@JDu4e00u53f7 ~]# vi /etc/profile
添加如下内容:JAVA_HOME根据实际目录来
   export JAVA_HOME=/usr/java/jdk1.8.0_11
   export JRE_HOME=/usr/java/jdk1.8.0_11/jre
   export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
   export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
   
···重载配置文件···
[root@JDu4e00u53f7 ~]# source /etc/profile

安装完成后使用java - -version可以查看安装情况:


可能出现的错误信息:bash:./java: cannot execute binary file , 出现这个错误的可能原因是你在32位的操作系统上安装了64位的JDK.

安装Jenkins

Jenkins下载地址,推荐下载war包,如果对版本没特别要求,直接下载最新版本就好。The lastest version 为2.86,以下所有的介绍和说明都是基于此版本,Jenkins迭代速度非常快,若版本不同,页面可能会有区别。

Jenkins release


安装Jenkins的方式有两种 : 如果服务器上已安装了Servlet容器,如Tomcat, 直接把war包放到webapps目录下,然后启动Tomcat就可以了;如果服务器没有安装Servlet容器,那也没有关系,因为Jenkins的war包里内置了Jetty,只需运行以下命令:
java -jar jenkins.war --httpPort=8080
--httpPort用来指定Jenkins服务端口,默认8080 ,如果该端口已被占用,则可以用来更换端口。运行命令行后,当在终端的启动日志中看到这行信息时: INFO:Jenkins is fully up and running, 代表Jenkins服务已经启动。

结合Linux nohup& 命令,我们可以让Jenkins服务永久的在服务器后台运行。
nohup java -jar jenkins.war --httpPort=8080 &
其中, nohup用来不挂断的运行命令(即忽略挂起信号,永久执行命令), & 加在结尾来让命令在后台运行,所以 nohup command & 的合起来使用的意思就是让command 永久的在后台执行。

可通过Jobs命令查看后台运行任务,如果想将某个程序调回前台控制,只需要 fg + 编号 即可,此时如果要终止程序,只需Ctrl+C 即可退出程序。

[1]+  Running         nohup java -jar jenkins.war --httpPort=8080 &

$ fg 1
nohup java -jar jenkins.war --httpPort=8080

Jenkins启动成功后,剩下的配置工作将全部在浏览器中进行,十分方便。

配置Jenkins

在浏览器上输入网址访问Jenkins: http://IP:Port ,如:http://localhost:8080

解锁服务

第一次启动Jenkins时,需要验证账户。只需要在给出的文件路径下将密码拷贝一份到表单中即可验证完成。
$ cat /root/.jenkins/secrets/initialAdminPassword

image

Customize Jenkins

正常情况下,会进入安装插件页面。点击Install suggested plugins,安装Jenkins建议安装的插件。

image
image

如果在进入这一步时,遇到了Offline问题,没有关系,这是由于你的Jenkins服务器没有科学上网,点击跳过插件安装就好,后续我们可以自行安装插件,详见下文“安装插件”部分的内容。

image

Create First Admin User

配置管理员用户账号/密码,这个账号密码一定要保存好,不然补救措施比较麻烦。

image

完成确认后,点击Start using Jenkins,进入Jenkins使用页面!
image

补充:Jenkins的配置信息已经插件都会放到 ~/.jenkins/ 目录下,这个也是Jenkins的主目录,它默认是隐藏的。所以如果需要重新初始化安装Jenkins ,只需要清理掉 ~/.jenkins目录即可。

image

关闭/重启Jenkins

我们用jar -jar jenkins.war 来启动jenkins服务器后,可以使用以下方法关闭或重启Jenkins服务。

关闭Jenkins 服务

只需要在访问Jenkins的url地址后加上exit,如http://localhost:8080/exit , 回车后会跳转到以下页面,点击Retry using POST按钮,即可关闭Jenkins.

image

重启Jenkins 服务

将上面的exit改为restart后就可以重新启动jenkins服务器。

重载Jenkins配置文件

将上面的restart改为reload就可以实现重新加载Jenkins配置信息。

安装插件

Jenkins安装插件时,既可以选择在线安装,也可以离线安装。

在线安装

在线安装首先要保证Jenkins服务器可以上网。安装方法为:点击 ‘系统管理(Configure System)->插件管理(Manage Jenkins),选择可选插件,搜索需要的插件后直接安装即可。

image
image

​ 如果出现插件无法安装或安装失败的情况,尝试修改Jenkins配置文件(.jenkins/是隐藏目录):
$ vi .jenkins/hudson.model.UpdateCenter.xml

把'https'修改为'http'后,重载Jenkins配置信息。

image

如果仍不能解决问题,可能是Jenkins源的问题,可以尝试换一个源码,打开刚才的配置文件,把URL换成http://mirror.esuni.jp/jenkins/updates/update-center.json ,重启Jenkins,查看是否可以成功安装插件。

若以上方法都不能解决问题,请尝试插件离线安装方法。

离线安装

首先下载所需的Jenkins插件, 然后打开:系统管理-插件管理-高级,点击上传插件,选择扩展名为.hpi的插件。

image
上传成功后,插件自动安装。安装成功后,重启Jenkins后生效。

image

离线安装插件时,可能会因为依赖缺失的问题而导致安装失败。出现该种问题时,可以在Jenkins终端的输出日志中找到依赖的插件,先安装需要的依赖后,再安装插件。

由于是和rf集成,所以这里需要下载插件Robot Framework Plugin ,插件介绍详见Jenkins Wiki .

image

配置Slave

创建Slave

启动Jenkin服务的这台机器在Jenkins中被称为Master,而其他连到Master上的机器(物理机或虚拟机)被称为Slave. Master/Slave相当于 Server 和 Agent 的概念。Master 提供web接口让用户来管理 Job 和 Slave,Job 可以运行在Master本机或者被分配到Slave上运行。一个Master可以关联多个Slave用来为不同的Job或相同的Job的不同配置来服务。

image

进入系统管理->管理节点页面点击左侧的新建节点,输入节点名称,并选择固定代理(Dumb Slave),如果已经添加过节点了,也可以选择复制现有节点,It doesn't matter.

image

点击OK后进入有节点设置页面,此页面上有一些配置项,概要说明如下。

image
  • 并发构建数(# of executors): 这个值控制着Jenkins并发构建的数量,如果是UI测试的Job,最好只允许1个,其他的可以设置为多个;

    image
  • 远程工作目录: 设置此节点远程工作目录的路径,在这个节点上运行的Job都会保存到工作目录里,此配置项必须设置;

image
  • 标签:作用等同于robot framework中的tags, 可以设置Jobs只在特定的执行机上运行。如果指定固定的某个Slave,可能上面已经有Job在运行了,此时就要等待了;但是如果有一批Slave使用同一个tag,只要此处配置Job要运行到这个tag上,那么哪台Slave空闲就会在哪台机器上执行。

    image
  • 用法: 控制Jenkins如何在这台机器上安排构建,只有两个选项;

    image
  • 启动方式: 设置Jenkins Master如何启动Slave agents,当Job被分配到Slave上运行的时候,此时Master和Slave其实是建立的双向字节流的连接。默认情况下,是没有"通‘过Java web启动代理"这一选项的,需要手动配置Jenkins。

image

配置Jenkins使其支持通过Java web启动代理的方法如下:

  1. 打开首页-系统管理-全局安全配置(Configure Global Security);

  2. 代理 - TCP port for JNLP agents设置为“随机选取”;

image
  1. 点击代理协议,勾选全部选项;

    image
  2. Hidden security warnings中的Enable Agent需要打钩选中;

    image

保存后,配置节点时就可以看到"通‘过Java web启动代理" 这一选项了。

一般来说,选择通过Java Web这种方式启动Slave agents就可以了,这种方法需要你登录到Slave机器,详尽的启动步骤后面会描述。若在Master上运行cases,通常是隐藏进程运行的,这就导致如果我们的cases有UI层面的部分,很大可能会运行失败,这样的话我们就需要添加一个Slave节点来执行。大多数实际应用中,会有多台机器需要加入Jenkins,所以添加Slave更是必不可少的。

启动Slave

在Slave列表页可以看到,刚才创建的Slave图标上有一个红色的叉号,这代表当前此Slave处于offline状态。点击Slave名称,可以看到Jenkins给出了两种启动的方法,如下:

image

windows系统下,个人觉得第一种方法比较简单,点击【Launch】,会下载一个名为 "Slave-agent.jnlp"的文件,然后双击该文件就可以启动Slave了。

image

正常情况下,此时再去查看Slave列表,会发现图标上面的红叉已经消失了。

image

我的Slave节点的系统为win10,双击启动文件时,会报以下错误:

image

这个问题可能是由于工作目录丢失引起的,需要你在Slave远程工作目录下新建一个名为remoting的文件夹就可以正常启动了。

配置 Job

在Jenkins首页的左侧菜单栏,点击新建任务,输入一个任务名称,并选择“构建一个自由风格的软件项目”,点击确定进入配置Job页面。

image

配置Job页面分为六个部分,分别为General,源码管理,构建触发器,构建环境,构建,构建后操作,下面将会对这几部分的内容分别进行简要的说明。

General

  • 丢弃旧的构建

因为每构建一次Job都会有记录,如果构建次数很多,也可能会占用很多硬盘资源。因此,这个设置就是可以让我们控制丢弃旧的构建。
image
  • 参数化构建过程

    此处可以设置增加一些不同类型的参数,在构建时通过修改这些参数的值,来方便的改动一些配置。比如说用来打包APP的 Job,就可以加上版本号、环境等参数,在运行Jobs时简单的修改参数值,就可以打出指定的版本号和环境等满足条件的安装包。

    image
  • 关闭构建

    选中此项后,将不会执行此项目的新构建,这在某些情况下可能会很有用。

  • 在必要的时候并发构建

    选中此项后,当此项目有多个构建任务时可以并发执行。默认情况下,Jenkins默认是串行构建任务的,其他任何开始构建项目的请求都将保留在构建队列中,直到第一个构建完成为止。

  • 限制项目的运行节点

    选中此项后,需要输入一个标签表达式作为参数,意为指定当前Job只能在指定的Slave上执行。前面介绍Slave的时候也提到了标签,我推荐使用标签。因为如果直接使用Slave名称的话,可能会在Job比较多的时候造成拥堵,而使用标签后,只要是带有这个标签的Slave,哪个空闲就会安排那个执行,这样可以使资源充分利用,提高效率。

源码管理

Job中配置源码管理的前提是Jenkins服务器已经安装了对应的源码管理工具。Jenkins有很多种源码管理工具可以选择,但是需要下载响应的插件才可以,比如git,则需要安装Git client plugin 和 Git plugin插件。

image

其实,此处没有设置版本管理工具也不是不行,这样的话就需要手动去做更新的动作,加大了人力成本,Jenkins也不推荐这样做。如果大家的Cases使用了版本管理,这样在Cases更新后,Job就会自动Fetch最新的代码来运行,十分方便。

SVN(Subversion)

image
  • Repository URL :SVN库的地址;

  • Credentials: 证书设置,点击查看具体步骤;

  • Local module directory : 指定一个本地目录作为SVN检出到本地路径,可以为空。

  • Repository depth:需要检出的文件夹深度,默认设置为infinity(无穷大);

这几个配置好了,基本上就可以使用了。如果有多个不同的SVN库要检出的话,可以点击"Add moudle"来添加新的配置。

Git

Git的配置比较简单,只需要配置好Repository URL(Git库地址),Credentials(证书),并选择一个分支就可以了。

image

构建触发器

可以手动来触发一个构建,也可以通过触发器来自动构建,这里的设置需要根据项目情况自行考虑设置。设置构建触发器时,支持同时设置多个不同类型的触发器;

  • Build after other projects are built

    这个选项是在其他Job构建之后,触发当前项目构建。在构建后操作中也有一个"Build other projects"选项,作用其实和这边是一样的。区别就在于,在此处配置,则当前Job是被触发的对象,而在构建后操作配置,则当前项目就是触发者;

    image

    前面提到的"自动编译打包→自动部署→单元测试/代码扫描→自动测试"这一套流程,就是通过在这个地方进行配置的。对于自动化测试的Job来说,如果前面的Job没有构建成功,这里再构建也没什么必要,所以此处的可以选择"只在构建稳定时触发";

  • Build periodically

    此选项需要配置一个时间表达式,让Job在满足时间表达式的情况下执行构建,此处的语法遵循Linux cron服务的时间表达式语法(但有细微差别),并会自动检测语法正确性。点击文本框右边的问号就可以看到语法的帮助说明。

    image
  • Poll SCM

    Poll SCM 这里配置的时间表达式和前一个是完全一样的,只不过这个选项是只有在检测到版本库有更新时,才会触发执行。如果版本库没有更新,即使满足了时间表达式,也不会触发Job的构建。

  • 触发远程构建

    ​PASS.

构建

这里可以选择增加构建步骤,如果Slave是Windows系统,建议选择"Execute Windows batch command"来执行dos命令进行构建,其他平台,如Linux,可以选择"Execute shell",如果项目集成了Ant或Maven,也可以选择对应的选项。

pybot完整的命令行参数,可以在cmd下输入pybot --help查看。

图片.png

构建后操作

构建后操作可选的项同样有很多,根据用户安装的不同插件,可以实现不同的需求,如分析测试结果,发送邮件通知等。

由于我们的Jobs是和rf集成, 所以我们要增加构建后的步骤是Publishes Robot Framework test results, 只有安装了Robot Framework Plugin 插件才会出现该选项,界面如下所示:

image

Directory of Robot output 可以为空,如果前面的pybot命令使用参数-d 指定了输出目录,那么这里也必须要进行设置,否则插件找不到output.xml文件,也就无法解析结果了。所以这里设置的路径是RF运行后产生的xml和html文件所在的目录。

Directory of Robot output 用来设置临界值,一般都设置为100%,表示只要有案例运行失败,则Job的状态就是unstable. 此参数的介绍如下:

Specify thresholds for marking a build unstable or passed. Thresholds are expressed in percentage of tests that passed compared to total amount of tests run. Builds with pass percentage under the blue threshold wild be marked unstable and pass percentage under yellow threshold will yield a failed build.

If "Use thresholds for critical tests only" is selected thresholds will be compared to the pass ratio of critical tests instead of all tests.

配置Jenkins邮件通知

Jenkins本身自带的邮件通知功能较弱,我们可以通过下载'Email Extension Plugin'' 插件来自定义更高级的邮件通知功能。

具体配置步骤,请参照:https://zhuanlan.zhihu.com/p/22810691

【To be continued...】

参考文档

  1. 使用Jenkins进行持续集成, 廖雪峰

  2. linux下利用nohup后台运行jar文件包程序 ,一汪清水

  3. 用Jenkins构建一个新工程,我们一起试一下 ,幕客老师

  4. Jenkins-持续集成平台(安装篇) ,幕客老师

  5. Jenkins入门系列之——01第一章 Jenkins是什么? ,wangmm0218

  6. Jenkins Master/Slave架构, iTech

  7. Jenkins Guided Tour

  8. 基于jenkins搭建一个持续集成服务器,YaiHo

  9. Jenkins常用插件说明(持续更新) ,小学徒V

  10. Jenkins使用教程之关联节点 ,MR_Hanjc

  11. Jenkins 2.19.4默认没有Launch agent via Java Web Start,可通过以下来设置: , jgw2008

  12. jenkins Error performing command: git ls-remote -h , wangfei0904306

  13. Jenkins入门总结 ,iTech

  14. Robot Framework自动化测试修炼宝典[书],齐涛 著

  15. Jenkins的Credentials(证书)管理 ,张侦毅

  16. 配置Jenkins邮件通知, 邓布利多·雪​

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容