在工作中经常会使用到Jenkins,能持续集成,持续部署,可以说非常丝滑。 一直想搭建一套CI/DI,方便自己研究学习时,不用再花费太多的时间在部署上,能快速的部署到虚拟机或者上云。作者之前根据网上很多教程学习搭建,期间碰倒很多问题,特地整理文档并记录部署时出现的问题,用以做记录和学习。
一、前言(重要)
写在前面:目前很多旧的安装教程使用的Jenkins站点镜像都无法使用了,作者踩了不少雷,总结一些坑点
1.确保你要安装的Jenkins版本对应的镜像仓库有对应的版本的插件列表文件(否则自动安装插件会有问题)
2.如果采用手动上传插件方式,先确认好是否兼容当前安装版本的Jenkins(避免插件不兼容)
例如: 作者在选择jenkins版本是2.496,需要先查看镜像仓库是不是有对应版本的元数据文件update-center.json
,可根据下文中提供的镜像仓库地址自行选择对应版本。
- "元数据文件"下载插件时需要配置站点镜像用到
update-center.json
是 Jenkins官方提供的插件中心元数据文件,包含了所有可用插件的信息(版本、依赖关系、下载地址等)。Jenkins会定期从该文件获取插件列表。
二、环境选择
1.Linux版本: CentOS Linux release 7.6.1810 (Core)
2.Jenkins版本: Jenkins 2.496
3.JDK版本: OpenJDK 17
4.镜像仓库安装包地址: 阿里云镜像Jenkins仓库
5.update-center.json
插件元数据文件地址: Jenkins插件列表地址
三、Jenkins安装
1.war包下载
两种下载方式,一种是官网下载,一种是阿里云下载
(1)官网下载地址: Jenkins官网
(2)阿里镜像仓库下载: 阿里云镜像仓库
作者是在阿里仓库下载的2.496版本,可自行选择下载方式和版本
2.上传到服务器
将jenkins.war
上传到服务器上
3.启动war包
1.新建一个jenkins-ctrl.sh
,这里需要替换一下实际安装的JDK17的目录即可。
作者构建的项目用的是JDK8,而这个版本的Jenkins是需要JDK17的,这里会产生影响,所以准备了一个脚本使用JDK17单独启动Jenkins。
jenkins-ctrl.sh
脚本
#!/bin/bash
# 使用 nohup 实现进程挂起,并记录日志
JAVA_BIN="/usr/lib/jvm/java-17-openjdk/bin/java"
JENKINS_WAR="jenkins.war"
LOG_FILE="jenkins.log"
PORT="8081"
case "$1" in
start)
nohup ${JAVA_BIN} -jar ${JENKINS_WAR} --httpPort=${PORT} > ${LOG_FILE} 2>&1 &
echo "Jenkins started. PID: $! Log: $(pwd)/${LOG_FILE}"
;;
stop)
PID=$(pgrep -f "java.*jenkins.war.*${PORT}")
if [ -n "${PID}" ]; then
kill ${PID}
echo "Jenkins stopped (PID: ${PID})"
else
echo "Jenkins is not running"
fi
;;
status)
PID=$(pgrep -f "java.*jenkins.war.*${PORT}")
if [ -n "${PID}" ]; then
echo "Jenkins is running (PID: ${PID})"
else
echo "Jenkins is not running"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
;;
esac
按以下命令创建一个sh脚本,并执行sh脚本
#1.列出所有已安装JDK,找到JDK17路径
sudo update-alternatives --list
#2.将.sh脚本放在war同级目录下,记得修改正确的JDK17路径
此处略
# 3.赋予执行权限
chmod +x start_jenkins.sh
# 4.Jenkins的操作命令如下,这里只需要执行"启动服务"即可
# 启动服务
./jenkins-ctrl.sh start
# 查看状态(可跳过)
./jenkins-ctrl.sh status
# 停止服务(可跳过)
./jenkins-ctrl.sh stop
# 5.检查JENKINS使用的JDK版本(可跳过,需要时可查看)
ps aux | grep jenkins.war | grep java
# 6.检查当前系统使用的JDK版本(可跳过,需要时可查看)
sudo update-alternatives --config java
# 7.查看输出的日志
more jenkins.log #历史日志
tail -100f jenkins.log #实时查看日志
如果需要检查系统JDK版本,效果如图
2.打印的日志,需要关注打印的密码
4.登录Jenkins管理页面并配置
1.这里因为我是在虚拟机上,就不用放通端口,并且防火墙已关闭。如果是在云服务器上需要放通端口后,才能访问到管理页面
2.选择“选择插件来安装”
,默认是从国外的镜像下载插件,会比较慢,
3.随即点击“无”
,点击“安装”
4.创建一个管理员账号(此处略过),随后一直默认“下一步”
即可
四、插件安装
作者第一次图方便一键推荐安装,下载的插件都出现大量的依赖问题,查阅大量博主的教程,却发现各位博主教程很少出现插件依赖问题,作者也是一直觉得是运气问题。
回归正题,我们进入开始配置插件
1.进入插件管理页面
Manage Jenkins---->Plugins
2.配置新的镜像地址
,这里注意选择的版本是否对应,这里输入镜像地址:
https://mirrors.jenkins.io/updates/dynamic-2.496/update-center.json
3.重启Jenkins
地址栏输入IP:端口/restart,点击页面"Yes"
即可重启Jenkins
4.查看插件
再次进入插件配置页,点击Available plugins
,可以查看到插件,说明配置成功
5.下载插件
插件 | 作用 | 备注 |
---|---|---|
* Gitee |
码云插件 | 使用码云做代码仓库时选择 |
GitLab Plugin | GitLab插件 | 使用GitLab做代码仓库时选择 |
* publish over ssh |
使用ssh协议发送文件插件 | 一般采用ssh协议发送协议 |
1.以安装publish over ssh
为例。首先搜索 publish over ssh
,点击Install
2.耐心等待安装,安装完成后再勾选“Restart”
,重启一下Jenkins
3.再次登录Jenkins,能在Installed plugins
搜索到,说明安装成功。
五、Jenkins配置
作者目的只需要Jenkins打Jar包,PUSH后远程服务器运行Jar包即可
主要步骤如下
1.配置Gitee,拉取代码,Maven构建Jar包
2.配置SSH,用于推送到Jar包到远程服务器目录
3.执行构建脚本,运行Jar包
1.配置Gitee插件
1.1 获取私人令牌
登录gitee生产私人令牌
1.2.配置Gitee插件
1.2.1进入Manage Jenkins—>System配置---->Git配置
1.2.2点击Add
添加私人令牌
1.2.3 点击"测试链接",显示"成功"表示配置成功,点击最下方Sava
保存配置即可。
2.部署Maven插件
2.1.上传maven压缩包并解压
这里自行上传并解压到目录
2.2.配置环境变量
1.执行以下命令添加环境变量
1.添加环境变量
vim ~/.bash_profile
2.配置环境变量
例如:
# 用户环境变量
export MAVEN_HOME=/usr/maven/apache-maven-3.8.5 # 先定义 MAVEN_HOME
# 更新 PATH(将 $MAVEN_HOME/bin 添加到最后)
PATH=$PATH:$HOME/bin:$MAVEN_HOME/bin
3.使环境变量生效
source ~/.bash_profile
2.3.验证maven
echo $MAVEN_HOME # 应输出 /usr/maven/apache-maven-3.8.5
echo $PATH # 应包含 ...:/usr/maven/apache-maven-3.8.5/bin
mvn -v # 验证mvn命令,应显示Maven版本信息
至此Maven安装,配置完成。
2.4 配置Jenkins的maven
进入Manage Jenkins—>Tools—>Maven Configuration
3.配置JDK
3.1上传OpenJDK(此处略过)
3.2Jenkins配置JDK
进入Manage Jenkins—>Tools—>JDK installations
配置路径
4.构建一个测试项目
1.创建一个ITEM后,进入Configure—>General
配置Source Code Management
,先添加一个凭证,后配置仓库地址
2.添加一个Credentials
ps: 如果令牌不存在,就重新添加并选择,如果还不行就直接选择添加gitee的账号密码并选择。作者这里就是选择不到,只能添加一个账号,密码的凭证
3.添加MAVEN构建命令
4.构建一下
点击Build Now
,构建后可点击Builds列表查看构建情况
点击Console output
实时查看构建日志
补充遇到的问题
问题1: JDK使用的是17,出现构建失败的情况,
- 这里上文补充了怎么使用不同JDK启动Jenkins和构建maven
问题2: 镜像下载后,依然出现类找不到的情况
- 作者检查了maven中的setting配置,发现上传的maven仓库的地址使用的是Windows的配置,切换Linux中的目录即可
问题3: 镜像下载慢,这里建议使用国内的镜像(可能会有人忽略此处的配置导致下载慢)
- 同理也是调整maven的setting配置远程仓库地址
至此,Jenkins能构建Maven项目并成功打包,接下来配置需要将Jar文件推送的远端服务器。可以看看打包后的情况,如图
5.配置SSH
5.1 首先配置个全局的SSH
进入点击Manage Jenkins—>选择System配置
,滑到最底部,找到SSH Servers
配置项 | 释义 |
---|---|
NAME | 定义一个容易区分的别名 |
HostName | 配置远程服务的IP |
Username | SSH登录的用户名 |
Remote Directory | 远程服务的目录 |
如图需要勾选“Use password authentication, or use a different key”
选项后输入密码,点击Test Configuration
,显示"Success",则配置成功,最后点击“Save”
保存配置
Use password authentication, or use a different key:三种验证方式 • Passphrase / Password:如果配置了密钥或密钥的路径,则这是与加密密钥一起使用的密码。
如果没有配置密钥,那么这将是用于密码认证的密码。
• Path to key:在Jenkins主机上的位置,使用私有SSH密钥。
该路径可以是密钥的绝对路径,也可以是相对于JENKINS_HOME目录的绝对路径。
•Key:将私钥粘贴到此框中。关键应该包括页眉和页脚线(----)以及之间的所有内容。
特别注意:这里的Remote Directory中的配置,当前配置的全局的远端文件的父路径路径。后续对单个ITEM做配置时,实际上做为父路径,例如ITEM中的SSH配置的Remote Directory为second_project,那么实际put的全路径为"父路径+second_project"
5.2.配置ITEM的SSH
1. 选择Triggers---->Build Steps---->Add build step
后,选择"Send files or execute commands over SSH"
2. 根据需要,配置Source files
等配置后,点击Save
即可,可参照作者的配置。
3. 字段含义
名称 | 作用 | 示例 |
---|---|---|
Source files(源文件) | 需要传输的文件或目录路径(相对于 Jenkins 工作区) | 后端: target/.jar:传输工作区 target 目录下的所有 JAR 文件。 前端: dist/**/:传输 dist 目录及其子目录下的所有内容 |
Remove prefix(移除前缀) | 从源文件路径中移除指定的前缀,避免在远程服务器上创建不必要的目录。 | 如果源文件是 target/app.jar,且 Remove prefix 设为 target/,则远程路径会直接传输 app.jar,而不是创建 target 目录。 |
Remote directory(远程目录) | 文件传输到远程服务器的目标目录(相对于 SSH 插件全局配置中设置的 Remote Directory) | 如果全局配置的远程目录是 /opt/jenkins,此处设为 deploy,则文件会传输到 /opt/jenkins/deploy。 |
Exec command(执行命令) | 文件传输完成后,在远程服务器上执行的命令。 | 例如执行java -jar xxx.jar命令 |
详情可查阅地址Jenkins官方Publish+Over使用教程
5. 示例
这里只需要将jar包上传到远程的服务器,并准备了一个shell脚本,并执行shell脚本即可
#!/bin/bash
# 配置变量
port=8082
JAR_PATH="/home/java/pro/second_project/xxx.jar" #这里调整为自己的jar包
LOG_FILE="/home/java/pro/second_project/output.log"
# 函数:检查命令是否存在
check_command() {
if ! command -v "$1" &> /dev/null; then
echo "错误: 未安装 $1"
exit 1
fi
}
# 检查依赖命令
check_command lsof
check_command java
# 查找并杀死旧进程
echo "正在查找端口 $port 的进程..."
pid=$(lsof -t -i :$port -s TCP:LISTEN)
if [ -n "$pid" ]; then
echo "正在终止进程 PID: $pid"
kill -9 "$pid"
# 等待进程退出
while lsof -t -i :$port -s TCP:LISTEN >/dev/null; do
sleep 1
echo "等待进程退出..."
done
fi
# 启动应用
echo "开始启动应用..."
nohup java -jar "$JAR_PATH" --server.port=$port > "$LOG_FILE" 2>&1 &
echo "完成启动应用..."
#添加可执行权限
chmod +x /home/java/pro/start.sh
完整配置情况
特别注意: 以下此项最好开启,方便配置错误,能在控制台打印日志
六、完成部署
1.构建成功效果图
2.构建成功日志
3.运行情况
七、总结
至此,踩了无数坑后,终于搭建完成,可以为自己鼓个掌啦~~~~~~。