通过SSH或JNLP方式创建Jenkins Linux Slave

文章目录

  • 通过SSH或JNLP方式创建Jenkins Linux Slave
    • 通过SSH方式创建Jenkins Linux Slave
      • 在Jenkins Slave机器上创建`jenkins`的Linux账号
      • 在Jenkins Master机器上生成SSH Keys
      • 将Jenkins Master的SSH public key放到Jenkins Slave机器的`jenkins`账号下
      • 在Jenkins配置SSH Credential
      • 在Jenkins上添加Node
      • 测试指定Jenkins Slave运行
    • 通过JNLP方式创建Jenkins Linux Slave
      • 选择“TCP port for JNLP agents”
      • 添加Jenkins Node
      • 在slave机器上创建jenkins账号
      • 下载Jenkins Agent程序包放到slave机器上
      • 在slave上运行Jenkins Slave
      • 设置Jenkins Slave开机自启动
    • 参考文档
    • Troubleshooting

通过SSH或JNLP方式创建Jenkins Linux Slave

创建Jenkins Linux Slave最简单的方法是通过SSH连接Jenkins Master和Jenkins Slave,如果在不能设置SSH的情况,还可以选择通过JNLP方式创建Jenkins Linux Slave。

通过SSH方式创建Jenkins Linux Slave

在Jenkins Slave机器上创建jenkins的Linux账号

在Jenkins Slave机器上创建jenkins的Linux账号:

sudo useradd jenkins -U -s /bin/bash -d /var/lib/jenkins -m

执行passwd jenkins来修改jenkins账号密码

在Jenkins Master机器上生成SSH Keys

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""

将Jenkins Master的SSH public key放到Jenkins Slave机器的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>

在Jenkins配置SSH Credential

添加类型为SSH Username with private key的Credential,输入Username为jenkins,选择直接输入SSH private key,并将Jenkins Master上的SSH private key(id_rsa)的内容复制到SSH private key中。

最后输入一个有意义的ID和Description。

在Jenkins上添加Node

打开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 Slave运行

创建一个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"
            }
        }
	}
}

通过JNLP方式创建Jenkins Linux Slave

选择“TCP port for JNLP agents”

打开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随机端口。

添加Jenkins Node

打开Manage Jenkins -> Manage Nodes,点击New Node。

输入Node name为一个有意义的名字

选择Permanent Agent

填写Node的信息如下:

  • Remote root directory为在Jenkins Slave机器上Jenkins agent的根目录,比如/var/lib/jenkins
  • Labels用来给Jenkins job/pipeline来指定在哪些Agent上运行,多个label用空格隔开,比如linux Linux
  • Usage选择“Only build jobs with label expression matching this node”配合Labels来使用
  • Launch method选择"Launch agent by connecting it to the master"。

注意:如果没有配置好上面的”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”

在slave机器上创建jenkins账号

创建jenkins账号,属于jenkinsgroup,并创建其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

下载Jenkins Agent程序包放到slave机器上

打开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

在slave上运行Jenkins Slave

打开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开机自启动

设置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

参考文档

  • http://yallalabs.com/devops/how-to-add-linux-slave-node-agent-node-jenkins/
  • https://mohitgoyal.co/2017/02/14/add-linux-slave-node-in-the-jenkins/

Troubleshooting

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

你可能感兴趣的:(Jenkins,Jenkins,Jenkins,Slave,Jenkins,Agent,Jenkins,Node)