DevOps篇: 多节点部署 Jenkins
DevOps篇: 多节点部署 Jenkins
在软件开发过程中,持续集成和自动化构建是必不可少的环节。Jenkins作为一款优秀的CI/CD工具,被广泛使用。它支持众多插件和工具,能够自动化构建、测试和部署,实现持续集成和持续交付,提升软件开发效率和质量。
今天为大家介绍如何部署多节点Jenkins
为什么需要 Jenkins 多节点?
分布式构建:在多节点部署的情况下,可以将构建工作分配到不同的节点上去执行,从而实现加速构建、降低风险等目的。
大规模部署:在大规模的项目中,可能需要同时部署多个
Jenkins节点,这样可以缓解任务压力,提高系统的可扩展性和鲁棒性。不同操作系统支持:由于
Jenkins可以在多个操作系统上运行,因此在多节点部署的情况下,可以针对不同的操作系统配置和管理不同的节点。冗余:在多节点部署的情况下,如果某个节点发生故障,可以通过其他可用的节点来提供服务,并且不会停止整个
Jenkins系统的运行。
总的来说,多节点部署可以提高Jenkins系统的性能、可扩展性、鲁棒性和可靠性。
实战部署 Jenkins
下文会详细介绍通过
Docker Compose方式部署Jenkins主节点,以及分别通过SSH方式 和JavaWeb代理方式部署Jenkins从节点。3 个节点默认都已安装好Docker环境。
1. 使用 Docker 部署 Jenkins 主节点
镜像使用
jenkins/jenkins:lts长期支持版本,docker-compose.yml配置如下
version: "3"
services:
jenkins:
image: "jenkins/jenkins:lts"
container_name: jenkins
privileged: true
restart: always
ports:
- "8080:8080"
environment:
- TZ=Asia/Shanghai
volumes:
# jenkins 工作目录
- ./jenkins_home:/var/jenkins_home
创建
jenkins_home目录并修改权限
mkdir jenkins_home
chown -R 1000:1000 ./jenkins_home
启动容器并查看日志
# 后台启动容器
docker-compose up -d
# 查看容器日志
docker-compose logs -f
从日志中获取初始密码 或 查看容器内的
/var/jenkins_home/secrets/initialAdminPassword文件获取初始密码

2. Jenkins 初始化配置
容器启动成功后,则可以通过网页访问
jenkins页面。
2.1. 新手入门配置
输入初始密码,初始密码可以通过容器日志获取 或 查看容器内的var/jenkins_home/secrets/initialAdminPassword文件

选择「安装推荐的插件」,等待安装完成

设置管理员账号密码

配置完成后进入到Jenkins主页

2.2. 安装插件
由于后续我会采用
docker方式运行容器进行构建,所以这里不需要对全局工具构建工具进行配置,如:maven、nodejs等。所以只需要安装Docker Pipeline插件即可

找到插件勾选并点击安装后重启

3. SSH 方式部署 Jenkins 从节点
3.1. 从节点安装 JDK11
注意:需要安装
jdk11或更高版本,实测使用jdk8时安装报错
mkdir -p /data/jenkins-agent/
cd /data/jenkins-agent/
# 安装 openjdk-11
wget https://d6.injdk.cn/openjdk/openjdk/11/openjdk-11+28_linux-x64_bin.tar.gz
# 解压,解压后的目录名为 jdk-11
tar -zxvf openjdk-11+28_linux-x64_bin.tar.gz
# 删除压缩包
rm -rf openjdk-11+28_linux-x64_bin.tar.gz
3.2. 新增节点
Jenkins -> 系统管理 -> 节点管理,可以看到当前已有了内置的master节点。

新建节点,填写节点名称为worker1

填写配置

填写SSH信息,设置Java路径为/data/jenkins-agent/jdk-11/bin/java,点击保存。

这样节点就会自动开始配置了,可以通过日志查看状态
稍等片刻后节点就准备完成了,可以通过「脚本命令行」执行Groovy脚本进行测试

Groovy脚本正常执行并返回了节点信息,这样worker1节点就安装完成了。
4. JavaWeb 代理方式部署 Jenkins 从节点
Jenkins除了提供SSH方式安装节点外还提供了JavaWeb代理方式安装节点。这种方式相比使用SSH方式时,Jenkins主节点必须要能够访问从节点的SSH服务,对网络的要求更低,只需要从节点能够访问Jenkins网页服务就可以,在实际使用中更为实用。
4.1. Jenkins 页面新增从节点
页面新增节点与
SSH安装方式中介绍的类似,启动方式选择「通过 Java Web 启动代理」


创建节点后页面给出了agent.jar的下载地址和启动命令,这里我们记录下后续需要使用。

4.2. 从节点上启动 Java Web 代理
在从节点上安装
openjdk-11,并启动Java Web代理
# 创建工作目录(与页面新建节点时填写的一致)
mkdir -p /data/jenkins-agent
cd /data/jenkins-agent/
# 下载 openjdk-11 并解压,解压后的目录名为 jdk-11
wget https://d6.injdk.cn/openjdk/openjdk/11/openjdk-11+28_linux-x64_bin.tar.gz
tar -zxvf openjdk-11+28_linux-x64_bin.tar.gz
rm -rf openjdk-11+28_linux-x64_bin.tar.gz
# 通过 Jenkins 页面提供的命令下载 agent.jar
curl -sO http://192.168.1.125:8080/jnlpJars/agent.jar
# 启动 Java Web 代理
# 注意:jdk11没有配置环境变量,所以写全路径
/data/jenkins-agent/jdk-11/bin/java -jar agent.jar -jnlpUrl http://192.168.1.125:8080/manage/computer/worker2/jenkins-agent.jnlp -secret 2007cfd52553e6927c4a41966bd85ecf3acda559beda2a3d5e4ffd106fe01db1 -workDir "/data/jenkins-agent/"

启动后通过控制台输出的日志可以看到代理已经连接成功了,可以与上面介绍的方式在Jenkins页面中执行「脚本命令行」来验证。

4.3. 将 Java Web 代理安装为系统服务
上一步中,我们通过
java -jar的方式成功启动了agent.jar,但是这种方式在SSH连接断开后,应用也会停止,所以我们还需要将java -jar agent.jar ……安装为系统服务。
这里我准备了一键安装脚本install-jenkins-agent.sh,只需要修改CMD=''为Jenkins页面给出的启动命令后上传到服务器并执行即可
#!/bin/bash
CMD='将启动命令写到这里'
JNLPURL=$(echo $CMD | sed 's/.*jnlpUrl \(.*\)/\1/'| cut -d ' ' -f1 )
WORKDIR=$(echo $CMD | sed 's/.*workDir \(.*\)/\1/'| cut -d ' ' -f1 | sed 's/"//g')
if [[ "$CMD" =~ java && "$CMD" =~ jnlpUrl && "$CMD" =~ secret && "$CMD" =~ workDir ]];then
echo "开始配置jenkins-agent服务"
else
echo "ERROR:请将节点连接jenkins的java启动命令填入脚本CMD=''的引号中"
exit 1
fi
mkdir -p $WORKDIR
wget ${JNLPURL%%manage*}jnlpJars/agent.jar -P ${WORKDIR}
chmod 755 ${WORKDIR}/agent.jar
cat>/usr/lib/systemd/system/jenkins-agent.service<<EOF
[Unit]
Description=The Jenkins Agent Server
[Service]
User=root
ExecStart=/usr/local/bin/jenkins-agent start
ExecReload=/usr/local/bin/jenkins-agent restart
ExecStop=/usr/local/bin/jenkins-agent stop
Restart=always
[Install]
WantedBy=multi-user.target
EOF
cat>/usr/local/bin/jenkins-agent<<EOF
#!/bin/bash
start()
{
${CMD/agent.jar/$WORKDIR/agent.jar}
}
case "\$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "usage: \$0 start|stop|restart"
exit 0;
esac
exit
EOF
chmod 755 /usr/local/bin/jenkins-agent
systemctl daemon-reload
systemctl start jenkins-agent
systemctl enable jenkins-agent
result=$(systemctl is-active jenkins-agent)
if [[ $result == 'active' ]];then
echo "success"
else
nohup ${CMD/agent.jar/$WORKDIR/agent.jar} > /dev/null 2>&1 &
fi
查看jenkins-agent系统服务状态并查看日志
# 查看服务状态
systemctl status jenkins-agent
# 查看服务日志
journalctl -u jenkins-agent -f

这样则完成了通过Java Web代理方式的从节点安装。
流水线任务测试
既然
jenkins主节点和两个从节点都已安装完成,那么我们就来创建个流水线任务运行试试吧~
Jenkins页面选择「新建任务」,填写「任务名称」,并选择类型为「流水线」

简单写个流水线脚本,大概含义为:分别在worker1、worker2节点上通过docker启动maven:3-alpine、node:alpine容器,并执行mvn -v、node -v。
将流水线代码配置好后点击保存

流水线代码如下:
pipeline {
agent none
stages {
stage('Worker1-Maven') {
agent {
docker { label 'worker1' image 'maven:3-alpine' }
}
steps {
sh "mvn -v"
}
}
stage('Worker2-Node') {
agent {
docker { label 'worker2' image 'node:alpine' }
}
steps {
sh "node -v"
}
}
}
}
点击「立即构建」启动任务,并查看任务日志


通过日志可以看到按照流水线定义在对应的机器上启动容器并执行命令


总结
今天为搭建介绍了如何搭建Jenkins主节点以及分别通过SSH方式与Java Web 代理方式搭建从节点,并编写流水线(Jenkins Pipeline)脚本部署测试。
后续会将Jenkins多节点、Pipeline脚本的一些使用心得分享给大家,喜欢本文的话请帮忙转发或点击“在看”。您的举手之劳是对我莫大的鼓励。谢谢!