Jenkins自动化部署是现代软件开发中不可或缺的一部分,它不仅简化了代码的发布过程,还为整个团队带来了无与伦比的效率和协作力。想象一下,开发者们可以专注于编写高质量的代码,而不是为繁琐的手动部署所烦恼;测试人员能在每次提交代码后立即看到测试结果,确保软件质量;运营团队不再需要熬夜加班来手动发布新版本,而是可以安心地看到系统自动完成一切。
Jenkins自动化部署的意义在于它赋予了开发团队一种近乎魔法般的力量,将复杂、易出错的手动操作变为简单、高效的流水线流程。通过CI/CD(持续集成/持续部署),每一次代码的提交都能触发自动化的构建、测试和部署,确保每一个版本的上线都是经过严格测试和验证的。这种无缝的工作流不仅提高了开发速度,还显著降低了风险,让软件的发布更为可靠。
可以说,Jenkins自动化部署不仅是技术上的进步,更是一种开发理念的革新。它让软件开发变得更高效、更可靠、更具创新力。只要你体验过Jenkins带来的便利,你就再也不会回到手动部署的时代,因为那种“代码一提交,系统自己搞定”的感觉,实在是太让人欲罢不能了!
这就是Jenkins的力量,它不仅改变了开发的方式,也改变了我们对软件开发的认知。如果你还没尝试过Jenkins,现在就是最好的时机,去体验一下现代开发的魅力吧!
1.Jenkins工作流程
当你提交代码后,Jenkins能够自动触发部署的背后,是一整套自动化构建和交付的流水线(Pipeline)在起作用。这里我将详细介绍Jenkins的工作流程和内部原理,包括它如何监控代码库的变化、触发构建、执行测试、打包以及最终部署到服务器的过程。
1. 源代码管理(SCM)轮询或Webhooks触发
- SCM轮询:Jenkins会定期检查(轮询)配置的源代码管理系统(如Git、SVN等)的仓库,看是否有新的提交或代码更改。如果检测到变化,就会触发构建任务。这种方法需要Jenkins定时访问代码库,可能会有一定的延迟。
- Webhooks:相比之下,Webhooks是一种更为实时的触发方式。开发者提交代码后,源代码管理系统会立即向Jenkins发送一个HTTP请求(Webhook),通知Jenkins有新提交。这使得Jenkins能够更快响应代码变化,立即启动构建过程。
2. 触发构建任务
一旦Jenkins接收到代码变更的通知,它会根据配置的Pipeline或Job来决定如何处理这次构建。Jenkins中的Pipeline是基于Groovy脚本的,它定义了从代码提交到最终部署的整个流程。
3. 流水线(Pipeline)阶段
Pipeline分为多个阶段,每个阶段都可以独立执行一组任务。这些阶段通常包括:
-
Checkout代码:Jenkins从源代码管理系统中将最新的代码拉取到构建节点上。这一步通常使用插件(如Git插件)来与代码库交互。
-
构建(Build):Jenkins根据配置的构建工具(如Maven、Gradle)对代码进行编译、打包。在这一步,代码会被转化为可执行的应用程序包(如JAR、WAR文件)或Docker镜像。
-
测试(Test):Jenkins会运行自动化测试脚本,包括单元测试、集成测试、功能测试等。这一步至关重要,因为它确保代码在引入新变更后仍然是稳定和可靠的。
-
代码质量分析(Optional):Jenkins可以执行代码质量检查,使用工具如SonarQube来分析代码的复杂度、安全性和可维护性,并生成报告。
-
部署(Deploy):当所有前面的步骤都成功完成后,Jenkins会执行部署阶段。根据配置,它可以将构建产物部署到不同的环境,如开发环境、测试环境或生产环境。这一步可以通过SSH、FTP、容器化部署(Docker、Kubernetes)或云服务API来实现。
4. 工作节点(Agent)与主节点(Master)协作
Jenkins采用主从架构,其中主节点(Master) 负责调度任务、管理工作队列、监控节点状态等。工作节点(Agent) 实际执行构建任务,如代码编译、测试和部署等。
当Pipeline被触发时,Jenkins主节点会分配一个或多个工作节点来执行具体任务。工作节点从主节点获取任务后,开始执行相应的步骤,完成后将结果返回给主节点。
5. Jenkinsfile(流水线脚本)
Jenkinsfile是定义Pipeline的脚本文件,通常存储在代码库中。这使得整个构建、测试和部署的流程代码化,并与项目代码一起版本控制。在Jenkinsfile中,你可以定义Pipeline的各个阶段、条件逻辑、并行任务等。
6. 通知与反馈
Jenkins在构建和部署过程中会生成实时的日志,并在任务完成后发送通知(如通过电子邮件、Slack)。如果构建失败,Jenkins会立即通知相关人员,以便他们能够快速响应和修复问题。
7. 持续集成与持续交付/部署(CI/CD)
整个流程的核心思想是CI/CD,通过持续集成和交付,让开发团队能够频繁地提交代码,并自动化测试、构建和部署,减少人为错误,提升软件发布的效率和质量。
可以通过一张图来直观展示Jenkins在整个流程中扮演的角色,具体如下所示:该图主要对比了人工部署与Jenkins自动化部署的过程。
Jenkins的工作流程是通过SCM轮询或Webhooks来实时监控代码变化,使用Pipeline将构建、测试、打包、部署等步骤串联起来,自动化地将应用程序从开发环境推送到生产环境。其主从架构、可配置的Pipeline、广泛的插件支持,使得Jenkins成为了自动化部署的强大工具,让整个软件开发生命周期变得更加高效和可靠。
下面,让我们一起踏入使用Jenkins自动部署Spring Boot项目的奇妙之旅!
2.搭建Jenkins
1.创建一个数据目录
# 创建 jenkins 目录
mkdir /data/jenkins_home/
# 修改目录的所有者,以便于 Jenkins 容器能够操作该目录
chown -R 1000:1000 /data/jenkins_home/
2.拉取jenkins镜像
docker pull jenkins/jenkins:lts
3.启动jenkins容器
为了防止与 Spring Boot 默认使用的 8080 端口发生冲突,我选择将 Jenkins 服务器的访问端口配置为 8088。此外,在确保 Jenkins 可以从外部网络访问的同时,也需要在云服务器的安全组中配置防火墙规则来开放 8088 端口,这样外部客户端才能通过此端口访问到 Jenkins 服务器。
docker run -d --name jenkins -p 8088:8080 -p 50000:50000 -v /data/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
这样的配置不仅能够确保 Jenkins 服务与其他可能运行在同一服务器上的服务(如 Spring Boot 应用)之间不会产生端口冲突,还能通过精细控制防火墙规则来提高系统的安全性。
在云服务器的安全组设置中,你需要添加一条入站规则,允许来自特定 IP 地址或 IP 范围的流量通过 8088 端口进入服务器。这样既能保证 Jenkins 的可用性,也能限制不必要的网络访问,从而提升整体安全性。
4.访问Jenkins
一旦Jenkins容器启动,你可以通过访问http://localhost:8088来访问Jenkins界面。(注意:这里的localhost对应的你的云服务器IP地址!)
首次访问时,系统会要求你输入初始管理员密码。
5.获取管理员密码
可以直接去宿主机的 /data/jenkins_home/secrets/initialAdminPassword 位置查看初始化密码,具体如下所示:(这里的/data/jenkins_home/是前面你自己设置的Jenkins工作目录)。
获取管理员密码之后就可以直接使用admin账户进行登录,登录之后的界面如下所示:
3.安装Maven
在Jenkins自动化部署中,Maven被安装在服务器上是为了执行项目的构建任务,包括代码编译、依赖管理、测试执行和打包操作。通过Maven,Jenkins能够自动化地将源代码转换为可部署的应用程序包(如JAR或WAR文件),确保项目按需构建并满足所有依赖。
-
下载Maven
访问Maven官方下载页面,选择需要的版本,复制下载链接。使用wget
命令下载Maven。例如下载Maven 3.8.8版本:
wget https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
-
解压文件
将下载的文件解压到你想要安装的位置,例如/opt
目录:sudo tar -zxvf apache-maven-3.8.8-bin.tar.gz -C /opt
-
配置环境变量
为了方便使用Maven,需要配置环境变量。编辑/etc/profile
文件:sudo vi /etc/profile
在文件末尾添加以下内容:
export M2_HOME=/opt/apache-maven-3.8.8 export PATH=$M2_HOME/bin:$PATH
-
使环境变量生效
保存文件并退出编辑器,然后使环境变量生效:source /etc/profile
-
验证安装
现在可以通过以下命令验证Maven是否安装成功:mvn -version
如果安装成功,你将看到Maven的版本信息。
4.安装插件
在Jenkins启动成功后,安装以下三个插件能够增强其功能,满足特定的项目需求:
1. Gitee
- 功能:Gitee插件允许Jenkins与Gitee代码仓库集成,支持从Gitee仓库中拉取代码、触发构建任务。这对于使用Gitee进行源代码管理的团队非常有用,能简化CI/CD流程。
- 安装:在“插件管理”界面,搜索“Gitee”插件并安装。安装后,可以在Jenkins的项目配置中添加Gitee仓库的访问信息,配置Webhook以便代码提交时自动触发构建。
2. Maven Integration
- 功能:Maven Integration插件允许Jenkins与Maven无缝集成,使得Jenkins可以直接调用Maven进行项目的构建、测试和打包。这对于Java项目尤其重要,因为Maven能够自动管理项目依赖、编译代码,并生成可部署的包(如JAR、WAR)。
- 安装:在Jenkins管理界面中,导航到“插件管理” -> “可选插件”,搜索“Maven Integration”并点击“安装”。
3. Publish Over SSH
- 功能:Publish Over SSH插件允许Jenkins通过SSH将构建生成的文件(如JAR、WAR包)安全地传输到远程服务器上。这对于部署过程至关重要,尤其是当需要将构建产物自动部署到生产或测试服务器时。
- 安装:同样在“插件管理”界面,搜索“Publish Over SSH”并安装。安装后,你可以在“系统管理”中配置SSH服务器的连接信息。
通过安装这些插件,Jenkins能够更好地支持项目构建、打包、部署和代码管理,大大提高自动化部署的效率和灵活性。
具体的安装步骤如下所示:点击左边的系统管理,然后选择右边的插件管理,进行配置。
之后在可选插件中,搜索 Maven Integration 和 Publish Over SSH 以及 Gitee 三个插件安装即可:
全部插件安装完成之后,最好登录服务器,重启Jenkins容器以更新插件!具体命令如下:
docker restart jenkins
5.全局工具配置
在使用Jenkins进行自动化部署之前,进行一些全局工具的配置是必要的,这样可以确保Jenkins能够正确调用这些工具来完成构建、测试和部署任务。
以下是Jenkins通常需要配置的全局工具:
1. JDK(Java Development Kit)
- 为什么需要:Jenkins本身是基于Java的应用,并且许多构建工具(如Maven、Gradle)也依赖JDK。因此,配置JDK是必不可少的。
- 配置方法:在Jenkins的“系统管理” -> “全局工具配置”中,找到JDK配置部分,点击“添加JDK”,指定JDK的安装路径,或者选择自动安装。
2. Maven
- 为什么需要:Maven是Java项目构建的标准工具,用于依赖管理、代码编译、测试和打包。通过配置Maven,Jenkins可以调用Maven进行项目构建。
- 配置方法:在“全局工具配置”中找到Maven配置部分,点击“添加Maven”,指定Maven的安装路径,或者选择自动安装。
3. Git
- 为什么需要:大多数项目都使用Git进行源代码管理。通过配置Git,Jenkins可以从Git仓库中拉取代码并进行构建。
- 配置方法:在“全局工具配置”中找到Git配置部分,添加Git安装路径,或者选择自动安装。确保Jenkins可以访问正确版本的Git(由于 Jenkins 容器中已经存在 git 了,所以这里不需要额外安装 git,默认即可)。
4. Gradle(可选)
- 为什么需要:对于使用Gradle构建的项目,配置Gradle工具是必要的。Gradle是另一个流行的构建工具,尤其在Android开发中被广泛使用。
- 配置方法:在“全局工具配置”中,找到Gradle配置部分,点击“添加Gradle”,指定Gradle的安装路径或选择自动安装。
全局工具配置是确保Jenkins能够顺利执行构建、测试和部署任务的基础。通过配置JDK、Maven、Git等工具,Jenkins可以与这些构建工具无缝集成,自动化地完成从代码拉取到部署的整个流程。这些配置不仅提高了Jenkins的灵活性和适用性,还简化了每个项目的具体配置工作。
6.系统配置
在Jenkins中进行系统配置时,Publish Over SSH
和 Gitee
的配置是实现代码部署和与代码仓库集成的关键步骤。以下是详细的配置步骤介绍:
1. Publish Over SSH 配置
Publish Over SSH
插件允许Jenkins通过SSH将构建生成的文件(如JAR、WAR包)安全地传输到远程服务器上。以下是配置步骤:
步骤 1: 安装 Publish Over SSH 插件
- 如果前面已经安装请忽略步骤1
- 登录Jenkins的管理界面。
- 在Jenkins首页,点击左侧菜单中的“系统管理”或“Manage Jenkins”。
- 在管理页面中,选择“插件管理”或“Manage Plugins”。
- 在“可选插件”或“Available Plugins”选项卡中,搜索
Publish Over SSH
。 - 勾选插件并点击“安装”,等待插件安装完成。
步骤 2: 配置 SSH 服务器
-
插件安装完成后,返回“系统管理”页面,选择“系统配置”或“Configure System”。
-
向下滚动页面,找到
Publish Over SSH
部分。 -
点击“添加”按钮,配置一个新的SSH服务器:
- Name: 为服务器配置一个易记的名称。
- Hostname: 输入目标服务器的IP地址或主机名。
- Username: 输入用于登录到目标服务器的用户名。
- Remote Directory: 指定在远程服务器上的默认目录,Jenkins将把构建产物传输到此目录。
- Use password authentication, or use a different key: 选择是使用密码认证,还是提供私钥文件进行认证。
- 如果使用密钥认证,配置私钥文件路径或直接粘贴私钥内容。
-
点击“测试配置”或“Test Configuration”按钮,验证Jenkins是否能够成功连接到目标服务器。
步骤 3: 保存配置
- 配置完成后,点击页面底部的“保存”或“应用”按钮,以确保你的设置被保存。
2. Gitee 配置
通过配置Gitee,Jenkins能够与Gitee代码仓库集成,实现代码的自动拉取和构建。以下是配置步骤:
步骤 1: 安装 Gitee 插件
- 同样在Jenkins的插件管理中,搜索
Gitee
并安装该插件。
步骤 2: 获取 Gitee API Token
- 登录到Gitee账户,点击链接。
- 在“私人令牌”部分,点击“生成新的令牌”。
- 根据需要选择令牌的权限,例如“repo”(代码仓库相关操作)和“user_info”(用户信息查看)。
- 生成令牌后,复制并保存。
步骤 3: 添加 Gitee配置
- 在“系统配置”页面,找到Gitee 配置。
- 配置你的Gitee仓库信息:
- 链接名: 输入你的Gitee仓库的URL(HTTPS)。
- Gitee域名URL: 输入Gitee域名完整URL地址。
- 证书令牌: 选择Gitee API令牌。
步骤 4: 添加凭据
- 在Gitee配置页面 -> 点击添加Jenkins。
- 在弹出的对话框中选择“Gitee API令牌”,在“Gitee APIV5私人令牌”字段中粘贴你刚刚生成的API Token。
- 为该凭据提供一个名称,并点击“添加”保存。
通过上述步骤,就已经在Jenkins中完成了Publish Over SSH
和Gitee
的配置。这些配置使得Jenkins能够安全地将构建产物部署到远程服务器,同时自动拉取和构建Gitee上的代码,为CI/CD流程提供了基础支持。
7.构建项目
在Jenkins中新建一个Maven项目的步骤如下:
1. 登录Jenkins控制台
首先,访问Jenkins的Web界面,使用你的管理员账户登录。
2. 新建项目
- 在Jenkins首页,点击左侧菜单中的“新建任务”或“New Item”。
- 在弹出的窗口中,为项目输入一个名称,然后选择“构建一个Maven项目”或“Maven Project”。
- 点击“确定”进入项目配置页面。
3. 配置源码管理(Source Code Management, SCM)
- 在项目配置页面,找到“源码管理”部分。
- 选择你使用的版本控制系统(如Git),并输入项目的代码仓库URL。
- 如果仓库需要认证,配置相应的凭证(Credentials),如用户名和密码或SSH密钥。
- 设置仓库中触发构建的分支代码(*/release表示release分支有代码提交则自动触发构建)。
4. 构建触发器
- 配置构建触发器,这可以是轮询SCM(Poll SCM)、Webhook触发、定时构建等。
- 例如,如果你希望在每次代码提交时触发构建,可以选择“GitHub hook trigger for GITScm polling”或“Poll SCM”,并设置合适的时间间隔。
5.Gitee中配置WebHook
在Gitee中配置WebHook时,首先进入仓库的“管理”页面,选择“Webhooks”并添加新WebHook。在请求URL中输入Jenkins的WebHook地址(如),选择触发事件(如推送事件),然后保存配置。这样,每当代码提交时,Gitee将自动通知Jenkins触发相应的构建任务。
上图中所需的URL将在设置Jenkins的Webhook触发器时指定,这个URL用于接收外部触发信号以启动构建流程。由于 Jenkins 是要登录之后才可以操作的,处于公网的 Jenkins 我们也不能降至设置为匿名访问,所以这里我们将 Jenkins 的用户名密码放在请求地址中,最终地址类似这样:http://username:password@IP:8088/xxxx。而Jenkins系统中生成的URL是不包含用户名和密码的,需要你自己手动添加!
此外,为了安全起见,Jenkins系统会自动生成一个密码或密钥,用于验证Webhook请求的有效性,确保只有授权方能触发构建任务。
对应的URL和密码输入并新建WebHook即可,注意,因为Gitee中的bug,就算配置成功了,测试WebHook也会出现404错误。因此如果测试出现404错误不要着急,可以尝试构建项目看看效果再来确定问题!
6. 构建设置
- 在“构建”部分,你需要输入Maven构建的根POM文件的路径,通常是
pom.xml
。 - 在“Goals and options”中,输入你希望执行的Maven命令,如
clean install
或package
,根据项目需求选择合适的构建目标。
7. 构建后操作(Post Steps)
- 你可以在“构建后操作”部分添加一些后续步骤,如“发送邮件通知”或“部署到服务器”。
- 如果你使用Publish Over SSH插件,可以配置将构建产物上传到远程服务器的步骤。
此外,这里还需要上传并执行构建后的deploy.sh脚本文件,具体脚本如下所示:
# 设置jdk路径
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64
export PATH=$JAVA_HOME/bin:$PATH# 设置jar路径和文件名
JAR_PATH=/root/deploy_data
JARFILE=webserver-1.0.0-SNAPSHOT.jar# kill掉正在运行的java进程
ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs kill -9# 开启一个新的java进程
nohup java -jar -Xms512m -Xmx1024m $JAR_PATH/$JARFILE > out.log 2>&1 &if [ $? -eq 0 ]; thensleep 30tail -n 50 out.log
fi
这个脚本文件需要根据服务器中jdk的路径以及jar的路径和名称进行修改!
8. 保存配置并构建
- 配置完成后,点击页面底部的“保存”或“应用”按钮。
- 返回项目主页,点击“立即构建”或“Build Now”按钮,启动第一次构建。
9. 查看构建结果
- 构建过程会在Jenkins的控制台输出中显示,你可以点击项目主页左侧的“控制台输出”查看构建日志。
- 如果构建成功,Jenkins会显示一个绿色的“成功”标记,如果失败,则显示红色“失败”标记。
通过以上步骤,你就可以在Jenkins中成功新建并配置一个Maven项目,实现自动化构建。