前言
Jenkins 是常见的自动化部署工具,广泛用于项目构建、测试与上线。但当它部署在内网环境中时,往往难以实现外部触发构建、远程访问控制台等需求,尤其对于没有公网 IP 或路由器权限的团队和个人而言,使用门槛较高。
本教程将介绍如何在 CentOS 7 上配置 Jenkins,并结合 cpolar 内网穿透,实现无需公网 IP 即可通过 GitHub、Gitee 等平台远程触发构建任务,并访问 Jenkins 控制台。适用于内网服务器部署、家庭实验环境、小型项目持续集成等场景。
通过合理配置,即便身处局域网,也能完成一套具备公网响应能力的自动部署流程。
1 什么是Jenkins?
官网(中文):https://www.jenkins.io/zh/
Jenkins是一个开源的自动化服务器,用于构建、测试和部署软件项目。它是一个持续集成(CI)和持续交付(CD)工具,旨在帮助开发团队更快地交付高质量的软件。
以下是一些关于Jenkins的重要信息和功能:
- 自动化构建和部署:Jenkins允许开发团队自动化软件项目的构建、测试和部署过程。这意味着当代码发生变化时,Jenkins可以自动触发构建和部署流程,从而减少了手动干预的需要。
- 大量插件支持:Jenkins拥有一个庞大的插件生态系统,其中包含各种插件,可以用于集成不同的开发、测试和部署工具。这意味着你可以轻松地将Jenkins与你的喜欢的工具集成在一起,以满足项目的需求。
- 分布式构建:Jenkins支持分布式构建,可以在多台构建代理(节点)上并行运行构建任务。这可以提高构建效率,尤其对于大型项目来说尤为重要。
- 易于配置:Jenkins提供了一个直观的Web界面,使得配置构建和部署任务变得非常简单。你可以通过界面设置构建参数、构建触发器等。
- 多种集成选项:Jenkins可以集成到许多版本控制系统(如Git、SVN等)和项目管理工具中。它还支持通知和报告功能,以便及时了解构建状态和问题。
- 安全性:Jenkins提供了一些安全性功能,包括用户认证、访问控制和插件管理,以确保只有授权用户可以访问和操作Jenkins服务器。
- 社区支持:Jenkins拥有庞大的社区,这意味着你可以轻松地找到解决问题的资源、插件和教程。
在本教程中,Jenkins 将作为部署核心,自动拉取代码并完成构建发布。结合 cpolar
,我们还将打通公网访问,实现从远程触发构建到访问部署结果的完整流程。
2 Jenkins安装(CentOS7)
2.1 CentOS7环境准备
在CentOS7系统上安装Jenkins前,需要先准备Java环境:
# 下载并安装 Adoptium OpenJDK 17
cd /opt
#下载jdk-17压缩包
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
验证是否成功:
java -version
2.2 下载Jenkins
下载链接:https://ftp-nyc.osuosl.org/pub/jenkins/war-stable/latest/jenkins.war
- 两种下载方式:
- 第一种方式:在浏览器中下载,然后将文件传入系统中(可使用xftp传输,或者使用scp命令进行远程拷贝)
#将 Windows 本地文件上传到 Linux scp "D:\Download\jenkins.war" root@192.168.184.133:/home/jenkins
说明:
""D:\Download\jenkins.war""
:Windows 本地文件路径,支持带空格的路径,建议用引号包裹;root@192.168.184.133
:Linux 服务器的用户名和 IP;/home/jenkins
:Linux 上要保存的目录路径;- 运行时会提示输入 Linux 的密码。
运行时会提示输入 Linux 的密码,输入root密码即可。
- 第二种方式:使用wget命令直接进行下载
mkdir -p /opt/jenkins
cd /opt/jenkins
#未安装wget先安装
yum install wget -y
wget https://ftp-nyc.osuosl.org/pub/jenkins/war-stable/latest/jenkins.war
下载完成后将会存在一个jenkins.war的war文件
2.3 启动jenkins
#使用java-jar启动war文件,设置端口8090,并使用nohup设置后台启动以及指定日志文件路径为 /var/log/jenkins.log
nohup java -DJENKINS_HOME=/opt/jenkins_home -jar jenkins.war --httpPort=8090 > /var/log/jenkins.log 2>&1 &
#如果发现启动不了,可以查看日志进行排错(例如:地址已经在使用,换个端口就好了)
cat /var/log/jenkins.log
也可以创建一键启动脚本:
#创建start_jenkins脚本
sudo vim start_jenkins.sh
#给start_jenkins脚本赋权
chmod +x start_jenkins.sh
创建脚本后输入如下内容:
#!/bin/bash
# 设置 Jenkins 持久化目录
export JENKINS_HOME=/opt/jenkins_home
# 获取监听8090端口的进程PID
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
# 启动 Jenkins
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
创建jenkins_home
目录:
mkdir -p /opt/jenkins/jenkins_home
chmod -R 777 /opt/jenkins/jenkins_home
执行脚本进行启动:
./start_jenkins.sh
记住控制台输出的管理员密码:
#注意,每个用户生成的都不一样
c90251a01796458595c575fb2dfbaf72
这样,jenkins就已经启动啦!
2.4 配置Jenkins
执行如下命令开放jenkins防火墙端口:
#开放8090端口 脚本中设置的jenkins端口为8090
firewall-cmd --zone=public --add-port=8090/tcp --permanent
#刷新防火墙配置
firewall-cmd --reload
开放防火墙后,访问测试:
http://<您的服务器IP>:8090 #如:http://192.168.184.133:8090
出现如上页面即代表启动成功且成功访问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
即可
Role-based Authorization Strategy
点击安装后会跳转安装界面,滚动到最下面,勾选安装完成重启Jenkins
3.3.2 切换权限控制插件
路径:右上角设置
图标>Security下的Security
>授权策略
3.3.3 添加角色权限
路径:右上角设置
图标>Security下的Manage and Assign Roles
>Manage Roles
设置好后,点击下方的Save
保存按钮
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公网访问(cpolar穿透篇)
4.1为什么要穿透jenkins?
在实际部署 Jenkins 的过程中,通常会将其部署在局域网环境中,以保障安全性和管理便利性。然而,内网部署也带来一个限制:无法直接通过公网访问 Jenkins 服务。这意味着当需要在远程设备上访问 Jenkins、配置任务或查看构建状态时,操作将变得非常受限。
为了解决这一问题,可以通过内网穿透工具cpolar
将 Jenkins 映射到公网地址。这样,无论是在家办公、远程协作,还是需要跨网络环境访问 Jenkins,都能够通过分配的公网 URL 直接连接到内网中的 Jenkins 服务。
例如,一台部署在公司内网的 Jenkins 实例,默认只能在本地或同一局域网内访问。如果希望在外地通过浏览器访问这台 Jenkins 实例,只需使用 cpolar
创建一个 HTTP 隧道,即可将内网地址映射到一个公网可访问的链接,实现对 Jenkins 的远程管理与操作。
4.2 什么是cpolar?
cpolar 是一款用于内网穿透的工具,能够将本地或局域网中的服务,映射到公网地址,使其能够被外部网络访问。它支持 HTTP、HTTPS、TCP 等多种协议,并提供稳定的公网访问通道,无需公网 IP、无需复杂的路由或防火墙配置。
在实际使用中,只需简单几步配置,cpolar
就可以为本地服务生成一个可访问的公网链接,广泛应用于远程调试、Webhook 回调、移动办公、内网接口测试等场景。
常见应用场景包括:
- 将本地 Web 应用、API 接口映射到公网,供他人访问或调试;
- 在没有公网 IP 的服务器上部署服务,实现外网访问;
- 支持 Jenkins、GitLab、n8n 等系统通过公网访问;
- 进行微信、小程序、支付平台的开发联调(需要公网回调地址);
cpolar
提供免费和付费版本,免费版支持临时公网地址,付费版支持固定公网地址、带宽控制、身份认证等高级功能。
4.3 安装cpolar
以Linux(Centos7)为例,首先,我们需要先安装curl:
sudo yum install curl
接下来下载cpolar,一条命令完成安装
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
测试cpolar
版本以确保安装
cploar version
4.4 配置cpolar系统服务
向系统添加及启动cpolar服务
#添加cpolar服务
sudo systemctl enable cpolar
#启动cpolar服务
sudo systemctl start cpolar
查看服务状态
sudo systemctl status cpolar
4.5 注册及登录cpolar web ui管理界面
4.5.1 注册cpolar
官网链接:https://www.cpolar.com/
访问cpolar
官网,点击免费注册
按钮,进行账号注册
注册页面:
4.5.2 放行9200端口(web ui端口)
在访问web页面前,需要先检查系统防火墙是否放行9200端口,避免访问不了
systemctl status firewalld
有两种方式可以实现访问,一种是放行该端口,另一种是直接关闭防火墙(不建议)
#放行 9200 端口
#--zone=public:使用默认区域(通常是 public)
#--add-port=9200/tcp:添加 TCP 协议的 9200 端口
#--permanent:永久生效(不加此参数则是临时规则,重启失效)
firewall-cmd --zone=public --add-port=9200/tcp --permanent
#重载防火墙配置(及刷新配置使其生效)
firewall-cmd --reload
验证端口是否已放行
firewall-cmd --zone=public --query-port=9200/tcp
输出内容为yes则成功放行
4.5.3 访问cpolar web ui管理界面
在访问之前,不确定ip地址可以通过ifconfig
命令查看服务器ip
ifconfig
确定好ip地址后,在浏览器中访问:
http://<此处应为您的IP>:9200 #如:http://192.168.184.133:9200
将前面步骤注册好的cpolar账号登录即可进入后台页面
登录成功同时,服务器也会后台无感自动配置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皆可)
这里以https为例:
登录jenkins账号,成功进入jenkins首页!
4.7 设置固定二级子域名(Pro用户)
4.7.1 保留二级子域名
使用cpolar
为其配置二级子域名
,该域名为固定格式域名,不会随机变化,方便后续远程访问jenkins
自动化构建平台。
进入官网的预留页面:https://dashboard.cpolar.com/reserved
列表中显示了一条已保留的二级子域名记录:
- 地区:显示为
China Top
。 - 二级域名:显示为
jenkins
。
注:二级域名是唯一的,每个账号都不相同,请以自己设置的二级域名保留的为主
4.7.2 修改jenkins隧道为子域名方式
进入侧边菜单栏的隧道管理
>隧道列表
,可以看到前面配置名为jenkins-8090
的隧道
点击编辑
按钮进入编辑页面,修改域名类型为二级子域名
,然后填写前面配置好的子域名,点击更新按钮:
4.7.3 访问子域名测试
来到状态
菜单下的在线隧道列表
可以看到隧道名称为jenkins-8090
的公网地址已经变更为二级子域名+固定域名主体及后缀
的形式了:
这里以https协议做访问测试:
访问成功!
5 演示项目实战
在开始配置Jenkins自动化部署之前,我们需要准备两个简单的演示项目作为部署对象。这两个演示项目专门为本教程设计,将贯穿整个教程,用于演示从代码提交到自动构建、部署的完整CI/CD流程。
通过这两个演示项目,您将学会:
- 如何在Jenkins中配置前端Vue项目的自动化构建与部署
- 如何在Jenkins中配置后端Spring Boot项目的自动化构建与部署
- 如何通过Webhook实现代码提交后的自动触发构建
- 如何将构建产物部署到服务器并提供访问服务
5.1 演示项目介绍
本节准备两个简单的演示项目,专门用于演示Jenkins自动化部署流程:
演示前端项目(jenkins-ci-demo-frontend)
- GitHub地址:https://github.com/TanChengBin/jenkins-ci-demo-frontend
- 技术栈:Vue 3 + Vite + Element Plus
- 功能:演示前端项目的Jenkins自动化构建与部署
- 端口:3000
- 构建产物:静态文件(部署到Nginx)
演示后端项目(jenkins-ci-demo)
- GitHub地址:https://github.com/TanChengBin/jenkins-ci-demo
- 技术栈:Spring Boot 2.7 + Maven
- 功能:提供RESTful API,演示后端项目的Jenkins自动化构建与部署
- 端口:8080
- 构建产物:jar包(Java应用)
📌 重要说明:
- 这两个项目专为本教程设计,包含完整的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命令终端:
检查是否存在Java版本:
如果没有,需要先下载jdk(jdk8~jdk17均可),下载官网(Oracle):https://www.oracle.com/cn/java/technologies/downloads/
java -version
检查Maven环境:
如果没有,需要先下载Maven
,下载官网(Apache):https://maven.apache.org/
mvn -v
以上环境都有的情况下,即可进行下一步骤啦!
在后端项目(jenkins-ci-demo
)的目录中,地址栏输入cmd
,可以在当前目录打开cmd窗口:
cmd窗口的路径就会在当前打开cmd的目录路径:
然后输入Maven命令:
mvn spring-boot:run
这个命令会进行依赖下载和启动项目:
这里显示已经运行在8080端口上了,接着请求一下Api接口测试一下:
# 后端唯一api接口 返回:项目名称、版本号、作者 方便后期jenkins修改代码,提交git测试
http://localhost:8080/api/info
/**
* 系统信息控制器
*
* @author cpolar
*/
@RestController
@RequestMapping("/api")
public class InfoController {
/**
* 获取系统信息
* 返回系统的基本信息,包括项目名称、版本号和作者信息
*
* @return 系统信息
*/
@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窗口后,检查一下前端环境:
node -v
npm -v
node版本建议在16.x
或更高版本,如果没有下载node,可以前往官网进行下载:
官网链接(中文):http://nodejs.org/zh-cn
接下来进行安装前端项目依赖,在cmd终端执行(前端项目路径的cmd终端):
#依赖安装
npm install
安装完成会有类似added 164 packages in 5s
提示,接下来启动项目:
npm run dev
输入如上命令后,项目会启动,启动成功后显示如下:
在浏览器中输入Local
这一栏显示的地址即可访问前端项目:
http://127.0.0.1:3000
如果后端的cmd窗口叉掉了,没有重启后端,前端页面则显示的应该如下:
6 Jenkins项目创建及配置
Jenkins
在集成 GitHub、Gitee、GitLab
等代码仓库时,项目的创建流程整体上较为一致。因此,本节将以 GitHub 项目 为例进行详细讲解,涵盖 Jenkins 插件安装、构建环境配置、依赖缺失处理等内容。Gitee 和 GitLab 也将分别演示对应的前后端项目配置流程,GitLab由于是私有项目,在配置git源仓库时会出现用户凭证问题,大家如遇到该问题便于对比和参考,您可以根据实际使用的仓库平台进行调整。
6.1 github项目(开源)
6.1.1 前端Vue项目创建
Jenkin首页选择新建item
:
接着输入任务名称,名称自定义,风格选择自由风格:
然后下拉,找到源码管理
,配置好github仓库地址信息:
提示没有安装git,接下来在服务器中安装一下git:
yum install 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仓库信息:
保存后点击Build Now
按钮进行构建测试
查看控制台日志信息:
项目简单创建就完成啦!
6.2.2 后端Maven项目创建
首页选择新建Item
:
然后填写任务名称和选择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 示例地址为经过公网映射后的链接,使用了 cpolar
内网穿透 实现访问能力。
为了确保 Jenkins 能正常拉取代码并集成构建,本文在 GitLab 侧完成了以下配置:
- 使用 固定二级子域名 保持公网地址稳定;
- 将 仓库的 clone 地址 修改为公网可访问的 HTTP 链接,以适配 Jenkins 拉取代码流程。
🔗 详细配置方法可参考上一篇文章:CentOS7 私有 GitLab + cpolar 内网穿透实现公网访问教程 – cpolar 极点云官网
首页选择新建Item
任务名称自定义即可,风格选择自由风格:
接着,左侧菜单选择源码管理
,填写git相关配置:
如下为填写账号信息凭证参考图:
接下来,点击构建,进行测试:
控制台日志输出如下:
6.3.2 后端Maven项目创建
首页点击新建Item
:
然后填写任务名称,风格选择构建一个Maven项目:
左侧菜单选择源码管理
,填写相关Git信息:
然后左侧选择Build
菜单,进行build相关配置:
#清理 打包 跳过测试
clean install -Dmaven.test.skip=true
写一个简单脚本,查看maven版本,进行测试:
echo "---------Maven版本(start)---------"
mvn -v
echo "---------Maven版本(end)---------"
接下来,点击Build Now
按钮,进行构建
输出日志如下:
剩余日志如下,供参考:
这样基本的项目创建就完成啦!
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
安装编译nginx:
#进入nginx目录
cd nginx-1.20.0/
#执行命令 考虑到后续安装ssl证书 添加两个模块
./configure --with-http_stub_status_module --with-http_ssl_module
#执行make命令
make
#执行make install命令
make install
执行make
和make install
命令
编译后,nginx目录会存在于/usr/local/nginx
中,接着,启动nginx进行测试:
#进入nginx目录
cd /usr/local/nginx/
#启动nginx
./sbin/nginx
如果不知道ip地址,可以使用ifconfig
命令进行查看:
ifconfig
nginx
默认端口为80端口,接下来需要开放防火墙,以支持访问:
#开放80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
#重新加载防火墙配置
firewall-cmd --reload
接着,浏览器访问测试一下:
http://192.168.184.133
成功啦,成功访问到Nginx默认首页!
7.1.2 添加构建脚本
首页点击任务项目名称进入详情页:
接着点击配置
按钮,进入配置页面:
点击侧边菜单栏的Build Steps
进行构建相关设置:
7.1.3 前端构建脚本
整个前端项目的构建部署流程主要包括从 Jenkins 的构建工作目录中启动,确保 node 环境正确,并通过 npm 安装依赖和执行打包操作,将打包生成的静态文件压缩成 tar.gz
文件后,移动至预设的部署目录 /home/project/jenkins/jenkins-ci-demo-frontend/
中。部署前会清理旧内容,解压新构建产物替换更新,以此实现自动化构建与部署。整个过程简洁高效,适合用于前端 Vue 项目的持续集成场景中。
#!/bin/bash
# 输出当前系统 PATH 环境变量(调试用,可忽略)
echo $PATH
# 切换到 Jenkins 工作目录(当前项目源码根目录)
cd $WORKSPACE
# 输出 Node.js 和 npm 版本,确认环境正常
node -v
npm -v
# 安装指定版本的 chromedriver,并使用国内镜像源加速(若项目依赖)
npm install chromedriver@114.0.0 --chromedriver_cdnurl=https://npmmirror.com/mirrors/chromedriver
# 安装项目依赖
npm install
# 执行 Vue 项目构建命令(默认产物生成在 dist 目录)
npm run build
# 切换到构建产物目录
cd $WORKSPACE/dist
# 删除旧的压缩包(避免文件冲突)
rm -rf jenkins-ci-demo-frontend.tar.gz
# 将构建产物打包为 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
:
# 1. 添加 Node.js 16 的官方源(可改为 18、20 等其他版本)
curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash -
# 2. 安装 Node.js(含 npm)
sudo yum install -y nodejs
# 3. 验证版本
node -v
npm -v
添加nodejs16的官方源:
安装node.js以及验证版本是否成功安装!
接着,我们再次点击构建,查看最新日志,日志如下:
我们可以看到提示,最后提示部署路径为:
/home/project/jenkins/jenkins-ci-demo-frontend
让我们进入服务器中查看一下该目录下的文件内容:
确实存在index.html
文件,且包含前端的压缩文件,接着,我们需要配置Nginx
,以此来正确指向前端静态资源位置:
#编辑nginx文件
sudo vim /usr/local/nginx/conf/nginx.conf
找到nginx配置文件中监听端口为80的服务,将location
模块中root指向的路径,修改为前端项目的静态资源路径:
#nginx配置如下:
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;
}
}
接着执行如下命令,进行刷新nginx
/usr/local/nginx/sbin/nginx -s reload
重新刷新nginx后,让我们查看一下浏览器,是否正确显示咱们部署的前端页面:
可以发现,前端vue页面正常显示啦!
7.1.6 提交代码测试Jenkins构建
为了确保前端可以正确的拉取最新提交的git代码,这边简单修改一下前端页面,咱们把前端页面显示的Jenkins CI 演示
修改为Jenkins CI 演示 V1.0
:
接着,让我们再次点击构建按钮,进行日志查看和Nginx前端页面访问是否变更:
让我们查看前端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
# 防止 Jenkins kill 脚本
BUILD_ID=dontKillMe
# 项目 & jar 包配置
PROJECT_NAME="jenkins-ci-demo"
PROJECT_VERSION="-1.0"
JAR_FILE_NAME="${PROJECT_NAME}${PROJECT_VERSION}.jar"
# Jenkins 构建产物目录(Maven target)
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"
# 删除旧 jar(如果存在)
if [ -f "$DEPLOY_DIR/$JAR_FILE_NAME" ]; then
echo "删除旧 jar 包:$DEPLOY_DIR/$JAR_FILE_NAME"
rm -f "$DEPLOY_DIR/$JAR_FILE_NAME"
fi
# 拷贝新 jar 到部署目录
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) :
# start_jenkins-ci-demo
# ====================== 配置区 ======================
# === 使用前请确保已安装 lsof:sudo yum install lsof -y ===
PORT=8080 # 应用监听端口
JAR_FILE="jenkins-ci-demo-1.0.jar" # 构建后的 JAR 文件名
LOG_DIR="log" # 日志目录
LOG_PREFIX="" # 可选:日志前缀(留空自动识别)
# ====================================================
# 提取 jar 文件前缀(自动用于日志命名)
extract_jar_prefix() {
local jar_name=$(basename "$JAR_FILE")
echo "$jar_name" | sed -E 's/(-[0-9]+\.[0-9]+.*)?\.jar$//i'
}
# 获取监听端口的 PID
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
:
#编辑脚本(添加7.2.2小节中的后端jar文件启动脚本)
sudo vim start_jenkins-ci-demo.sh
进行脚本赋权:
chmod +x start_jenkins-ci-demo.sh
授权后,脚本便会显示为绿色(即可执行脚本)
接下来打开jenkins
中的后端项目dev-gitlab-jenkins-ci-demo-backend
,进入配置页面,填写构建脚本(7.2.2小节中的):
点击构建,查看控制台日志输出:
为了方便测试后端接口是否能够正常访问,接下来我们需要开放一下后端访问端口:
#开放8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
#重新加载防火墙配置
firewall-cmd --reload
让我们访问一下后端的Api接口进行测试:
#注意 此处IP地址应修改为您的服务器地址
http://192.168.184.133:8080/api/info
可以看到成功访问啦!
7.2.4 提交代码测试Jenkins构建
为了确保后端可以正确的拉取最新提交的git代码,这边简单修改一下后端接口返回的信息,咱们把后端接口V1.0`:
让我们再次构建Jenkins,查看最新日志:
构建结果如下:
成功启动啦,接下来测试一下后端API接口,看看是否更新最新接口信息:
可以看到接口返回的信息成功从1.0
变为2.0
啦!
8 修改Nginx配置联通前后端
8.1 内网联通前后端
在修改nginx之前,请求前端的时候,打开开发者模式可以看到:
从图中可以看到,前端请求的地址是http://192.168.184.133/api/info
,而后端的地址为http://192.168.184.133:8080/api/info
,所以需要进行nginx反向代理,让我们修改一下nginx配置:
#编辑nginx配置
sudo vim /usr/local/nginx/conf/nginx.conf
nginx配置修改如下:
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; # 支持前端路由(如Vue/React)
}
# 反向代理 /api 到后端服务 http://192.168.184.133:8080
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;
}
}
修改后如图:
接着刷新一下nginx配置:
#刷新nginx配置
/usr/local/nginx/sbin/nginx -s reload
再次访问前端页面:
已经可以正常联通后端啦!
8.2 远程访问前端项目(cpolar穿透)
8.2.1 配置 HTTP 隧道绑定到80端口
登录到cpolar web ui
管理端,点击左侧菜单栏的隧道管理
,展开进入隧道列表
页面,页面下默认会有 2 个隧道:
- ssh隧道,指向22端口,tcp协议
- website隧道,指向8080端口,http协议(http协议默认会生成2个公网地址,一个是http,另一个https,免去配置ssl证书的繁琐步骤)
来到侧边栏的隧道管理
>创建隧道
表单,填写隧道信息如下:
接着来到侧边栏状态
>在线隧道列表
,可以看到2条隧道信息:
8.2.2 访问公网地址验证前端是否可访问
一条协议为http的,另一条为https协议,让我们浏览器访问测试一下,以https为例:
可以正常访问,接着测试一下功能请求Api:
8.2.3 设置固定二级子域名(Pro用户)
使用cpolar
为其配置二级子域名
,该域名为固定格式域名,不会随机变化,方便远程访问前端项目。
进入官网的预留页面:https://dashboard.cpolar.com/reserved
列表中显示了一条已保留的二级子域名记录:
- 地区:显示为
China Top
。 - 二级域名:显示为
jenkinscidemo
。
注:二级域名是唯一的,每个账号都不相同,请以自己设置的二级域名保留的为主
进入侧边菜单栏的隧道管理
>隧道列表
,可以看到前面配置名为jenkins-ci-demo-80
的隧道
点击编辑
按钮进入编辑页面,修改域名类型为二级子域名
,然后填写前面配置好的子域名,点击更新按钮:
来到状态
菜单下的在线隧道列表
可以看到隧道名称为jenkins-ci-demo-80
的公网地址已经变更为二级子域名+固定域名主体及后缀
的形式了:
g)这里以https协议做访问测试:
访问成功,这样一个固定不变的域名就设置好啦!
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.cpolar.top/generic-webhook-trigger/invoke
http://JENKINS_URL/generic-webhook-trigger/invoke
接着,来到gitlab,打开前端项目,然后依次选择: Settings
>Webhooks
来到webhooks配置页面。填写相关信息:
填写完成相关信息后,点击Add webhook
,然后滚动到底部可以进行简单的测试:
回到jenkins中可以看到,配置了webhook的项目工程被gitlab推送事件触发了构建:
日志如下:
9.2 修改代码提交gitlab测试推送事件
在本地修改前端代码,进行推送:
打开jenkins可以看到,本地进行git push
操作时,gitlab向jenkins发送了推送事件,触发了jenkins的自动构建:
控制台日志如下:
查看剩余日志,可以看到脚本流水线自动化部署完成:
访问前端网页,查看效果是否更新:
好啦!现在每次向 GitLab 提交代码后,Jenkins 就会通过 Webhook 自动开始构建,无需手动操作。
10 总结
本教程完整演示了在 CentOS 7 服务器上搭建 Jenkins 自动化部署平台并通过 cpolar 内网穿透实现公网触发的全过程。
主要实现步骤包括:
- Jenkins 2.x 的安装与 Java 环境配置
- cpolar 内网穿透工具的部署与服务配置
- Jenkins 用户权限管理与角色分配
- HTTP 隧道创建与公网地址生成
- 固定二级子域名设置(Pro 用户)
- GitHub、Gitee、GitLab 多平台项目集成
- 前端 Vue 项目自动化构建与 Nginx 部署
- 后端 Maven 项目自动化构建与 Jar 包部署
- Webhook 自动触发机制配置与测试验证
这套解决方案实现了完整的 CI/CD 流程,既保障了代码的持续集成与自动化部署,又提供了便捷的远程访问环境,适用于企业内部开发、个人项目管理以及团队协作等多种场景。通过 cpolar 内网穿透,即使在没有公网 IP 的环境下,也能实现专业级的自动化部署体验。
11 项目源码
本教程使用的前后端分离演示项目已开源,展示了完整的 Jenkins CI/CD 自动化部署流程。
前端项目(Vue 3 + Vite + Element Plus):
- 开源地址:https://github.com/TanChengBin/jenkins-ci-demo-frontend
- 技术栈:Vue 3.x + Vite + Element Plus
- 功能:演示 Jenkins 前端项目自动化构建与部署
后端项目(Spring Boot + Maven):
- 开源地址:https://github.com/TanChengBin/jenkins-ci-demo
- 技术栈:Spring Boot 2.7 + Maven
- 功能:提供 RESTful API 接口,演示后端自动化构建与部署
如果本项目对您有帮助,欢迎给个 ⭐ Star 支持一下!
以上就是如何在 CentOS 7 服务器上搭建 Jenkins 自动化部署平台,并使用 cpolar 内网穿透工具实现公网触发的完整教程。cpolar 作为专业的内网穿透工具,为您的 Jenkins 服务提供了稳定、安全的公网访问方案,让自动化部署不再受网络环境限制。感谢您的观看,有任何问题欢迎留言交流。更多内网穿透解决方案,请访问:cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站