1.背景

随着公司产品线不断增加,在一台服务器上构建多个项目无疑会带来很大负载,本篇将实践如何利用jenkins分布式来构建job,当job量足够大的时候,此举可以有效的缓解jenkins-master上的压力。

2.环境准备

IP

操作系统

功能

192.168.50.72

Centos7

jenkins-master

10.20.32.183

Centos7

jenkins-slave(无需安装jenkins

10.20.32.187

Centos7

被部署端

3.组件安装

软件

路径

描述

JDK

/opt/idss/jenkins/jdk

/opt/idss/jenkins为自定义远程目录

MAVEN

/home/install/apache-maven-3.6.3

GIT

/usr/bin/git

4.节点配置

4.1 在jenkins上点击 “系统管理”--->“管理节点”--->“新建节点”,填写节点名称,勾选选项,点击ok开始新建节点

内网jenkins 密钥ssh 远程windows jenkins远程构建_分布式

4.2  配置信息如下

 

内网jenkins 密钥ssh 远程windows jenkins远程构建_jenkins_02

配置介绍:

名称:节点的名称

并发构建数:使用处理器个数作为其值会是比较好的选择(可以点击后面的?号来查看详细信息)设置为0即表示不删除该节点的配置但是不启动该节点

远程工作目录:操作服务器的目录

标签:为节点设置标签(在job配置中使用)

用法:选择尽可能使用的话,在构建job的时候会优先在该节点上构建;选择绑定job的话,需要在运行的节点中指定从节点.

启动方式:这里是选择通过的ssh,输出机器的用户名和密码即可登录

Host Key Verification Strategy:选择不验证(non verifying verification strategy)

可用性:尽量保持代码在线(这里仅仅做测试,不考虑性能消耗..)

接下来要在节点属性中添加一些工具列表,本次实验至少需要jdk、maven、git,因此必须得在这里进行配置,地址选择对应slave服务器上的地址

内网jenkins 密钥ssh 远程windows jenkins远程构建_linux_03

4.3 Credentials配置如下

内网jenkins 密钥ssh 远程windows jenkins远程构建_jenkins_04

4.4 查看节点连接状态

内网jenkins 密钥ssh 远程windows jenkins远程构建_maven_05

5.构建job配置

内网jenkins 密钥ssh 远程windows jenkins远程构建_jenkins_06

在job-限制项目的运行节点输入设置的节点标签,配置完成后保存,点击构建即可

6. 异常处理

Jenkins的slave异常:Exception in thread "main" java.lang.ClassNotFoundException: hudson.remoting.Launcher 

当任务分配到slave上执行时,报如下错误:


Parsing POMs
Established TCP socket on 38257
maven33-agent.jar already up to date
maven33-interceptor.jar already up to date
maven3-interceptor-commons.jar already up to date
[b012ef95d917292e062fe3d70c7a9b01] $ java -cp /var/lib/jenkins/maven33-agent.jar:/usr/install/apache-maven-3.3.9/boot/plexus-classworlds-2.5.2.jar:/usr/install/apache-maven-3.3.9/conf/logging jenkins.maven3.agent.Maven33Main /usr/install/apache-maven-3.3.9 /var/lib/jenkins/slave.jar /var/lib/jenkins/maven33-interceptor.jar /var/lib/jenkins/maven3-interceptor-commons.jar 38257
Exception in thread "main" java.lang.ClassNotFoundException: hudson.remoting.Launcher
	at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
	at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271)
	at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247)
	at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239)
	at jenkins.maven3.agent.Maven33Main.main(Maven33Main.java:133)
	at jenkins.maven3.agent.Maven33Main.main(Maven33Main.java:64)


ERROR: Failed to parse POMs
java.io.EOFException: unexpected stream termination
	at hudson.remoting.ChannelBuilder.negotiate(ChannelBuilder.java:365)
	at hudson.remoting.ChannelBuilder.build(ChannelBuilder.java:310)
	at hudson.slaves.Channels.forProcess(Channels.java:115)
	at hudson.maven.AbstractMavenProcessFactory.newProcess(AbstractMavenProcessFactory.java:294)
	at hudson.maven.ProcessCache.get(ProcessCache.java:236)
	at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.doRun(MavenModuleSetBuild.java:798)
	at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:534)
	at hudson.model.Run.execute(Run.java:1730)
	at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:544)
	at hudson.model.ResourceController.execute(ResourceController.java:97)
	at hudson.model.Executor.run(Executor.java:405)


搜索了下解决办法:说是重连下slave。照做,问题解决。看下master连接slave的日志信息,我想原因应该是我修改过slave的环境变量hostname。不知道修改其他环境变量是否也会有同样的影响。