Jenkins介绍
Jenkins 是一款开源的持续集成(CI)和持续交付(CD)工具,在软件开发和自动化部署流程中发挥着关键作用。
1.背景和起源
它最初是由 Sun Microsystems 公司的一名工程师开发的 Hudson 项目,后来由于商标问题,这个项目的分支被命名为 Jenkins。随着软件开发流程的不断演变,对于自动化构建、测试和部署的需求日益增长,Jenkins 应运而生并得到了广泛的应用。
2.核心功能
持续集成(CI)
Jenkins 能够自动化软件构建过程。例如,当开发团队成员将代码提交到版本控制系统(如 Git)时,Jenkins 可以自动检测到代码的变更,并触发构建任务。它会按照预先配置的步骤,如编译代码、运行单元测试等。如果构建过程中出现错误,开发人员会立即收到通知,这样可以快速定位和解决问题,确保代码的质量。
假设一个 Java 项目,开发人员每次提交代码后,Jenkins 可以自动从代码仓库拉取最新代码,使用 Maven 或 Gradle 等构建工具进行编译,生成可执行的 JAR 文件。同时运行 JUnit 测试用例来检查代码功能是否正确。
持续交付 / 部署(CD)
除了构建,Jenkins 还支持将软件部署到不同的环境。它可以将经过测试的软件部署到测试服务器、预生产服务器,甚至是生产环境。通过自动化部署流程,减少了人工操作可能带来的错误,提高了部署的速度和可靠性。
比如,对于一个 Web 应用程序,Jenkins 可以将构建好的 WAR 文件自动部署到 Tomcat 服务器上。在部署到生产环境之前,它还可以先部署到一个模拟生产环境的测试环境中进行最后的验证。
插件系统
Jenkins 拥有丰富的插件生态系统。这些插件可以扩展 Jenkins 的功能,以满足不同用户和项目的需求。例如,有用于与各种版本控制系统集成的插件(如 Git、Subversion 等),用于代码质量检查的插件(如 SonarQube),以及用于自动化测试的插件(如 Selenium)等。
如果要对代码进行静态代码分析,就可以安装和配置 SonarQube 插件。这个插件可以在构建过程中对代码进行扫描,检查代码是否符合编码规范、是否存在潜在的安全漏洞等,并生成详细的报告。
3.工作原理
主从架构
Jenkins 可以采用主从架构。主节点负责调度和管理构建任务,从节点则执行实际的构建工作。这种架构在处理大量构建任务或者构建任务比较复杂、资源消耗大的情况下非常有用。例如,一个大型的软件开发项目,可能有多个不同的模块需要构建,主节点可以将这些构建任务分配到多个从节点上同时进行,提高构建效率。
构建触发机制
构建任务可以通过多种方式触发。除了前面提到的代码提交触发外,还可以通过定时触发(例如每天晚上自动构建项目,进行全量测试)、远程触发(通过 API 调用,在其他系统需要的时候触发构建)等方式。
假设一个项目需要每天晚上对当天开发的所有功能进行一次集成测试,就可以在 Jenkins 中设置定时任务,在指定的时间触发构建,运行所有的测试用例。
4.使用场景
软件开发项目
在各种规模的软件开发团队中,Jenkins 可以帮助实现高效的开发流程。无论是小型的创业公司开发移动应用,还是大型企业开发复杂的企业级软件,都可以利用 Jenkins 进行持续集成和交付。
DevOps 实践
它是 DevOps 文化的重要工具。通过自动化软件的构建、测试和部署流程,促进开发团队和运维团队之间的协作,打破传统的开发和运维之间的壁垒。
Jenkins安装和配置
安装:
Jenkins基于java环境开发的,所以需要配置java环境
直接使用wget工具下载jdk的rpm包,然后使用yum命令安装
bash
wget https://download.oracle.com/java/17/archive/jdk-17.0.6_linux-x64_bin.rpm
yum install -y jdk-17.0.6_linux-x64_bin.rpm


使用命令查看当前jdk的版本
bash
java -version

版本如图所示
接下来进行yum仓库配置
bash
使用wget工具下载yum仓库
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
导入密钥
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
接下来安装Jenkins
yum install -y Jenkins



注:导入密钥时可能会出现报错,可能是CA证书版本过低,更新CA证书即可
bash
yum install -y ca-certificates

此时Jenkins安装完成,使用命令启动Jenkins
bash
systemctl start jenkins
查看此时Jenkins的状态

可以看到启动成功。
注:若是启动失败,查看是否是jdk版本过低。
此时关闭防火墙,然后再浏览器输入: 当前服务器ip:8080 即可打开Jenkins
配置:
打开浏览器,首先看到如图所示

根据提示,再服务器上查看密码
bash
cat /var/lib/jenkins/secrets/initialAdminPassword
将查询到的密码输入进去,点击右下角的继续
点击安装推荐的插件即可

然后就会自动进行插件的安装,过程较慢,需要耐心等待

部署完成就是以下的界面

此处全部自定义,完成后点击右下角保存并完成

点击保存并完成

如图所示就是配置完成的界面。
Jenkins远程部署
安装插件:
首先确保Publish Over SSH插件和Git plugin插件存在,可以按照如下操作寻找插件
首先点开Manage Jenkins

找到插件

在此处搜索

安装好插件重启Jenkins服务,再次登录即可
测试连通:
准备另外一台机器用作测试
点击此处的系统

将页面翻到最下方,可以看到如下

此处进行配置

配置成如图所示
名字可以自定义
主机名就是被远程部署的机器
远程目录就是需要部署的目录
点击右下角的测试配置,查看是否可以连通

这里显示成功,代表着可以连通
案例部署:
点击此处的"新建Item"

选择自由项目

在此处选择git,git的内容用作示范
bash
https://gitee.com/g1395310898/jenkins_test

git的分支为master

在构建步骤中选择"通过SSH发送文件或执行命令"

配置如图所示

名字的地方就是测试连通时定义的远程服务器
源文件" **/** "表示全部代码都要进行发送
远程目录表示把代码发送到远程机器的位置
其余设置默认即可
设置完成后即可保存退出
点击" Build Now "对项目进行运行操作

可以看到运行成功

在远程服务器上查看是否部署成功

可以看到部署成功。
Jenkins邮件配置
安装插件:
确保"Email Extension Plugin"插件存在,可以去插件内查看是否已经安装,如下

配置邮箱:
此处使用网易邮箱进行演示,可以自行注册
点开如图所示 POP3/SMTP/IMAP

此处默认关闭,打开服务,获取授权码

获取之后打开Jenkins,找到如下配置

由于此处是网易邮箱,所以设置成如下

用户名填写自己的网易邮箱
密码则是授权码
测试是否可以使用,点击测试


可以看到邮件发送成功
此处用到远程部署的案例,再次对上面的案例进行配置
在构建后操作中添加" 电子邮件通知 "

保存
现在运行案例

这种邮件发送方式只能收到部署失败的邮件,所以将我将git的分支进行了修改,此处发送的邮件就是报错的邮件。
若是想要无论成功还是失败都发送邮件,那么上面安装的插件就起到了作用
现在将配置的邮件通知内容全部删掉
找到" 扩展电子邮件通知 "

进行如下设置

由于最新的Jenkins版本不能在这直接输入用户和密码,所以需要设置凭证
找到凭证

点击system

在此处添加凭证" Add credentials "

对以下内容进行设置

用户名就是邮箱的地址
密码就是邮箱的授权码
触发器进行如下设置

再次对案例进行配置
点击" 可编辑的电子邮件通知 "

一切进行默认配置即可
此时运行案例,在邮箱中查看

可以看到成功的邮件发了过来。
Jenkins管理员密码修改
进入如下目录
bash
cd /var/lib/jenkins/users
可以看到如下

进入第一个目录,这是管理员目录,再其中找到config.xml文件,进入编辑,找到如下

bash
<passwordHash>#jbcrypt:$2a$10$cINXWkeT2FFPlecnk5rsteLonjc44PR7jWdC6oIRsqqBpc/SuDZfq</passwordHash>
找到该行,Jenkins 的密码是使用 Java 加密工具 jBCrypt 生成的,所以可以随便生成一个密码来替换掉之前的密码,例如使用加密后的 123456 来替换,123456 加密后为:
bash
$2a$10$SRqhubr8eaDYxjgTcNjlOeJQJBpIVEYaJmMK2v5dgTqYpD09hMaAi (生成的加密字符串并不是唯一的,但是都可用)
此时就可用123456这个密码登录Jenkins。
也可手动设置其他密码,可自行编辑。
Jenkins部署java服务
下载jdk
远程机器上下载:
由于部署的是java服务,所以需要再远程机器上面安装java环境,使用21版本的jdk
bash
wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
下载之后解压至/usr/local/目录中
bash
tar -zxvf jdk-21_linux-x64_bin.tar.gz -C /usr/local
解压之后配置环境变量
再/etc/profile文件的最后一行添加如下内容
bash
export JAVA_HOME=/usr/local/jdk-21.0.5
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin

使环境变量立刻生效
bash
source /etc/profile
查看jdk版本,看看是否配置完成

在本地服务器上下载jdk
此处也使用21版本
bash
wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
解压
bash
tar -zxvf jdk-21_linux-x64_bin.tar.gz -C /usr/local
此处不需要配置环境变量
进入Jenkins网页,找到工具

配置jdk如下
路径填写解压到的目录

远程机下载tomcat
下载tomcat
bash
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.91/bin/apache-tomcat-9.0.91.tar.gz
解压至/usr/local目录下
bash
tar -zxvf apache-tomcat-9.0.98.tar.gz -C /usr/local
将文件名修改为tomcat
bash
mv apache-tomcat-9.0.98 tomcat
启动tomcat
进入bin目录
bash
cd /usr/local/tomcat/bin
./startup.sh

关闭防火墙打开网页,网页地址为
Ip地址/8080

如图表示安装完成
点击manager webapp,出现如下界面

进入该服务器的如下目录进行修改

在context.xml文件中添加如下内容
bash
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|\d+\.\d+\.\d+\.\d+" />

进入如下目录进行配置

在tomcat-users.xml文件中的最后添加如下内容
bash
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<role rolename="manager-jmx"/>
<role rolename="manager-script"/>
<role rolename="manager-status"/>
<user username="admin" password="123456" roles="admin-gui,manager-gui,manager-jmx, manager-script,manager-status"/>

此时就可以在网页中进行登录,账号是admin,密码是123456
登录之后显示如下

本地服务器在线Maven
下载Maven
bash
Wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.9.8/binaries/apache-maven-3.9.8-bin.tar.gz
解压至/usr/local目录中
bash
tar -zxvf apache-maven-3.9.8-bin.tar.gz -C /usr/local
将文件名修改为maven398
bash
mv apache-maven-3.9.8 maven398

进入Jenkins网页,找到工具,对maven进行配置

此时配置完成。
获取gitee仓库
进入gitee官网注册一个账号,发布一个仓库,在本地服务器中创建一个test目录,将其作为远程仓库

在本地服务器下载zrlog
bash
wget https://codeload.github.com/94fzb/zrlog/zip/master
解压
bash
unzip master
将解压的内容全部移动至test目录中
bash
mv zrlog-master/* test/

将文件内容上传至gitee仓库
bash
git push -u origin master
在gitee上面查看是否上传成功

可以看到上传成功。
部署项目
安装插件:
打开Jenkins,确保Maven Integration(用来创建一个maven的项目)和Deploy to container(用来将war包,发布到远程去)插件存在
不存在则进行安装
创建maven项目:
配置git仓库

使用maven编译源码生成的包,pom.xml文件需要自己仔细寻找
clean install --D maven.test.skip=true 表示在编译之前先清理,跳过测试

邮件插件可自行选择


验证:
运行项目,如下表示运行成功
