创建Jenkins Linux Slave最简单的方法是通过SSH连接Jenkins Master和Jenkins Slave,如果在不能设置SSH的情况,还可以选择通过JNLP方式创建Jenkins Linux Slave。
jenkins
的Linux账号在Jenkins Slave机器上创建jenkins
的Linux账号:
sudo useradd jenkins -U -s /bin/bash -d /var/lib/jenkins -m
执行passwd jenkins
来修改jenkins账号密码
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
jenkins
账号下
# 复制Jenkins Master上的~/.ssh/id_rsa.pub的内容,添加到Jenkins Slave的~/.ssh/authorized_keys的末尾
su - jenkins
vi ~/.ssh/authorized_keys
如果Jenkins Slave机器上~/.ssh
目录还不存在,则需要先执行:
mkdir -p ~/.ssh
touch ~/.ssh/authorized_keys
chmod -R 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
在Jenkins Master机器上测试能否免密码SSH到Jenkins Slave机器:
ssh jenkins@<jenkins_slave_server>
添加类型为SSH Username with private key的Credential,输入Username为jenkins
,选择直接输入SSH private key,并将Jenkins Master上的SSH private key(id_rsa
)的内容复制到SSH private key中。
最后输入一个有意义的ID和Description。
打开Manage Jenkins / Manage Nodes,选择New Node,选择Node类型为Permanent。
Number of executors建议选择不超过Jenkins Slave机器的CPU核数(可以通过htop
命令查看CPU核数)
Remote root directory为Jenkins Slave上jenkins
账号的Home目录,这里为/var/lib/jenkins
。
Labels输入一个或多个有意义的标签,便于Jenkins job根据该标签来指定Jenkins Slave运行。
Usage选择为Only build jobs with label …
Launch method选择为Launch slave agent via SSH,输入Jenkins Slave服务器的IP地址,选择上面配置的SSH Credential,Host Key Verification Strategy选择为Non verifying Verification Strategy。
Availability选择为Keep this agent online as much as possible。
保存完成后,查看新建的Node是否在线。
如果显示offline,点击Launch按钮重试,并根据错误日志排查错误。
创建一个Jenkins freestyle job,在General中选择Restrict where this project can be run,输入前面配置的Label。
运行该job,回到Jenkins首页,查看左下方的Build Executor Status中是否由指定Jenkins Slave正在运行job。
或创建一个Jenkins pipeline来测试:
pipeline {
agent {label 'linux'}
stages {
stage('Test') {
steps {
echo "Test run on a given jenkins slave"
}
}
}
}
打开Manage Jenkins -> Configure Global Security,找到Agents,选择TCP port for JNLP agents为Fixed。
输入一个端口号,比如5000,可以执行netstat -tnlp
查看端口是否被占用。
展开Agent protocols,确保勾选”Inbound TCP Agent Protocol/4 (TLS encryption)“,也就是JNLP-4。
在Jenkins Master服务器上打开上面的JNLP端口:
firewall-cmd --list-all
firewall-cmd --zone=public --add-port=5000/tcp
firewall-cmd --zone=public --add-port=5000/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all
如果在Jenkins Master服务器上关闭了防火墙,也可以设置JNLP端口为Random随机端口。
打开Manage Jenkins -> Manage Nodes,点击New Node。
输入Node name为一个有意义的名字
选择Permanent Agent
填写Node的信息如下:
/var/lib/jenkins
linux Linux
注意:如果没有配置好上面的”TCP port for JNLP agents“,Launch method中看不到“Launch agent via Java Web start”的选项。新版Jenkins的launch method是“Launch agent by connecting it to the master”,旧版是“Launch agent via Java Web start”
创建jenkins
账号,属于jenkins
group,并创建其home目录为/var/lib/jenkins
:
sudo useradd jenkins -U -s /bin/bash -d /var/lib/jenkins -m
查看结果:
ll /var/lib | grep jenkins
# drwx------. 2 jenkins jenkins 62 Jul 19 13:48 jenkins
cat /etc/passwd | grep jenkins
# jenkins:x:1000:1000::/var/lib/jenkins:/bin/bash
cat /etc/group | grep jenkins
# jenkins:x:1000:
执行passwd jenkins
来修改jenkins账号密码。
把jenkins账号赋予sudo
权限,修改/etc/sudoers
文件:
# Add below line under "Allow root to run any commands anywhere"
jenkins ALL=(ALL) NOPASSWD: ALL
打开Manage Jenkins -> Manage Nodes,打开刚才新建的Node。
点击agent.jar链接,下载agent.jar文件,放到slave机器上的Jenkins根目录(即Node里面的Remote root directory,比如/var/lib/jenkins
)
或以jenkins账号登录在Slave机器,执行以下命令:
cd /var/lib/jenkins
# curl -O http://192.168.87.151:8080/jnlpJars/agent.jar
curl -O http://<jenkins_host>:<jenkins_port>/jnlpJars/agent.jar
打开Manage Jenkins -> Manage Nodes,打开刚才新建的Node,复制运行Jenkins slave的命令。
以jenkins账号登录在Slave机器,将命令内容保存到/var/lib/jenkins/jenkins_slave.sh
脚本中。
示例:
#!/bin/sh
JENKINS_HOME=/var/lib/jenkins
JENKINS_URL=http://192.168.87.151:8080
JENKINS_NODE_NAME=linux-node1
JENKINS_NODE_SECRET=59f8ab35a33944b1279a5fd25892c16cadb4298bba352d3e1283cf272ba21c27
return_code=0
case "$1" in
start)
echo "Starting Jenkins slave"
nohup java -jar ${JENKINS_HOME}/agent.jar \
-jnlpUrl ${JENKINS_URL}/computer/${JENKINS_NODE_NAME}/slave-agent.jnlp \
-secret ${JENKINS_NODE_SECRET} \
-workDir "${JENKINS_HOME}" > /dev/null 2>&1 &
return_code=$?
;;
stop)
echo "Stopping Jenkins slave"
ps -ef | grep jenkins | grep agent | grep -v grep | awk '{print $2}' | xargs kill -9
return_code=$?
esac
exit $return_code
脚本参见:
https://github.com/cookcodeblog/OneDayDevOps/blob/master/components/jenkins-slave/jenkins_slave.sh
执行chmod +x jenkins_slave.sh
设置可执行的文件权限。
执行./jenkins_slave.sh start
启动Jenkins Slave。
打开Manage Jenkins -> Manage Nodes,查看Jenkins Slave节点状态是否正常。
设置Jenkins Slave以服务方式启动:
sudo cat > /etc/systemd/system/jenkins.service <<EOF
[Unit]
Description=jenkins service
After=network.target
[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/var/lib/jenkins/jenkins_slave.sh start
ExecStop=/var/lib/jenkins/jenkins_slave.sh stop
User=jenkins
Restart=on-abort
[Install]
WantedBy=multi-user.target
EOF
重新加载配置并启动Jenkins Slave服务:
sudo systemctl daemon-reload
sudo systemctl enable jenkins
sudo systemctl start jenkins
sudo systemctl status jenkins
Q: 通过SSH方式创建Jenkins Slave时报错:
Warning: no key algorithms provided; JENKINS-42959 disabled
...
Key exchange was not finished, connection is closed
A:这是因为创建Node时默认选择Host Key Verification Strategy为“Know hosts file Verification Strategy",启动了对~/.ssh/knows_hosts
文件的校验。最简单的解决方法是选择为”Non verifying Verification Strategy“,即不做校验。参见:https://issues.jenkins-ci.org/browse/JENKINS-42959