Jenkins分布式构建

Jenkins分布式构建(Jenkins Distributed builds)

前言:

当自动化测试用例需要在多个PC机或虚拟机中执行时,如果在每个虚拟机中均搭建类似tomcat+jenkins的环境,将会造成例如每台虚拟机资源占用大、对环境的配置维护成本大等弊端,此时,就可以采用Jenkins分布式构建方式了。

一、Jenkins节点配置

1.Master配置

1)进入Master的http://ip:8080/jenkins/网页界面

2)进入系统管理——节点管理界面

3)点击“新建节点”

远程工作目录:指定远程中的节点机器的工作目录,即Job中checkout出的代码所在的workspace目录

标签:该节点的唯一标识,当在Job中要指定只在该节点进行构建与测试时,通过该唯一标识进行指定

其中启动方法有四种:

Launch slave agents on Unix machines via SSH:                    当节点为Unix
slaves时,可以选择此种方式

Launch
slave agents via Java Web Start:                               使用JNLP方式来建立slave与master的连接

Launch
slave via execution of command on the Master:           使用命令行方式

Let
Jenkins control this Windows slave as a Windows service :Jenkins将把该Windows slave当做Windows
service进行控制

对于Windows操作系统的节点,推荐用第二种Launch
slave agents via Java Web Start

点击“保存”后,在Master中一个节点就配置好了

2.slave节点配置

当节点以Launch slaveagents via Java Web Start配置好后,在节点界面将看到如图所示,其slave有三种启动方法,本质上其实就一种,即将master中的slave-agetn.jnlp文件下载至slave所在的虚拟机,然后运行文件。

注:上图中Run from slave command line中的ip地址,如果在jenkins系统配置界面中没设置过ip的话,将为localhost,因此此时需要自己先查看下自己master机器的ip。

因此为方便,可以将连接方式写入bat批处理文件中。

1)进入节点虚拟机,先创建刚才配置的远程工作目录(D:\\jenkins)

2)创建bat文件,命令为例如:start_jenkins_agent.bat  内容:

javaws http://192.168.10.181:8080/jenkins/computer/Windows_181_to_4400/slave-agent.jnlp

3)双击运行文件即可看到slave节点与master连接

注:上图中,点击File——Installas a services  可以将该slave agent以Windows系统服务运行,理论上方便于开机自启动,但作为Windows服务,是无法与GUI进行交互的,因此没法启动火狐进行selenium的自动化测试,因此如果自动化测试与GUI相关,这里千万别Install as a services。

二、Job配置

在Master中新建一个job,其中在配置页面中勾选Restrict when this project can be run,Label选择要在哪个节点中运行,这样就可以指定该job在哪个slave节点中运行了

三、Jenkins slave开机自启动

1)若要对所用用户均进行开机自启动,则将.bat启动文件的快捷方式放入 ‘\Documents and Settings\All Users\“开始”菜单\程序\启动’  目录下

2)若只要对指定用户进行开机自启动,则将.bat启动文件的快捷方式放入 ‘\Documents and Settings\ <用户名字>\“开始”菜单\程序\启动’  目录下

四、Jenkins节点监控

jenkins节点由于系统运行、网络环境等各种因素,难免会出现系统挂机、节点掉线等情况,因此要想及时发现这些情况,就需要对节点进行监控,

可以采用这里推荐的监控并重连机制:https://wiki.jenkins-ci.org/display/JENKINS/Monitor+and+Restart+Offline+Slaves

1)由于jenkins节点监控使用的是groovy脚本调用的jenkins内部api,因此需要先安装groovy plugin插件

2)在Master中新建一个名字为如monitor的job,设置为例如每30分钟运行一次。

3)新增Excute system Groovy script构建步骤:

输入groovy脚本(由于wiki中的没有邮箱认证步骤,因此这里的脚本增加了邮箱认证):

import hudson.model.*
import hudson.node_monitors.*
import hudson.slaves.*
import java.util.concurrent.*

jenkins = Hudson.instance

import javax.mail.internet.*;
import javax.mail.*
import javax.activation.*

def sendMail (slave, cause) {
  //这里使用的是参数化构建中的变量,如果不使用此方式,可以注释掉,而使用下面的toAddress
 toAddress = build.buildVariableResolver.resolve("EMAIL_RECEIVERS")

 message = slave + " slave is down. Check http://192.168.10.181:8080/jenkins/computer/" + slave + "\nBecause " + cause
 subject = "【jenkins节点监控】" + slave + " slave is offline"
 //toAddress = "***@***.com;***@***.com"
 fromAddress = "***@***.com"
 host = "SMTP_SERVER"
 port = "SMTP_PORT"

 Properties props = new Properties();
 // 发送邮件的服务器
 props.setProperty("mail.smtp.host", "smtp.***.com");
 // 发送邮件的协议
 props.setProperty("mail.transport.protocol", "smtp");
 // 在连接服务器的时候是否需要验证,发邮件是需要验证的
 props.setProperty("mail.smtp.auth", "true");

 // 当需要进行验证的时候,会自动从Session中去取该Authenticator对象
 Authenticator authenticator = new Authenticator() {

   @Override
   protected PasswordAuthentication getPasswordAuthentication() {
     return new PasswordAuthentication("your user name", "your passwd"); //输入用户名、密码
   }

 };

 Session lSession = Session.getInstance(props,authenticator);
 MimeMessage msg = new MimeMessage(lSession);

 //tokenize out the recipients in case they came in as a list
 StringTokenizer tok = new StringTokenizer(toAddress,";");
 ArrayList emailTos = new ArrayList();
 while(tok.hasMoreElements()){
 emailTos.add(new InternetAddress(tok.nextElement().toString()));
 }
 InternetAddress[] to = new InternetAddress[emailTos.size()];
 to = (InternetAddress[]) emailTos.toArray(to);

 msg.setRecipients(MimeMessage.RecipientType.TO,to);
 InternetAddress fromAddr = new InternetAddress(fromAddress);
 msg.setFrom(fromAddr);
 msg.setFrom(new InternetAddress(fromAddress));
 msg.setSubject(subject);
 msg.setText(message)

 Transport transporter = lSession.getTransport("smtp");
 transporter.connect();
 transporter.send(msg);
}

def getEnviron(computer) {
   def env
   def thread = Thread.start("Getting env from ${computer.name}", { env = computer.environment })
   thread.join(2000)
   if (thread.isAlive()) thread.interrupt()
   env
}

def slaveAccessible(computer) {
    getEnviron(computer)?.get('PATH') != null
}

def numberOfflineNodes = 0
def numberNodes = 0
for (slave in jenkins.slaves) {
   def computer = slave.computer
   numberNodes ++
   println ""
   println "Checking computer ${computer.name}:"
   def isOK = (slaveAccessible(computer) && !computer.offline)
   if (isOK) {
     println "\t\tOK, got PATH back from slave ${computer.name}."
     println('\tcomputer.isOffline: ' + slave.getComputer().isOffline());
     println('\tcomputer.isTemporarilyOffline: ' + slave.getComputer().isTemporarilyOffline());
     println('\tcomputer.getOfflineCause: ' + slave.getComputer().getOfflineCause());
     println('\tcomputer.offline: ' + computer.offline); 

   } else {
     numberOfflineNodes ++
     println "  ERROR: can't get PATH from slave ${computer.name}."
     println('\tcomputer.isOffline: ' + slave.getComputer().isOffline());
     println('\tcomputer.isTemporarilyOffline: ' + slave.getComputer().isTemporarilyOffline());
     println('\tcomputer.getOfflineCause: ' + slave.getComputer().getOfflineCause());
     println('\tcomputer.offline: ' + computer.offline);
     sendMail(computer.name, slave.getComputer().getOfflineCause().toString())
     if (slave.getComputer().isTemporarilyOffline()) {
      if (!slave.getComputer().getOfflineCause().toString().contains("Disconnected by")) {
         computer.setTemporarilyOffline(false, slave.getComputer().getOfflineCause())
      }
     } else {
         computer.connect(true)
     }
   }
 }
println ("Number of Offline Nodes: " + numberOfflineNodes)
println ("Number of Nodes: " + numberNodes)

注:jenkins 在1.582版本时修复了一个slave会概率性出现掉线,且无法重连,只至重启才能再次连接的问题,CancelledKeyException can cause all JNLP slaves
to disconnect (and the problem remains until restart):https://issues.jenkins-ci.org/browse/JENKINS-24050

因此建议将jenkins升级至最新的或1.582以上的版本

时间: 2024-10-11 19:53:38

Jenkins分布式构建的相关文章

jenkins 分布式构建

jenkins 分布式构建 ? 什么是Jenkins的分布式构建和部署?? Jenkins的分布式构建,在Jenkins的配置中叫做节点,分布式构建能够让同一套代码或项目在不同的环境(如:Windows和Linux系统)中编译.部署等 ? 什么时候使用节点和作用?? 当我们使用多台服务器时,并且配置了tomcat或jboss集群服务,可通过jenkins的节点配置,将jenkins项目发布在不同服务器上(分布jenkins工作空间,部署项目到不同服务器的tomcat或jboss),这就形成了je

连载三:RobotFramework+Selenium+Jenkins分布式构建

目标:Jenkins安装在服务器上,而使用Jenkins调用本机的脚本并在本机执行. 步骤: (1)需要有RobotFrameWork+Selenium的运行环境: python2.7,Robotframework,selenium2library,databaselibrary,PyMySQL (2)在jenkins上面添加节点: (3)创建任务并进行配置: 详细介绍: (1)略,在连载二里面有说明. (2)启动Jenkins以后,建议通过谷歌或者火狐浏览器来访问,然后按照以下步骤来添加节点

Jenkins的分布式构建及部署——节点

一 什么是Jenkins的分布式构建和部署 Jenkins的分布式构建,在Jenkins的配置中叫做节点,分布式构建能够让同一套代码或项目在不同的环境(如:Windows和Linux系统)中编译.部署等. 二 什么时候使用节点和作用 当我们使用多台服务器时,并且配置了tomcat或jboss集群服务,可通过jenkins的节点配置,将jenkins项目发布在不同服务器上(分布jenkins工作空间,部署项目到不同服务器的tomcat或jboss),这就形成了jenkins的分布式.节点服务器不需

Jenkins分布式部署配置

为什要使用Jenkins分布式? 利用jenkins分布式来构建job,当job量足够大的时候,可以有效的缓解jenkins-master上的压力,提高并行job数量, 减少job处于pending状态时间. 准备: windows上启动jenkins作为master  ip:192.168.29.94 mac机作为slave  ip:192.168.22.99 部署方式: 方法一: (推荐使用) Jenkins ver2.155采用往tomcat里丢war包方式部署,启动tomcat即可访问J

谈谈对Jenkins持续构建的认识

通过多次搭建Jenkins持续构建环境,终于对Jenkins有了进一步认识,在此把所学所得和大家分享一下,希望可以帮助大家快速掌握Jenkins的核心思想. 在安装完Jenkins的setup.exe程序后,在浏览器会自动打开Jenkins的主页,通过Jenkins主页配置各种参数.  过程一:安装Jenkins的MsBuild Plugin插件,此插件用于支持MSBuild.exe的构建工作: 过程二:配置插件,告诉MsBuild Plugin插件用哪个版本的MSBuild.exe来构建,比如

手工触发jenkins自动构建

手工触发jenkins自动构建 点击项目的配置 2. 设置手工构建连接 3.在浏览器里输入来触发jenkins的项目构建

Jenkins自动化构建python nose测试

简介 通过Jenkins自动化构建python nose测试分两步: 1. 创建节点(节点就是执行自动化测试的机器): 2. 创建任务并绑定节点(用指定的机器来跑我们创建的任务,这里我们选择执行一段脚本). 创建节点 1. 登录jenkins平台,在左侧的节点中随便找一个节点点进去,然后在导航栏点击“nodes”-->点击“创建节点”-->输入“节点名称”-->选择“Permanent Agent”-->点击“OK”: 2. 指定jenkins的工作目录,随便指定-->点击“

从零开始使用Jenkins来构建Docker容器(Ubuntu 14.04)

当开发更新了代码,提交到Gitlab上,然后由测试人员触发Jenkins,于是一个应用的新版本就被构建了.听起来貌似很简单,duang~duang~duang,我用了是这样,你们用了也是这样,看起来这个过程很自动化,其实这里面加了很多特技,根本就没有这样的头发,不对,根本就没有这样简单的方式,其环境搭建的过程十分繁琐,jenkins的上下文关系配置更是相当困难.今天我来介绍一种简单的新方法-使用Jenkins来构建一个apache容器. 以下操作的目标:jenkins放置在宿主机内(Ubuntu

码云Webhook触发Jenkins自动构建 - Jenkins演练(一)

今天自己看着插件文档摸索了一下,实现了git push后Webhook自动触发Jenkins进行代码构建,可通用gitlab.github等平台,中文关于这方面自动部署的文档比较少,所以把我的学习过程记录下来,让其他人少走点弯路. 模拟场景:开发人员在dev分支提交代码后,Jenkins自动构建和部署,非dev分支提交代码不会触发. 实战环境:码云(git.oschina.net).Jenkins(可在公网访问).插件Generic Webhook Trigger 步骤1: 码云新增一个项目,新