目录
- 1.概述
- 2.前置准备工作
-
- [2.1.安装 JDK 21+](#2.1.安装 JDK 21+)
- [2.2.安装 GitLab(可选)](#2.2.安装 GitLab(可选))
- [2.3.安装 Maven](#2.3.安装 Maven)
- [2.4.安装 Git](#2.4.安装 Git)
- [3.Jenkins 安装](#3.Jenkins 安装)
-
- [3.1.安装 Jenkins](#3.1.安装 Jenkins)
- [3.2.初始化 Jenkins](#3.2.初始化 Jenkins)
- 3.3.安装推荐插件
- 3.4.创建管理员用户
- [4.Jenkins 配置 Maven + Git 构建 jar 包](#4.Jenkins 配置 Maven + Git 构建 jar 包)
-
- 4.1.安装相关插件
- [4.2.构建 jar 包](#4.2.构建 jar 包)
-
- 4.2.1.新建任务
- [4.2.2.配置 git 仓库信息](#4.2.2.配置 git 仓库信息)
- [4.2.3.配置 Maven 信息](#4.2.3.配置 Maven 信息)
- [4.2.4.构建 jar 包](#4.2.4.构建 jar 包)
- [4.2.5.查看并启动构建完成的 jar 包](#4.2.5.查看并启动构建完成的 jar 包)
- [5.Jenkins 自动化发布](#5.Jenkins 自动化发布)
-
- 5.1.安装相关插件
- [5.2.添加 SSH 服务器配置](#5.2.添加 SSH 服务器配置)
- 5.3.自动化配置
- [5.4.构建 + 自动化发布](#5.4.构建 + 自动化发布)
- 5.5.超时机制
- 5.6.自动化发布前清理
- [5.7.通过 Gitee 的 Webhook 触发 Jenkins 自动构建](#5.7.通过 Gitee 的 Webhook 触发 Jenkins 自动构建)
-
- 5.7.1.安装相关插件
- [5.7.2.配置 Gitee webhook 触发构建](#5.7.2.配置 Gitee webhook 触发构建)
- 5.7.3.内网穿透教程(可选)
- 5.7.4.测试提交代码进行自动构建
- 5.8.其他触发构建方式
-
- 5.8.1.定时构建
- [5.8.2.Poll SCM](#5.8.2.Poll SCM)
- 5.9.配置邮箱接受构建通知
本文笔记参考自尚硅谷视频【尚硅谷】Jenkins教程(从配置到实战),相关资料可在该视频评论区中领取。
1.概述
(1)Jenkins 是一个用 Java 编写的开源自动化服务器,是目前最流行的持续集成和持续交付(CI/CD)工具之一。它可以帮助开发人员自动执行软件开发中的重复性任务,如构建、测试和部署代码。其官方网站如下:https://www.jenkins.io/。
(2)Jenkins 的核心特点:
- 开源免费:拥有庞大的社区支持和丰富的插件生态
- 易于安装和配置:可以通过 Web 界面轻松设置
- 分布式架构:支持主/从节点,可以在多台机器上分配工作负载
- 丰富的插件生态系统:有超过 1000 种插件,可以与几乎所有开发工具集成
- 可扩展性:可以通过 REST API 或命令行接口与其他工具集成
(3)CI/CD 指持续集成/持续交付或持续部署:
- CI(持续集成,Continuous Integration):开发人员频繁地将代码变更合并到主干分支,每次合并后自动运行构建和测试,以尽早发现集成错误。
- CD(持续交付/部署,Continuous Delivery/Deployment):
- 持续交付:确保代码可以随时可靠地发布到生产环境
- 持续部署:自动将通过测试的代码部署到生产环境
(4)Jenkins 是整个 CI/CD 流程的核心调度器和执行引擎

(5)Jenkins 是 CI/CD 理念的具体实现工具之一。如果说 CI/CD 是一种软件工程实践方法,那么 Jenkins 就是实现这种方法的工具。它通过自动化构建、测试和部署流程,帮助团队提高软件交付速度和质量。
2.前置准备工作
2.1.安装 JDK 21+
(1)下载 JDK21 网址:https://www.oracle.com/java/technologies/downloads/#java21

(2)将 jdk-21_linux-x64_bin.tar.gz 上传至 CentOS 的目录 /opt/sofware 下
(3)执行如下解压命令:
powershell
tar -xzf jdk-21_linux-x64_bin.tar.gz -C /opt/
(4)配置环境变量:
powershell
vim /etc/profile
# 在文件的尾部添加:
export JAVA_HOME=/opt/jdk-21.0.10
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
powershell
# 保存退出后,执行加载操作
source /etc/profile
# 校验 JDK 是否安装配置成功
java -version

2.2.安装 GitLab(可选)
在 CentOS 7 中安装 GitLab,这一步可参考视频尚硅谷2024最新Git企业实战教程,全方位学习git与gitlab中的安装教程或者其他网上教程,此处不再赘述。如果不想安装,后续可用 Gitee 或者 GitHub 项目替代。
2.3.安装 Maven
(1)Maven 官方下载网址为 https://maven.apache.org/download.cgi,下载合适的版本(这里用的是 apache-maven-3.8.6-bin.tar.gz)后上传到 CentOS 中的 /opt/software 目录下

(2)执行如下命令进行安装:
powershell
tar zxvf apache-maven-3.8.6-bin.tar.gz
mv apache-maven-3.8.6 /usr/local/maven
(3)查看版本号
powershell
cd /usr/local/maven/bin/
mvn -v

(3)更换镜像为阿里云:将 /usr/local/maven/conf/setting.xml 中的默认镜像替换为如下阿里云镜像:
xml
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>
</mirrors>
2.4.安装 Git
使用如下命令安装 Git:
powershell
# 安装 Git
yum install -y git
# 查看
git

3.Jenkins 安装
3.1.安装 Jenkins
(1)Jenkins 下载官网:https://updates.jenkins.io/download/war/。

(2)将下载得到的 war 包(这里下载的是 2.551 版本)上传至 CentOS 7 中的 /opt/software 目录下,并执行如下命令:
powershell
# 启动 Jenkins,默认端口号为 8080
java -jar jenkins.war
注意:Jenkins 项目对 Java 8 的支持已于 2022 年 9 月 1 日之后终止,如果是新版本的 jenkins.war,在 JDK8 下启动时会报错
出现如下页面说明启动成功:

在 /root/.jenkins 目录下可以看到启动 Jenkins 后生成的文件
powershell
cd /root/.jenkins

3.2.初始化 Jenkins
(1)在浏览器地址栏中输入:
powershell
# IP 根据实际情况而定,端口号默认为 8080
192.168.101.65:8080

(2)根据提示输入密码(上面安装完成图中的 4b89b88ed1b54cb78eb358a61d0bab8c):

3.3.安装推荐插件
(1)随后选择安装插件(安装推荐的插件或者选择插件来安装):

(2)如果安装插件失败,可以尝试以下解决方法:
- 更换镜像源,在浏览器中输入地址
http://192.168.101.65:8080/manage/pluginManager/advanced,更换 Update Site 为https://mirrors.huaweicloud.com/jenkins/updates/update-center.json或者其他镜像源

- 在
/{用户名}/.jenkins/plugins/updates目录下执行如下语句:
powershell
sed -i 's#https://updates.jenkins.io/download#https://mirrors.huaweicloud.com/jenkins#g' default.json
sed -i 's#http://www.google.com#https://www.baidu.com#g' default.json
- 直接从网上下载对应版本的插件包,复制到目录
/{用户名}/.jenkins/plugins/目录下
3.4.创建管理员用户


4.Jenkins 配置 Maven + Git 构建 jar 包
4.1.安装相关插件
在页面 http://192.168.101.65:8080/manage/pluginManager/available 搜索插件 Maven Integration 、Git、Localization: Chinese 进行安装后并重启



4.2.构建 jar 包
4.2.1.新建任务


4.2.2.配置 git 仓库信息
(1)如果本地没有安装 GitLab,也可以配置真实的 Gitee 或者 GitHub 项目地址,只不过需要进行认证,下面以 Gitee 举例(需要提前准备项目)

(2)这里输入 Gitee 账号密码进行认证


(3)选择项目 git 地址、认证方式(上述新增的)、代码分支:

4.2.3.配置 Maven 信息
(1)配置 Maven 路径


(2)配置 pom.xml 文件路径

(3)点击保存

4.2.4.构建 jar 包
(1)点击任务右侧的按钮进行构建:

(2)查看控制台日志:



4.2.5.查看并启动构建完成的 jar 包
(1)查看该 jar 包(上述日志有提示)
powershell
cd /root/.jenkins/workspace/first/target/

(2)启动该 jar 包:
powershell
java -jar hotel-demo-0.0.1-SNAPSHOT.jar

(3)测试,在浏览器中输入 192.168.101.65:8999/test-web/hello

5.Jenkins 自动化发布
5.1.安装相关插件
插件 Publish Over SSH 的核心作用是通过 SSH 协议,让 Jenkins 能够与远程服务器进行安全通信,实现自动化地传输文件和执行命令。简单来说,它就像一座桥梁,连接了 Jenkins 和要部署项目的目标服务器,是很多自动化部署场景中的关键一环。

5.2.添加 SSH 服务器配置
(1)进入系统配置页面

(2)新增 SSH 服务器配置

(3)填写相关信息



5.3.自动化配置
(1)进入任务配置页面

(2)配置构建后操作 (Post Steps)


(3)注意:当 Jenkins 通过 SSH 插件远程执行命令时,它启动的是一个非交互式、非登录式 Shell,这种环境可能不会加载完整的用户环境变量配置文件(如 ~/.bash_profile),因此 $PATH 中可能没有包含 JDK 的安装路径,所以启动命令中的使用的是 JDK 完整的安装路径。
5.4.构建 + 自动化发布
(1)再次启动任务并查看控制台日志:

(2)查看 jar 包是否发送至 /opt/jar 目录下并自动启动成功:


5.5.超时机制
执行命令时一定要注意不要让窗口卡住,不然 Jenkins 会认为一直没完成,当执行时间超过设置的 Exec timeout,Jenkins 会提示超时报错。

5.6.自动化发布前清理
(1)如果按照上述配置,多次构建时由于之前的 jar 包还在运行,因此会出现由于端口号冲突而发布失败的问题。因此在自动化发布前需要杀死之前运行的进程,即进行配置构建前操作 (Pre Steps):


需要执行的脚本 preSteps.sh (在目录 /opt/jar 下)如下:
powershell
#!/bin/bash
appname=$1
#获取传入的参数
echo "arg:$1"
#获取正在运行的jar包pid
pid=`ps -ef | grep $1 | grep 'java -jar' | awk '{printf $2}'`
#如果 pid 为空,提示一下,否则,执行 kill 命令
if [ -z $pid ];
#使用 -z 进行空值判断
then
echo "$appname not started"
else
echo "killed pid:$pid"
kill -15 $pid
echo "$appname stopping...."
fi
(2)这样一来,当多次构建时,不用手动 kill 之前启动的项目。当然如果要是这个过程更加严谨,可以等 jar 包发送成功之后,再执行停止旧进程、启动新应用的命令。这样可以防止先停止旧进程之后,jar 包但发送失败的情况。
(3)为了验证上述流程,这里在代码中将原本返回的 "hello" 改为 "hello world",并提交代码至 master 分支,然后再次构建:
java
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping()
public String hello() {
return "hello world!";
}
}


5.7.通过 Gitee 的 Webhook 触发 Jenkins 自动构建
5.7.1.安装相关插件
安装插件 Gitee:

5.7.2.配置 Gitee webhook 触发构建
(1)在任务中进行如下配置:


(2)在 Gitee 添加 Webhook:

(3)注意:由于 Gitee 中的项目在公网中,而 Jenkins 服务处于本地的局域网中,因此上述推荐的地址 http://192.168.101.65:8080/gitee-project/first 并不能生效,如果想要测试,这里有两种方案:
- 通过内网穿透来进行映射(示例教程如 5.7.3 所示)
- 本地搭建 GitLab 进行测试
5.7.3.内网穿透教程(可选)
(1)下载内网穿透工具花生壳,下载官网地址为:https://hsk.oray.com/

(2)配置映射


(3)本地测试,在浏览器中输入上述公网地址:

5.7.4.测试提交代码进行自动构建
(1)为了验证上述流程,这里在代码中将原本返回的 "hello world" 改为 "hello world auto!",并提交代码至 master 分支
java
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping()
public String hello() {
return "hello world auto!";
}
}
(2)此时 Gitee 发现代码有变动时 ------> 触发 Webhook------> 通知 Jenkins ------> Jenkins 接收到消息 ------> 触发相应 Job ------> Jenkins 将结果返回给 Gitee ------> Giteeb 接收到 Jenkins 返回的消息



(3)注意:如果按照上述配置,一有代码提交就会自动构建,这种情况在实际中也比较少见,因此可以通过选择其他 Webhook 触发事件来进行自动构建,或者直接使用手动构建。
如果项目是在 GitLab 上,则配置教程可参考视频中的来进行。
5.8.其他触发构建方式
5.8.1.定时构建
(1)Cron 工具网站:https://crontab.guru
(2)Jenkins Cron 不是标准的 cron 表达式:
powershell
第一个 * 表示每个小时的第几分钟,取值0~59
H * * * *
H:每小时执行一次
第二颗 * 表示小时,取值 0~23
* 15 * * * 表示每天下午 3 点
* 1 * * * 表示每天凌晨 1 点
第三颗 * 表示一个月的第几天,取值 1~31
* 1 5 * * 表示每月 5 日凌晨 1 点
第四颗 * 表示第几月,取值 1~12
* 15 5 1 * 表示每年几月执行
第五颗 * 表示一周中的第几天,取值 0~7,其中 0 和 7 代表的都是周日
(3)"/":表示每隔多长时间,比如 */10 * * * * 表示 每隔10分钟
(4)"H" :hash 散列值,以任务名称取值,获取到以任务名称为入参的唯一值,相同名称值也相同,这个偏移量会和实际时间相加,获得一个真实的运行时间。这样做的意义在于不同的项目在不同的时间运行,即使配置的值是一样的,比如都是 15 * * * * ,表示每个小时的第 15 分钟开始执行任务,那么会造成同一时间内在 Jenkins 中启动很多任务,换成 H/15 * * * *,那么在首次启动任务时,会有随机值参与进来,有的会在 17 分钟启动 有的会在 19 分钟启动,随后的启动时间也是这个值。这样就能错开相同 cron 值的任务执行了。
(5)H 的值也可以设置范围:
H * * * *:表示一小时内的任意时间*/10 * * * *:每 10 分钟H/10 * * * *:每 10 分钟,可能是7、17、27,起始时间 hash,步长不变45 3 * * 1-6:每个周一至周六,凌晨 3 点 45 执行 1 次45 3-5 * * 1-6:每个周一至周六,凌晨 3 点 45,凌晨 4 点 45,凌晨 5 点 45 各执行 1 次H(40-48) 3-5 * * 1-6:在 40~48 之间取值,其他同上45 3-5/2 * * 1-6:每个周一至周六,凌晨 3 点 45 ,凌晨 5 点 45 各执行 1 次45 0-6/2 * * 1-6 * * 1-6:0 点开始,每间隔 2 小时执行一次,0:45、2:45、4:45

5.8.2.Poll SCM
(1)Poll SCM(Source Code Management):定时检查源代码仓库是否有更新,如果发现有更新则自动触发构建:

(2)示例如下:
powershell
H/5 * * * * # 不是严格的每5分钟,而是分散在每5分钟左右的某个时间点
0 * * * * # 严格在每小时整点执行
H * * * * # 每小时内的某个时间点执行

(3)优点:
- 不需要配置代码仓库的Webhook
- 适合内网环境或无法接收外部请求的场景
- 可以控制检查频率,避免资源浪费
(4)缺点:
- 有延迟:不是代码提交后立即构建
- 资源浪费:即使没有代码变更也会定期检查
- 增加仓库压力:频繁的轮询会增加代码服务器的负载
5.9.配置邮箱接受构建通知
5.9.1.前置准备
(1)按照功能实现------采用 Hutool 工具发送邮件这篇文章中的第 2 节开通发件邮箱的 SMTP 服务并获取认证密码,例如:
powershell
KDWJUWDQBWMOYGDC
(2)安装插件 Email Extension:

5.9.2.邮箱配置
(1)进入系统配置页面

(2)配置系统管理员(即发送人)邮箱地址

(3)配置扩展邮箱认证信息


(4)配置邮件内容

(5)配置邮件发送触发器

(6)配置系统邮箱信息

(6)发送测试


(7)在任务中开启邮箱通知,并配置具体收件人邮箱

(8)再次构建,即可收到具体的邮箱通知:

