Jenkins——安装与使用

目录

本文笔记参考自尚硅谷视频【尚硅谷】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 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 包(上述日志有提示)

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)再次构建,即可收到具体的邮箱通知:

相关推荐
柯儿的天空2 小时前
【OpenClaw 全面解析:从零到精通】第 018 篇:OpenClaw 多智能体协作系统——多 Agent 路由、任务委托与负载均衡
运维·人工智能·aigc·负载均衡·ai编程·ai写作·agi
last demo2 小时前
docker容器日志
运维·docker·容器
行者..................2 小时前
第1课:搭建 Linux 驱动与 Qt 开发基础环境
linux·运维·qt·mpsoc
草莓熊Lotso3 小时前
Linux IPC 进阶:System V 消息队列与信号量(含内核管理深度解析)
linux·运维·服务器·数据库·c++·人工智能·mysql
s1kSec4 小时前
天翼云openclaw钉钉配置解决,解决404、401报错
运维·服务器
以太浮标10 小时前
华为eNSP模拟器综合实验之- ACL控制列表核心命令全解析及场景应用
运维·网络·网络协议·华为·信息与通信
巨斧空间掌门10 小时前
JDK17 下载 windows Linux
linux·运维·服务器
小挪号底迪滴10 小时前
Docker容器化实战:从“在我机器上能跑“到环境一致性
运维·docker·容器
江畔何人初11 小时前
kube-apiserver、kube-proxy、Calico 关系
运维·服务器·网络·云原生·kubernetes