本文笔记参考自尚硅谷视频【尚硅谷】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)执行如下解压命令:

tar -xzf jdk-21_linux-x64_bin.tar.gz -C /opt/

(4)配置环境变量:

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
# 保存退出后,执行加载操作
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)执行如下命令进行安装:

tar zxvf apache-maven-3.8.6-bin.tar.gz
mv apache-maven-3.8.6 /usr/local/maven

(3)查看版本号

cd /usr/local/maven/bin/
mvn -v

在这里插入图片描述

(3)更换镜像为阿里云:将 /usr/local/maven/conf/setting.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:

# 安装 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 目录下,并执行如下命令:

# 启动 Jenkins,默认端口号为 8080
java -jar jenkins.war

注意:Jenkins 项目对 Java 8 的支持已于 2022 年 9 月 1 日之后终止,如果是新版本的 jenkins.war,在 JDK8 下启动时会报错

出现如下页面说明启动成功:

在这里插入图片描述

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

cd /root/.jenkins

在这里插入图片描述

3.2.初始化 Jenkins

(1)在浏览器地址栏中输入:

# 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 目录下执行如下语句:
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 IntegrationGitLocalization: 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 包(上述日志有提示)

cd /root/.jenkins/workspace/first/target/

在这里插入图片描述

(2)启动该 jar 包:

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 下)如下:

#!/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 分支,然后再次构建:

@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 分支

@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 表达式:

第一个 * 表示每个小时的第几分钟,取值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)示例如下:

H/5 * * * *  # 不是严格的每5分钟,而是分散在每5分钟左右的某个时间点
0 * * * *    # 严格在每小时整点执行
H * * * *    # 每小时内的某个时间点执行

在这里插入图片描述

(3)优点:

  • 不需要配置代码仓库的Webhook
  • 适合内网环境或无法接收外部请求的场景
  • 可以控制检查频率,避免资源浪费

(4)缺点:

  • 有延迟:不是代码提交后立即构建
  • 资源浪费:即使没有代码变更也会定期检查
  • 增加仓库压力:频繁的轮询会增加代码服务器的负载

5.9.配置邮箱接受构建通知

5.9.1.前置准备

(1)按照功能实现——采用 Hutool 工具发送邮件这篇文章中的第 2 节开通发件邮箱的 SMTP 服务并获取认证密码,例如:

KDWJUWDQBWMOYGDC

(2)安装插件 Email Extension
在这里插入图片描述

5.9.2.邮箱配置

(1)进入系统配置页面

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

(4)配置邮件内容

在这里插入图片描述

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

在这里插入图片描述

(6)配置系统邮箱信息

在这里插入图片描述

(6)发送测试

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐