跳到主要内容Jenkins 实战:多仓库集成、自动构建与公网远程部署 | 极客日志JavaNode.js大前端java
Jenkins 实战:多仓库集成、自动构建与公网远程部署
综述由AI生成在 CentOS 7 环境下安装配置 Jenkins,结合内网穿透工具实现公网访问,并演示了 GitHub、Gitee、GitLab 代码仓库的自动化构建流程。涵盖前后端项目(Vue+Spring Boot)的持续集成部署方案,包括 Nginx 反向代理及 Webhook 自动触发机制。
SparkGeek23 浏览 Jenkins 实战教程:三大仓库 + 自动构建 + 公网远程部署
Jenkins 作为一款开源的自动化服务器,核心功能覆盖了代码构建、测试到部署的全流程,适配前端 Vue、后端 Spring Boot 等各类项目,还能对接 GitHub、Gitee 等主流代码仓库。其丰富的插件生态和可视化控制台,能大幅减少重复的手动操作,提升开发效率。
不过使用 Jenkins 也有不少需要注意的地方,比如初次配置时要做好权限分配,避免非授权人员修改构建任务,插件安装也需按需选择,否则会拖慢服务器运行速度,另外构建脚本的编写要简洁,不然容易出现构建失败却难排查的问题。
如果仅在局域网内使用 Jenkins,会带来诸多不便:比如居家办公时,想修改代码后触发构建,却连不上公司内网的 Jenkins;多设备开发时,只能在局域网内的电脑操作,外出用笔记本改完代码,还得等回到公司才能部署测试,严重影响进度。
而将 Jenkins 与内网穿透工具结合后,这些问题都能迎刃而解:无需公网 IP 和路由器权限,就能把内网的 Jenkins 映射到公网,不管是在家、出差,只要能上网就能访问 Jenkins 控制台,测试人员也能通过公网链接验证部署效果,既不影响业务又能保证迭代效率。
1. 什么是 Jenkins?
官网:https://www.jenkins.io/zh/
Jenkins 是一个开源的自动化服务器,用于构建、测试和部署软件项目。它是一个持续集成(CI)和持续交付(CD)工具,旨在帮助开发团队更快地交付高质量的软件。
以下是一些关于 Jenkins 的重要信息和功能:
- 自动化构建和部署:Jenkins 允许开发团队自动化软件项目的构建、测试和部署过程。这意味着当代码发生变化时,Jenkins 可以自动触发构建和部署流程,从而减少了手动干预的需要。
- 大量插件支持:Jenkins 拥有一个庞大的插件生态系统,其中包含各种插件,可以用于集成不同的开发、测试和部署工具。
- 分布式构建:Jenkins 支持分布式构建,可以在多台构建代理(节点)上并行运行构建任务。
- 易于配置:Jenkins 提供了一个直观的 Web 界面,使得配置构建和部署任务变得非常简单。
- 多种集成选项:Jenkins 可以集成到许多版本控制系统(如 Git、SVN 等)和项目管理工具中。
- 安全性:Jenkins 提供了一些安全性功能,包括用户认证、访问控制和插件管理。
- 社区支持:Jenkins 拥有庞大的社区,可以轻松找到解决问题的资源、插件和教程。
在本教程中,Jenkins 将作为部署核心,自动拉取代码并完成构建发布。结合内网穿透工具,我们还将打通公网访问,实现从远程触发构建到访问部署结果的完整流程。
2. Jenkins 安装(CentOS7)
2.1 CentOS7 环境准备
在 CentOS7 系统上安装 Jenkins 前,需要先准备 Java 环境:
cd /opt
curl -L -O https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.11%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.11_9.tar.gz
tar -xvzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.11_9.tar.gz
mv jdk-17.0.11+9 temurin17
设置 Java 环境变量(全局):
sudo tee /etc/profile.d/java.sh <<EOF
export JAVA_HOME=/opt/temurin17
export PATH=$JAVA_HOME/bin:$PATH
EOF
source /etc/profile.d/java.sh
2.2 下载 Jenkins
- 第一种方式:在浏览器中下载,然后将文件传入系统中(可使用 xftp 传输,或者使用 scp 命令进行远程拷贝)
**说明:**运行时会提示输入 Linux 的密码,输入 root 密码即可。
mkdir -p /opt/jenkins
cd /opt/jenkins
yum install wget -y
wget https://ftp-nyc.osuosl.org/pub/jenkins/war-stable/latest/jenkins.war
下载完成后将会存在一个 jenkins.war 的 war 文件。
2.3 启动 Jenkins
nohup java -DJENKINS_HOME=/opt/jenkins_home -jar jenkins.war --httpPort=8090 > /var/log/jenkins.log 2>&1
cat /var/log/jenkins.log
sudo vim start_jenkins.sh
chmod +x start_jenkins.sh
#!/bin/bash
export JENKINS_HOME=/opt/jenkins_home
pid=$(netstat -lnp 2>/dev/null | grep 8090 | awk '{print $7}' | awk -F "/" '{print $1}')
if [[ -n "$pid" ]]; then
echo "找到 Jenkins 的 8090 端口进程,PID 为:$pid"
kill -9 $pid
echo "Jenkins 服务已停止"
else
echo "未找到 Jenkins 的 8090 端口进程,跳过停止步骤"
fi
if [[ -f "jenkins-war.log" ]]; then
rm -f jenkins-war.log
echo "日志文件已删除"
else
echo "日志文件不存在"
fi
nohup java -Xms512m -Xmx1024m -Xmn256m -XX:SurvivorRatio=6 -jar jenkins.war --httpPort=8090 >> ./jenkins-war.log 2>&1 &
echo "Jenkins 服务已启动,监听端口 8090,日志输出至 jenkins-war.log"
chmod +x start_jenkins.sh
mkdir -p /opt/jenkins/jenkins_home
chmod -R 777 /opt/jenkins/jenkins_home
c90251a01796458595c575fb2dfbaf72
2.4 配置 Jenkins
firewall-cmd --zone=public --add-port=8090/tcp --permanent
firewall-cmd --reload
出现如上页面即代表启动成功且成功访问 Jenkins 啦!
接下来,输入之前复制的密码,也可以使用如下命令查看密码:
cat /opt/jenkins/home/secrets/initialAdminPassword
安装完成自动跳转该页面(设置一个管理员账号,也可以使用 admin 账号继续)。
配置完成后会让你进行设置访问地址,没其他要求,默认即可。
3. Jenkins 用户权限
3.1 创建用户
依次点击右上角设置图标,然后点击 Security 下的 Users 即可进入。
3.2 删除用户
3.3 权限分配
3.3.1 安装权限插件
路径:右上角设置图标 > System Configuration 下面的 Plugins > Available plugins
搜索 Role-based Authorization Strategy 即可。
点击安装后会跳转安装界面,滚动到最下面,勾选安装完成重启 Jenkins。
3.3.2 切换权限控制插件
路径:右上角设置图标 > Security 下的 Security > 授权策略。
3.3.3 添加角色权限
路径:右上角设置图标 > Security 下的 Manage and Assign Roles > Manage Roles。
3.3.4 用户分配角色
路径:右上角设置图标 > Security 下的 Manage and Assign Roles > Assign Roles。
3.4 权限类别说明
| 权限类别 | 主要权限 | 说明 | 适用角色 |
|---|
| Overall | Administer、Read | 系统管理、基础访问 | 管理员必须、所有用户需要 Read |
| Job | Create、Build、Configure、Read | 项目创建、构建、配置、查看 | 开发者核心权限 |
| Credentials | Create、Update、View | 凭据增删改查 | 管理员和高级开发者 |
| Agent | Create、Configure、Connect | 构建节点管理 | 管理员专用 |
| View | Create、Configure、Read | 视图创建和配置 | 按需分配 |
4. 使 Jenkins 公网访问(内网穿透篇)
4.1 为什么要穿透 Jenkins?
在实际部署 Jenkins 的过程中,通常会将其部署在局域网环境中,以保障安全性和管理便利性。然而,内网部署也带来一个限制:无法直接通过公网访问 Jenkins 服务。这意味着当需要在远程设备上访问 Jenkins、配置任务或查看构建状态时,操作将变得非常受限。
为了解决这一问题,可以通过内网穿透工具将 Jenkins 映射到公网地址。这样,无论是在家办公、远程协作,还是需要跨网络环境访问 Jenkins,都能够通过分配的公网 URL 直接连接到内网中的 Jenkins 服务。
例如,一台部署在公司内网的 Jenkins 实例,默认只能在本地或同一局域网内访问。如果希望在外地通过浏览器访问这台 Jenkins 实例,只需使用隧道工具创建一个 HTTP 隧道,即可将内网地址映射到一个公网可访问的链接,实现对 Jenkins 的远程管理与操作。
4.2 什么是内网穿透工具?
内网穿透工具是一款用于内网穿透的工具,能够将本地或局域网中的服务,映射到公网地址,使其能够被外部网络访问。它支持 HTTP、HTTPS、TCP 等多种协议,并提供稳定的公网访问通道,无需公网 IP、无需复杂的路由或防火墙配置。
在实际使用中,只需简单几步配置,就可以为本地服务生成一个可访问的公网链接,广泛应用于远程调试、Webhook 回调、移动办公、内网接口测试等场景。
- 将本地 Web 应用、API 接口映射到公网,供他人访问或调试;
- 在没有公网 IP 的服务器上部署服务,实现外网访问;
- 支持 Jenkins、GitLab 等系统通过公网访问;
- 进行微信、小程序、支付平台的开发联调(需要公网回调地址);
4.3 安装内网穿透工具
以 Linux(Centos7)为例,首先,我们需要先安装 curl:
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
4.4 配置系统服务
sudo systemctl enable cpolar
sudo systemctl start cpolar
sudo systemctl status cpolar
4.5 注册及登录管理界面
4.5.1 注册
4.5.2 放行 9200 端口(web ui 端口)
在访问 web 页面前,需要先检查系统防火墙是否放行 9200 端口,避免访问不了。
systemctl status firewalld
有两种方式可以实现访问,一种是放行该端口,另一种是直接关闭防火墙(不建议)。
firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --query-port=9200/tcp
4.5.3 访问管理界面
在访问之前,不确定 ip 地址可以通过 ifconfig 命令查看服务器 ip。
登录成功同时,服务器也会后台无感自动配置 token,无需手动配置 token。
配置文件位置:/usr/local/etc/cpolar/cpolar.yml
cat /usr/local/etc/cpolar/cpolar.yml
4.6 配置 Jenkins 隧道及访问测试
4.6.1 配置 HTTP 隧道绑定到 8090 端口
点击左侧菜单栏的隧道管理,展开进入隧道列表页面,页面下默认会有 2 个隧道:
- ssh 隧道,指向 22 端口,tcp 协议
- website 隧道,指向 8080 端口,http 协议(http 协议默认会生成 2 个公网地址,一个是 http,另一个 https,免去配置 ssl 证书的繁琐步骤)
接着点击创建隧道菜单,进入到创建页面,如下图配置:
创建完成后,点击左侧菜单的状态菜单,接着点击在线隧道列表菜单按钮,可以看到有 2 个 gitlab 的隧道,一个为 http 协议,另一个为 https 协议。
4.6.2 访问公网地址验证 Jenkins 是否可访问
在浏览器中访问创建 jenkins 隧道生成的公网地址(http 和 https 皆可)。
登录 jenkins 账号,成功进入 jenkins 首页!
4.7 设置固定二级子域名
使用工具为其配置二级子域名,该域名为固定格式域名,不会随机变化,方便后续远程访问 jenkins 自动化构建平台。
- 地区:显示为 China Top。
- 二级域名:显示为 jenkins。
注:二级域名是唯一的,每个账号都不相同,请以自己设置的二级域名保留的为主。
进入侧边菜单栏的隧道管理 > 隧道列表,可以看到前面配置名为 jenkins-8090 的隧道。
点击编辑按钮进入编辑页面,修改域名类型为二级子域名,然后填写前面配置好的子域名,点击更新按钮。
来到状态菜单下的在线隧道列表可以看到隧道名称为 jenkins-8090 的公网地址已经变更为二级子域名 + 固定域名主体及后缀的形式了。
5. 演示项目实战
在开始配置 Jenkins 自动化部署之前,我们需要准备两个简单的演示项目作为部署对象。这两个演示项目专门为本教程设计,将贯穿整个教程,用于演示从代码提交到自动构建、部署的完整 CI/CD 流程。
- 如何在 Jenkins 中配置前端 Vue 项目的自动化构建与部署
- 如何在 Jenkins 中配置后端 Spring Boot 项目的自动化构建与部署
- 如何通过 Webhook 实现代码提交后的自动触发构建
- 如何将构建产物部署到服务器并提供访问服务
5.1 演示项目介绍
本节准备两个简单的演示项目,专门用于演示 Jenkins 自动化部署流程:
演示前端项目(jenkins-ci-demo-frontend)
重要说明:这两个项目专为本教程设计,包含完整的 Jenkins 构建配置项目代码简洁易懂,便于理解 CI/CD 流程后续所有 Jenkins 配置都基于这两个项目进行演示
5.2 下载演示源码
git clone https://github.com/TanChengBin/jenkins-ci-demo-frontend.git
git clone https://github.com/TanChengBin/jenkins-ci-demo.git
在任意文件夹,单击鼠标右键,打开 shell 窗口,执行 clone 命令下载代码。
5.3 本地运行测试(可选)
为了更好地理解演示项目结构和功能,建议先在本地测试运行这两个演示项目:
5.3.1 后端 Maven 启动
在启动前,需要确保当前系统中有 Java 和 Maven 环境,本文使用的为 windows 系统,以 windows 系统举例:
键盘输入 win+R 键,打开运行窗口,输入 cmd 回车,打开 cmd 命令终端:
在后端项目(jenkins-ci-demo)的目录中,地址栏输入 cmd,可以在当前目录打开 cmd 窗口:
cmd 窗口的路径就会在当前打开 cmd 的目录路径:
这里显示已经运行在 8080 端口上了,接着请求一下 Api 接口测试一下:
http://localhost:8080/api/info
@RestController
@RequestMapping("/api")
public class InfoController {
@GetMapping("/info")
public ResponseEntity<SystemInfo> getSystemInfo() {
SystemInfo systemInfo = new SystemInfo("jenkins-ci-demo", "1.0", "cpolar");
return ResponseEntity.ok(systemInfo);
}
}
5.3.2 前端 Vue 项目启动
在 5.3.1 小节中,后端项目已经启动,占用后端的 cmd 窗口保留。重新开一个新的 cmd 窗口(可以直接在前端项目目录中打开 cmd):
接下来进行安装前端项目依赖,在 cmd 终端执行(前端项目路径的 cmd 终端):
安装完成会有类似 added 164 packages in 5s 提示,接下来启动项目:
在浏览器中输入 Local 这一栏显示的地址即可访问前端项目:
如果后端的 cmd 窗口叉掉了,没有重启后端,前端页面则显示的应该如下:
6. Jenkins 项目创建及配置
Jenkins 在集成 GitHub、Gitee、GitLab 等代码仓库时,项目的创建流程整体上较为一致。因此,本节将以 GitHub 项目为例进行详细讲解,涵盖 Jenkins 插件安装、构建环境配置、依赖缺失处理等内容。Gitee 和 GitLab 也将分别演示对应的前后端项目配置流程,GitLab 由于是私有项目,在配置 git 源仓库时会出现用户凭证问题,大家如遇到该问题便于对比和参考,您可以根据实际使用的仓库平台进行调整。
6.1 github 项目(开源)
6.1.1 前端 Vue 项目创建
然后下拉,找到源码管理,配置好 github 仓库地址信息:
提示没有安装 git,接下来在服务器中安装一下 git:
安装完成后,错误提示就没啦,然后配置好信息点击,保存即可:
接着,回到首页,点击刚才创建的项目 dev-github-jenkins-ci-demo-frontend,点击进入,然后进行构建,如下图:
点击这一条构建记录,也就是 Builds 下面编号为 #6(大家应该是 #1)的这条:
6.1.2 后端 Maven 项目创建
首先需要安装 Maven 风格插件,位置:右上角设置图标 > System Configuration > Plugins > Available plugins 中,输入 Maven
等待一段时间,刷新一下页面,如果跳转登录界面,登录一下即可,然后选择新建 Item:
接着填写任务名称,选择构建一个 Maven 项目的风格:
下拉到源码管理,配置好远程 github 仓库,如下图:
继续滚动到下方,或者点击侧边的 Build 菜单:
点击蓝色字体跳转新页面,进行如下 Maven 配置:
回到刚才 build 的页面,点击保存,重新回到 build 页面就可以看到错误消失了,然后配置一下 build 配置:
clean install -Dmaven.test.skip=true
接着可以继续回到该 build 页面,如图依次点击,可以出现一个可编写 shell 脚本的文本域:
echo "---------Maven 版本(start)---------"
mvn -v
echo "---------Maven 版本(end)---------"
首次下载依赖需要一些时间,所以构建时间也比较长,如下图为剩余日志部分:
6.2 gitee 项目(开源)
6.2.1 前端 Vue 项目创建
首页点击新建 Item,跳转到填写任务名和选择风格界面:
接下来进行源码管理配置,填写相关 gitee 仓库信息:
6.2.2 后端 Maven 项目创建
接下来进入源码管理,进行配置 gitee 的 Maven 项目信息
然后左侧选择 Build 菜单,进行 build 相关配置:
clean install -Dmaven.test.skip=true
写一个简单脚本,查看 maven 版本,进行测试:
echo "---------Maven 版本(start)---------"
mvn -v
echo "---------Maven 版本(end)---------"
接着点击构建 Build Now 进行构建,等待进度条出来,点击进度条可以直接跳转控制台日志输出页面:
6.3 gitlab 项目(私有)
通常情况下,GitLab 多部署在局域网环境中,默认无法直接通过公网访问。本教程所使用的 GitLab 示例地址为经过公网映射后的链接,使用了内网穿透实现访问能力。
为了确保 Jenkins 能正常拉取代码并集成构建,本文在 GitLab 侧完成了以下配置:
- 使用固定二级子域名保持公网地址稳定;
- 将仓库的 clone 地址修改为公网可访问的 HTTP 链接,以适配 Jenkins 拉取代码流程。
详细配置方法可参考上一篇文章:CentOS7 私有 GitLab + cpolar 内网穿透实现公网访问教程
接着,左侧菜单选择源码管理,填写 git 相关配置:
6.3.2 后端 Maven 项目创建
然后填写任务名称,风格选择构建一个 Maven 项目:
然后左侧选择 Build 菜单,进行 build 相关配置:
clean install -Dmaven.test.skip=true
写一个简单脚本,查看 maven 版本,进行测试:
echo "---------Maven 版本(start)---------"
mvn -v
echo "---------Maven 版本(end)---------"
7. Jenkins 自动化构建
由于 GitHub 与 Gitee 的构建流程与 GitLab 基本一致,为避免重复冗余,本小节仅以 GitLab 仓库为例,演示完整的构建过程。过程中也会针对可能出现的错误进行排查说明。其他平台(如 Gitee、GitHub)的项目配置方式可参考本节中 Jenkins + GitLab 的配置流程,进行相应替换与调整。
7.1 前端 Vue 项目自动化构建
在构建并部署前端项目之前,需确保服务器已安装并配置好 Web 服务环境。此处推荐使用 Nginx,用于部署构建后的静态资源并对外提供访问服务。
7.1.1 安装 Nginx
以 CentOS7 为例,目录位置为/opt,安装一下需要的依赖:
cd /opt
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
wget http://nginx.org/download/nginx-1.20.0.tar.gz
tar -zxvf nginx-1.20.0.tar.gz
cd nginx-1.20.0/
./configure --with-http_stub_status_module --with-http_ssl_module
make
make install
执行 make 和 make install 命令
编译后,nginx 目录会存在于/usr/local/nginx 中,接着,启动 nginx 进行测试:
cd /usr/local/nginx/
./sbin/nginx
如果不知道 ip 地址,可以使用 ifconfig 命令进行查看:
nginx 默认端口为 80 端口,接下来需要开放防火墙,以支持访问:
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
7.1.2 添加构建脚本
点击侧边菜单栏的 Build Steps 进行构建相关设置:
7.1.3 前端构建脚本
整个前端项目的构建部署流程主要包括从 Jenkins 的构建工作目录中启动,确保 node 环境正确,并通过 npm 安装依赖和执行打包操作,将打包生成的静态文件压缩成 tar.gz 文件后,移动至预设的部署目录 /home/project/jenkins/jenkins-ci-demo-frontend/ 中。部署前会清理旧内容,解压新构建产物替换更新,以此实现自动化构建与部署。整个过程简洁高效,适合用于前端 Vue 项目的持续集成场景中。
#!/bin/bash
echo $PATH
cd $WORKSPACE
node -v
npm -v
npm install [email protected] --chromedriver_cdnurl=https://npmmirror.com/mirrors/chromedriver
npm install
npm run build
cd $WORKSPACE/dist
rm -rf jenkins-ci-demo-frontend.tar.gz
tar -zcvf jenkins-ci-demo-frontend.tar.gz *
DEPLOY_PATH="/home/project/jenkins/jenkins-ci-demo-frontend"
mkdir -p $DEPLOY_PATH
rm -rf $DEPLOY_PATH/*
rm -rf $DEPLOY_PATH/jenkins-ci-demo-frontend.tar.gz
mv $WORKSPACE/dist/jenkins-ci-demo-frontend.tar.gz $DEPLOY_PATH/
tar -zxvf $DEPLOY_PATH/jenkins-ci-demo-frontend.tar.gz -C $DEPLOY_PATH/
echo "✅ 前端构建并部署完成,部署路径:$DEPLOY_PATH"
7.1.4 构建查看日志
将自定义脚本填写到 Execute shell 中,然后保存:
7.1.5 日志问题排查
第一次构建脚本日志得知,服务器中没有安装 nodejs,让我们安装一下 nodejs:
curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash -
sudo yum install -y nodejs
node -v
npm -v
/home/project/jenkins/jenkins-ci-demo-frontend
确实存在 index.html 文件,且包含前端的压缩文件,接着,我们需要配置 Nginx,以此来正确指向前端静态资源位置:
sudo vim /usr/local/nginx/conf/nginx.conf
找到 nginx 配置文件中监听端口为 80 的服务,将 location 模块中 root 指向的路径,修改为前端项目的静态资源路径:
server {
listen 80;
server_name localhost;
location / {
root /home/project/jenkins/jenkins-ci-demo-frontend;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
/usr/local/nginx/sbin/nginx -s reload
重新刷新 nginx 后,让我们查看一下浏览器,是否正确显示咱们部署的前端页面:
7.1.6 提交代码测试 Jenkins 构建
为了确保前端可以正确的拉取最新提交的 git 代码,这边简单修改一下前端页面,咱们把前端页面显示的 Jenkins CI 演示修改为 Jenkins CI 演示 V1.0:
接着,让我们再次点击构建按钮,进行日志查看和 Nginx 前端页面访问是否变更:
7.2 后端 Maven 项目自动化构建
7.2.1 添加构建脚本
左侧菜单选择 Post Steps,可以看到前面编写过的测试脚本:
7.2.2 后端构建脚本
整个后端项目的构建部署流程是以 Jenkins 构建产物为起点,首先从 Jenkins 的构建输出目录中复制打包生成的 jenkins-ci-demo-1.0.jar 文件,并将其分别放置到项目运行目录和预设的部署备份目录 /home/project/jenkins/jenkins-ci-demo-backend/ 中。部署前会清理掉旧的 jar 包,确保工作目录干净整洁。随后通过预设的启动脚本 start_jenkins-ci-demo.sh 对服务进行重启,脚本会自动停止旧进程并拉起新的 jar 服务,同时生成独立的日志文件用于后续排查与追踪。整个流程自动化程度高、稳定性好,适合 Spring Boot 类型的后端服务持续集成与部署使用。
#!/bin/bash
BUILD_ID=dontKillMe
PROJECT_NAME="jenkins-ci-demo"
PROJECT_VERSION="-1.0"
JAR_FILE_NAME="${PROJECT_NAME}${PROJECT_VERSION}.jar"
JENKINS_TARGET_DIR="$WORKSPACE/target"
DEPLOY_DIR="/home/project/jenkins/jenkins-ci-demo-backend"
START_SCRIPT="start_jenkins-ci-demo.sh"
echo "======== Jenkins 后端部署开始 ========"
echo "项目名称:$PROJECT_NAME"
echo "Jar 文件名:$JAR_FILE_NAME"
echo "构建输出目录:$JENKINS_TARGET_DIR"
echo "部署目录:$DEPLOY_DIR"
mkdir -p "$DEPLOY_DIR"
if [ -f "$DEPLOY_DIR/$JAR_FILE_NAME" ]; then
echo "删除旧 jar 包:$DEPLOY_DIR/$JAR_FILE_NAME"
rm -f "$DEPLOY_DIR/$JAR_FILE_NAME"
fi
if [ -f "$JENKINS_TARGET_DIR/$JAR_FILE_NAME" ]; then
echo "拷贝新 jar 到部署目录..."
cp "$JENKINS_TARGET_DIR/$JAR_FILE_NAME" "$DEPLOY_DIR/"
else
echo "❌ 构建产物不存在:$JENKINS_TARGET_DIR/$JAR_FILE_NAME"
exit 1
fi
cd "$DEPLOY_DIR" || { echo "❌ 切换目录失败:$DEPLOY_DIR"; exit 1; }
if [ ! -x "$START_SCRIPT" ]; then
echo "启动脚本不存在或不可执行:$DEPLOY_DIR/$START_SCRIPT"
exit 1
fi
echo "执行启动脚本..."
sh "$START_SCRIPT" restart
sleep 20
RUNNING_COUNT=$(ps -ef | grep "$JAR_FILE_NAME" | grep -v grep | wc -l)
if [ "$RUNNING_COUNT" -gt 0 ]; then
echo "✅ 服务已成功启动 (进程数:$RUNNING_COUNT)"
exit 0
else
echo "❌ 服务启动失败,未检测到 jar 运行中"
exit 1
fi
后端 Jar 文件启动脚本 (start_jenkins-ci-demo.sh) :
PORT=8080
JAR_FILE="jenkins-ci-demo-1.0.jar"
LOG_DIR="log"
LOG_PREFIX=""
extract_jar_prefix(){
local jar_name=$(basename "$JAR_FILE")
echo "$jar_name" | sed -E 's/(-[0-9]+\.[0-9]+.*)?\.jar$//i'
}
get_pid(){
lsof -ti :$PORT
}
stop(){
echo "正在停止监听 ${PORT} 端口的进程..."
local pids=$(get_pid)
if [[ -n "$pids" ]]; then
echo "发现进程 PIDs: $pids"
kill -9 $pids
echo "进程已终止"
else
echo "未找到运行中的进程"
fi
}
start(){
if [[ ! -f "$JAR_FILE" ]]; then
echo "错误:JAR 文件不存在 [$JAR_FILE]"
exit 1
fi
local existing_pids=$(get_pid)
if [[ -n "$existing_pids" ]]; then
echo "错误:应用已在运行 (PIDs: $existing_pids)"
exit 1
fi
local jar_prefix=$(extract_jar_prefix)
local prefix=${LOG_PREFIX:-$jar_prefix}
mkdir -p "$LOG_DIR"
local timestamp=$(date "+%Y%m%d-%H%M%S")
local log_file="${LOG_DIR}/${prefix}-${timestamp}.log"
echo "启动 Java 应用 [$JAR_FILE]..."
nohup java -Xms512m -Xmx512m -Xmn256m -XX:SurvivorRatio=6 -jar "$JAR_FILE">> "$log_file" 2>&1 &
echo "✔ 应用已启动"
echo "▷ 日志文件:$(pwd)/$log_file"
echo "▶︎ 实时日志查看:tail -f $log_file"
}
restart(){ stop sleep 2 start }
case "$1" in
start) start ;;
stop) stop ;;
restart) restart ;;
*)
echo "使用方法:$0 {start|stop|restart}"
exit 1
;;
esac
exit 0
7.2.3 构建查看日志
首先,需要先在服务器中添加后端 jar 文件启动脚本 start_jenkins-ci-demo.sh
mkdir -p /home/project/jenkins/jenkins-ci-demo-backend/
cd /home/project/jenkins/jenkins-ci-demo-backend/
接着添加 jar 文件启动脚本 start_jenkins-ci-demo.sh:
sudo vim start_jenkins-ci-demo.sh
chmod +x start_jenkins-ci-demo.sh
接下来打开 jenkins 中的后端项目 dev-gitlab-jenkins-ci-demo-backend,进入配置页面,填写构建脚本(7.2.2 小节中的):
为了方便测试后端接口是否能够正常访问,接下来我们需要开放一下后端访问端口:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
http://192.168.184.133:8080/api/info
7.2.4 提交代码测试 Jenkins 构建
为了确保后端可以正确的拉取最新提交的 git 代码,这边简单修改一下后端接口返回的信息,咱们把后端接口 V1.0:
成功启动啦,接下来测试一下后端 API 接口,看看是否更新最新接口信息:
可以看到接口返回的信息成功从 1.0 变为 2.0 啦!
8. 修改 Nginx 配置联通前后端
8.1 内网联通前后端
在修改 nginx 之前,请求前端的时候,打开开发者模式可以看到:
sudo vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
location / {
root /home/project/jenkins/jenkins-ci-demo-frontend;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://192.168.184.133:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
/usr/local/nginx/sbin/nginx -s reload
8.2 远程访问前端项目(内网穿透)
8.2.1 配置 HTTP 隧道绑定到 80 端口
登录到管理端,点击左侧菜单栏的隧道管理,展开进入隧道列表页面,页面下默认会有 2 个隧道:
- ssh 隧道,指向 22 端口,tcp 协议
- website 隧道,指向 8080 端口,http 协议(http 协议默认会生成 2 个公网地址,一个是 http,另一个 https,免去配置 ssl 证书的繁琐步骤)
来到侧边栏的隧道管理 > 创建隧道表单,填写隧道信息如下:
接着来到侧边栏状态 > 在线隧道列表,可以看到 2 条隧道信息:
8.2.2 访问公网地址验证前端是否可访问
一条协议为 http 的,另一条为 https 协议,让我们浏览器访问测试一下,以 https 为例:
8.2.3 设置固定二级子域名
使用工具为其配置二级子域名,该域名为固定格式域名,不会随机变化,方便远程访问前端项目。
- 地区:显示为 China Top。
- 二级域名:显示为 jenkinscidemo。
注:二级域名是唯一的,每个账号都不相同,请以自己设置的二级域名保留的为主。
进入侧边菜单栏的隧道管理 > 隧道列表,可以看到前面配置名为 jenkins-ci-demo-80 的隧道
点击编辑按钮进入编辑页面,修改域名类型为二级子域名,然后填写前面配置好的子域名,点击更新按钮:
来到状态菜单下的在线隧道列表可以看到隧道名称为 jenkins-ci-demo-80 的公网地址已经变更为二级子域名 + 固定域名主体及后缀的形式了:
9. Webhook 自动触发 Jenkins 构建
本节主要演示:通过 GitLab Webhook 远程触发 Jenkins 自动构建。
这种方式适用于将代码提交或推送到 GitLab 仓库后,自动通知 Jenkins 进行构建部署,实现持续集成(CI)流程自动化。
**说明:**本教程以 GitLab 为例,Gitee、GitHub 等代码仓库平台的 Webhook 配置方式与 GitLab 类似,仅在触发 URL 和权限管理等细节上略有差异,不再一一赘述。后续你可以根据相同思路,配置 Gitee/GitHub 的 webhook 即可实现同样效果。前端项目使用'自由风格(Freestyle)构建任务',后端使用'Maven 项目',这两种 Jenkins 任务类型都支持通过 webhook 插件触发。配置方式大同小异,因此本节采用前端项目进行演示,不重复分别演示前后端项目。
9.1 安装 Generic Webhook Trigger 插件
点击首页右上角设置图标按钮 > 找到 System Configuration 下的 Plugins 模块,点击进去选择 Available plugins,然后搜索 Generic Webhook Trigger 插件:
安装好后,选择前端项目 dev-gitlab-jenkins-ci-demo-frontend 进入项目配置,菜单选择 Triggers,如图:
填写完成后,直接点击 Save 保存即可,webhook 地址格式如下:
http://JENKINS_URL/generic-webhook-trigger/invoke
接着,来到 gitlab,打开前端项目,然后依次选择:Settings > Webhooks
填写完成相关信息后,点击 Add webhook,然后滚动到底部可以进行简单的测试:
回到 jenkins 中可以看到,配置了 webhook 的项目工程被 gitlab 推送事件触发了构建:
9.2 修改代码提交 gitlab 测试推送事件
打开 jenkins 可以看到,本地进行 git push 操作时,gitlab 向 jenkins 发送了推送事件,触发了 jenkins 的自动构建:
好啦!现在每次向 GitLab 提交代码后,Jenkins 就会通过 Webhook 自动开始构建,无需手动操作。
10. 总结
本教程完整演示了在 CentOS 7 服务器上搭建 Jenkins 自动化部署平台并通过内网穿透实现公网触发的全过程。
- Jenkins 2.x 的安装与 Java 环境配置
- 内网穿透工具的部署与服务配置
- Jenkins 用户权限管理与角色分配
- HTTP 隧道创建与公网地址生成
- 固定二级子域名设置
- GitHub、Gitee、GitLab 多平台项目集成
- 前端 Vue 项目自动化构建与 Nginx 部署
- 后端 Maven 项目自动化构建与 Jar 包部署
- Webhook 自动触发机制配置与测试验证
这套解决方案实现了完整的 CI/CD 流程,既保障了代码的持续集成与自动化部署,又提供了便捷的远程访问环境,适用于企业内部开发、个人项目管理以及团队协作等多种场景。通过内网穿透,即使在没有公网 IP 的环境下,也能实现专业级的自动化部署体验。
11. 项目源码
本教程使用的前后端分离演示项目已开源,展示了完整的 Jenkins CI/CD 自动化部署流程。
前端项目(Vue 3 + Vite + Element Plus):
后端项目(Spring Boot + Maven):
总结来说,Jenkins 凭借自动化能力解决了代码构建部署的重复性工作,让开发者从机械操作中解脱出来,而内网穿透工具则弥补了 Jenkins 仅能内网使用的短板,通过内网穿透实现了公网远程访问和操作。二者结合,不管是个人开发者多设备同步开发,还是中小企业团队协同部署,都能贴合实际开发场景解决痛点,让代码从提交到上线的全流程更顺畅,是提升日常开发效率的实用组合。
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online