在Jenkins中配置从节点
增加节点后,实际并没有直接连上,还需要在节点服务器上进行相应的配置
在从节点服务器的host中的加入配置
1 | sudo vim /etc/hosts |
1 | 111.111.111.111 jenkins.shadow.com # 前部分IP为Jenkins的内网地址,后部分为Jenkins的对外访问域名 |
从节点服务器上配置Jenkins节点配置
点击上图中的slave.jar
的链接,下载该文件,放在上方指定的Jenkins
工作目录下
1 | test@test-devtesting-00001:~/jenkins$ ll |
将提示中的启动Jenkins
的脚本写入文件start_jenkins.sh
中
1 | java -jar slave.jar -jnlpUrl http://jenkins.shadow.com/computer/test-devtesting-00001/slave-agent.jnlp 2>&1 & |
- 如果在 slave 上执行脚本出现乱码问题,可以通过加该参数
-Dfile.encoding=UTF-8
解决 - 如果服务器存在密码,用于免密链接需要加该参数
-secret 815485b5788e77960f86a6e02q3easf1cxad55c9fa104c0e754c1efb046e8a50
,该参数一般在 jenkins 的 slave 设置页会显示出来。
赋予start_jenkins.sh
执行权限
1 | chmod a+x start_jenkins.sh |
启动slave
1 | ./start_jenkins.sh |
回到Jenkins节点列表,查看添加的节点,状态如图就说明启动成功了。
至此,slave节点就配置并启动完毕了。
通过SSH
的方式连接slave
- 启动方式:
Launch agent agents via SSH
- 主机:Agent’s Hostname or IP
- Credentials:登录以上
主机
的账密信息
该种连接slave
的方式依赖Java
环境,所以需要设置一个JAVA_HOME
的环境变量
如无问题,点击保存之后,就会正常连接成功了
问题处理
出现
java.net.ConnectException: Connection refused (Connection refused)
解决方式
在 jenkins 的系统设置
中的Jenkins Location
模块下的Jenkins URL
中,不要使用域名,而是直接写http://IP:port
slave
经常会掉线处理
首先需要获取到slave的状态1
http://hostName/computer/slaveName/api/json?pretty=true
请求该url会得到一个slave状态的结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75{
"_class" : "hudson.slaves.SlaveComputer",
"actions" : [
{
"_class" : "hudson.plugins.jobConfigHistory.ComputerConfigHistoryAction"
},
{
}
],
"assignedLabels" : [
{
"name" : "Mac_slave"
}
],
"description" : "",
"displayName" : "Mac_slave",
"executors" : [
{
},
{
}
],
"icon" : "computer.png",
"iconClassName" : "icon-computer",
"idle" : true,
"jnlpAgent" : true,
"launchSupported" : false,
"loadStatistics" : {
"_class" : "hudson.model.Label$1"
},
"manualLaunchAllowed" : true,
"monitorData" : {
"hudson.node_monitors.SwapSpaceMonitor" : {
"_class" : "hudson.node_monitors.SwapSpaceMonitor$MemoryUsage2",
"availablePhysicalMemory" : -1,
"availableSwapSpace" : 830472192,
"totalPhysicalMemory" : -1,
"totalSwapSpace" : 1073741824
},
"hudson.node_monitors.TemporarySpaceMonitor" : {
"_class" : "hudson.node_monitors.DiskSpaceMonitorDescriptor$DiskSpace",
"timestamp" : 1596678461230,
"path" : "/private/var/folders/3z/t812m3_x2218m6wchwd0ttdm0000gn/T",
"size" : 63684665344
},
"hudson.node_monitors.DiskSpaceMonitor" : {
"_class" : "hudson.node_monitors.DiskSpaceMonitorDescriptor$DiskSpace",
"timestamp" : 1596678460739,
"path" : "/Users/shadow/jenkins_slave/workspace",
"size" : 63684665344
},
"hudson.node_monitors.ArchitectureMonitor" : "Mac OS X (x86_64)",
"hudson.node_monitors.ResponseTimeMonitor" : {
"_class" : "hudson.node_monitors.ResponseTimeMonitor$Data",
"timestamp" : 1596678460739,
"average" : 106
},
"hudson.node_monitors.ClockMonitor" : {
"_class" : "hudson.util.ClockDifference",
"diff" : -45
}
},
"numExecutors" : 2,
"offline" : false,
"offlineCause" : null,
"offlineCauseReason" : "",
"oneOffExecutors" : [
],
"temporarilyOffline" : false,
"absoluteRemotePath" : "/Users/shadow/jenkins_slave/workspace"
}其中有一个
offline
字段,false
表示在线,true
表示掉线,并且会在offlineCauseReason
字段中显示掉线原因
然后我们可以通过定时获取offline
字段的值来判断slave
是否掉线,如果掉线了,就采取相应的重启slave
的措施处理代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34# -*- coding: utf-8 -*-
from time import sleep
import paramiko
import requests
def getSlaveStatus():
baseapi = 'http://jenkins.shadow.com/computer/Mac_slave/api/json?pretty=true'
resp = requests.get(baseapi)
result = resp.json()
return result
def judgeStatus():
while True:
sleep(3)
result = getSlaveStatus()
print(result)
status = result["offline"]
while status:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.8.8', port=22, username='shadow', password='V4Hubd1WBePJ')
stdin, stdout, stderr = ssh.exec_command(
"nohup java -Xmx1024m -jar /Users/shadow/jenkins_slave/agent.jar -jnlpUrl "
"http://jenkins.shadow.com/computer/Mac_slave/slave-agent.jnlp -secret "
"d6c66e20341aa6e628b5f057355384a1q21q1q1a462349a852eec1294ad40cbd016964cb &")
print(stdout.read())
break
if __name__ == '__main__':
judgeStatus()