云服务器 + Jenkins 实现项目自动化部署与上线
目录
1、 为 Jenkins 的使用做提前准备
1.1 在服务器中下载 Java 与 Maven
1.2 在服务器中下载 Jenkins
1.3 更改 Jenkins 的访问端口(可选)
1.4 安装 Jenkins 中的插件
2、Jenkins 中的系统配置与全局工具配置
2.1 全局工具配置
2.2 系统配置
2.3 添加凭据
3、【后端】基于<内网开发环境>进行部署
4、【后端】基于<外网开发环境>进行部署
5、【前端】基于<内网开发环境>进行部署
6、【前端】基于<外网开发环境>进行部署
7、关于 Nginx 的配置
7.1 Nginx <内网环境> 相关配置
7.2 Nginx <外网环境> 相关配置
7.3 端口放开注意事项(可选)

前言:
⭐ Docker 的下载安装与代理对象的配置,在我之前的博客中有记录:
基于 Docker 部署 Java 项目(通俗易懂)_docker部署java项目-CSDN博客https://blog.csdn.net/qq_66862911/article/details/145116453?spm=1001.2014.3001.5501
1、 为 Jenkins 的使用做提前准备
1.1 在服务器中下载 Java 与 Maven
Jenkins 需要 Java 环境才能运行,所以首先需要确保在服务器中安装了JDK
更新包索引
sudo apt update
安装 OpenJDK 21(根据项目选择版本)
sudo apt install -y openjdk-21-jdk
验证安装
java -version
还需下载 Maven,后续的 Jenkins 的全局工具配置中需要进行填写 Maven 的 MAVEN_HOME,参考下载地址如下(按自己的版本来):
Linux - 安装 maven(详细教程)_linux安装maven-CSDN博客https://blog.csdn.net/xhmico/article/details/136450882
1.2 在服务器中下载 Jenkins
添加 Jenkins 官方 GPG 密钥(为了确保下载的软件包是可信的)
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
添加 Jenkins APT 仓库
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
再次更新包索引并安装 Jenkins
sudo apt update
sudo apt install -y jenkins
启动并启用 Jenkins 服务
sudo systemctl enable jenkins
sudo systemctl start jenkins
检查服务状态(看到 active (running) 说明启动成功)
sudo systemctl status jenkins
最后,访问 服务器IP + 8080端口(默认8080),即可进入 Jenkins 的UI界面
1.3 更改 Jenkins 的访问端口(可选)
编辑 Jenkins 的配置文件,以下是对应的目录位置:
/etc/default/jenkins
(通常适用于 Debian/Ubuntu)
/etc/sysconfig/jenkins
(通常适用于 CentOS/RHEL)
找到 HTTP_PORT
这一行,修改为你需要更改的端口(一般需要 root 用户才能进行操作),并进行重启,若端口没有切换成功,则表示还需进入 /etc/systemd/system/kenkins.service 修改 .service 文件中 Environment="JENKINS_PORT=<你想设置的端口>" 配置
以上步骤都走了一遍后,执行以下命令重载与重启:
# 1. 通知 systemd 重新加载所有服务配置文件
sudo systemctl daemon-reload
# 2. 重启服务,使用新的配置
sudo systemctl restart jenkins
1.4 安装 Jenkins 中的插件
根据自己的项目安装所需要的插件,基础的前后端分离项目按以下网址进行安装即可:
Jenkins常用插件安装及全局配置_jenkins 插件-CSDN博客https://blog.csdn.net/qq_33090897/article/details/137064670
2、Jenkins 中的系统配置与全局工具配置
2.1 全局工具配置
这里是 Maven 配置 与 安装配置,第一个图片默认就好,第二个图片填入安装的 Maven 环境变量并取别名
这里是 JDK 配置,将之前安装的 JAVA 环境变量 JAVA_HOME 填入,然后取别名,当然也可以使用自动安装
这里是 Git 配置,默认并选自动安装就好
这里是 Node.Js 安装的配置,根据项目前端情况来选择对应的版本
2.2 系统配置
这里是 Maven 项目配置,我目前只做了以下修改,其他的默认
这里是 Jenkins位置 的配置,填写 服务器IP + 目前Jenkins的端口
这里是 时间防记 的配置,我不记得是不是默认的了,反正放这里
这里是 SSH服务器 的配置,这里主要是写入你想要连接到的另一台服务器的信息,这里的用户名尽量填普通用户,而非 root用户
一般来说,都需要先在服务器中进行禁用 root 用户登录(即禁止 ssh 连接),避免不必要的外部风险,以下是对应的操作步骤:
# 在 root 用户下编辑以下文件
vim /etc/ssh/sshd_config# 找到并修改 PermitRootLogin 选项,将其修改为 no
#PermitRootLogin yes
这里是 服务器组中心 的配置,为之后与服务器列表关联做准备
这里是 服务器列表 的配置,以便之后部署配置的时候,可以关联选择对应的服务器
2.3 添加凭据
根据自己的项目需要,进行添加凭据,比如添加gitlib或者服务器的账号与密码,以便后续可以根据凭据进行登录访问,看作一个通行证
3、【后端】基于<内网开发环境>进行部署
首先 Java 项目新建的话,建议选择第二个,即 “构建maven项目”
这里是 策略 的配置,按情况而定
这里是 JDK 的配置,根据之前全局工具配置来
这里是 源码管理 的配置,需输入当前部署项目的 git 地址与凭证,以用于连接
这里是 触发器 的配置,我这里一般是选择这两个
这里是 前置步骤 的配置,我这里只是通过shell打印日志,表示当前项目构建已经开始
这里是 pom 的配置,这里目标与选项中填入对应的 maven 命令进行操作 pom 文件
这里是 发布步骤 的配置,建议选择第一个
其中第一个是添加 "执行shell" 选项打印日志,以表示脚本启动成功
第二个是添加 "远程执行命令" 选项,以在服务器中执行命令进行部署
以下是以上命令中 jar_copy.sh 文件中的内容,命令中的 jenkins 的 workspace 工作空间一般是固定位置,从 git 中拉取项目的时候,就会存在于 jenkins 的工作空间中
小知识:对应项目目录的命令是根据 jenkins 中你创建的对应项目来的,比如以下这里是 workspace/exam/ 那么 jenkins 中构建项目的命令肯定就为 exam
#!/bin/bash
#远程执行nohup启动时环境变量生效
source /etc/profile# 初始化变量
path=/home/exam/data/ai-trainer-exam#将jar包从jenkins工作空间中移动到指定路径下
for var in eureka gateway auth system data
docp /var/lib/jenkins/workspace/exam/$var/target/$var*.jar $path/$var.jar
done
需要注意的是,需要提前将项目中的 dockerfile 文件与 docker compose 文件拷贝到当前目录中,以便于之后 compose 文件的构建
建议:
在当前目录下,建议自己新建一个 logs 目录(或基于配置命令自动建),然后修改日志的权限
修改日志权限等操作如以下命令所示:
# 将 logs/ 目录的所有者设为 ubuntu,组设为 root
sudo chown -R ubuntu:root logs/# 设置权限:所有者可读写执行,组用户和其他用户只读可执行(可进入目录)
sudo chmod -R 755 logs/
以上步骤完成过后,进行保存并进行构建项目,像以下样式表示当前项目构建成功:
4、【后端】基于<外网开发环境>进行部署
前言:
这里仅仅只是 发布步骤 的地方有部分改变,其他模块与上面的一致
这里是 发布步骤 的其一配置,添加 “远程执行命令” 选项,这里是一般为研发内网的服务器IP,目的是将内网开发环境下的项目 jar包 进行上传
以上命令中的 upload2huawei.sh 文件如以下显示:
#!/bin/bash
source /etc/profile
source ~/.bash_profile# 分别遍历复制 jenkins工作空间 中对应项目的 jar包 到当前目录中
for jarFile in eureka gateway auth system data
do\cp /home/jenkins21/workspace/AiTrainerExam-server-huawei/${jarFile}/target/${jarFile}*.jar ./${jarFile}.jar
done# 基于 华为OBS 将当前项目中的 jar包 上传到华为云中的对应桶中
./../../obsutil_linux_amd64_5.5.12/obsutil sync ./ obs://ht-resource/ai-trainer-exam -include=*.jar
rm -rf *.jar
其中对应 obsutil 的安装与配置参考分别参考官网中的 “下载与安装obsutil” 与 快速入门中的“初始化配置”,地址如下:
下载和安装obsutil_obsutil_工具指南_对象存储服务 OBS-华为云https://support.huaweicloud.com/utiltg-obs/obs_11_0003.html其中的 AK 与 SK 根据以下地址进行获取,在 “新增访问密钥” 后,华为云会给一个文件,内部有对应的 AK 与 SK 的信息;若 “新增访问密钥” 上限后,需选择之前的密钥进行停用,然后才能重新进行获取新的密钥信息
访问密钥_用户指南_我的凭证-华为云https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
这里是 发布步骤 的其二配置,再次添加 “远程执行命令” 选项,这里为需要部署到的云服务器IP,目的是从 OBS 中将之前内网环境上传的 jar包 复制到云服务器的对应项目目录中,然后执行 exp 文件
前提:
同样需要将当前部署项目的 Dockerfile 与 Docker compose 文件拷贝到当前外网服务器的对应项目目录中
以下是以上配置中 shell 命令中的 huawei-test.exp 文件,主要是用于重启 compose 服务
#!/usr/bin/expectset timeout 60# 这里是切换到了 root 用户,密码固然也是 root 用户的
spawn sudo su -
expect "*password*"
send "123\r"
expect "#*"
send "sudo docker compose -f /home/exam/data/exam-huawei/docker-compose-dev.yml down --rmi all\r"
expect "#*"
send "sudo docker compose -f /home/exam/data/exam-huawei/docker-compose-dev.yml up -d --build\r"# 以下三行的命令,是为了解决执行 compose 文件时,由于执行顺序的问题而导致的项目在服务中没有正确的进行部署,而选择性的进行部分项目模块“镜像”的延时重新启动(可选)
#expect "#*"
#after 15000
#send "sudo docker restart exam-security exam-gateway exam-system exam-data\r"send "exit\r"
expect eof
同样,最后需在云服务器中的安全组中进行添加,将后端项目的 gateway 端口 与 映射的端口 进行放开,允许所有地址访问(0.0.0.0)
以上步骤完成过后,进行保存并进行构建项目,像以下样式表示当前项目构建成功:
5、【前端】基于<内网开发环境>进行部署
前言:
与后端项目不同的是,前端项目构建的时候,选择的是第一个选项 “自由式项目” 进行构建
关于前端项目的配置,以下只展示相比后端项目配置 所没有的 或 发生变动的 主要配置,基础配置不再赘述(如 Git 地址需更换、JDK 前端项目不必配置之类的)
这里是 环境 的配置,根据项目实际所需进行选择
这里是 构建步骤 的其一配置,添加 “执行shell” 选项,目的是将前端项目进行构建
这里是 构建步骤 的其二配置,添加 “远程执行脚本” 选项,目的是将旧的dist文件删除,替换为新的dist文件
以上步骤完成过后,进行保存并进行构建项目,像以下样式表示当前项目构建成功:
6、【前端】基于<外网开发环境>进行部署
前言:
跟上面内网开发环境一样,是选择的是第一个选项 “自由式项目” 进行构建,而且除了构建步骤的地方有变动,其他地方都跟上面配置一致
这里是 构建步骤 的其一配置,添加 “执行shell” 选项,这里是使用“天翼云”专用配置构建前端项目(build:CTyun),并将生成的静态资源打包(tar dist),以便部署到天翼云的生产环境(具体部署到哪里根据自己的情况来)
这里是 构建步骤 的其二配置,添加 “通过 SSH 发送文件或执行命令” 选项
目的是将上面其一步骤压缩到 /home/用户(./ 默认为家目录) 目录下的 dist.tar 文件,使用 shell 命令复制到指定的 ssh服务器 中对应的目录下,并解压缩与更改名字(ai-trainer-exam)
以上步骤完成过后,进行保存并进行构建项目,像以下样式表示当前项目构建成功:
7、关于 Nginx 的配置
这个 nginx 一般都是用于前端项目的,并做接口的映射,以便外部公网的访问
7.1 Nginx <内网环境> 相关配置
可以看到以下 root /usr/local/nginx/web/AiTrainerExam-front-dev; 这一行,是与 前端内网环境下的dist 文件目录 相对应的,然后监听到 9300 端口,则之后可以使用 内网服务器IP + 9300 进行访问项目(前提是需根据 nginx 配置在云服务器中放开 映射端口9300 或/与 项目gateway端口,由于是内网访问,建议只放开内网IP)
# ai-trainer-examserver {listen 9300;server_name localhost;location / {proxy_connect_timeout 600;proxy_read_timeout 600;root /usr/local/nginx/web/AiTrainerExam-front-dev;index index.html index.htm;try_files $uri $uri/ /index.html;error_page 405 =200 http://$host$request_uri;}}
7.2 Nginx <外网环境> 相关配置
由于是需要在外网能够进行访问,所以 nginx 的架构需要足够安全与专业,参考以下地址进行配置与生成:
NGINX 网络图 |数字海洋 --- NGINXConfig | DigitalOceanhttps://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN
设置好后,点击下载配置,会下载一个 zip 文件,内部的文件结构大致是这样:
生成的 nginx.conf 配置大致如下所示:(这里是总体配置,具体项目的 .conf 文件需分别配置)
# Generated by nginxconfig.iouser root;
pid /usr/local/nginx/logs/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 65535;# Load modules
include /usr/local/nginx/conf/modules-enabled/*.conf;events {multi_accept on;worker_connections 65535;
}http {charset utf-8;sendfile on;tcp_nopush on;tcp_nodelay on;server_tokens off;log_not_found off;types_hash_max_size 2048;types_hash_bucket_size 64;client_max_body_size 16M;# MIMEinclude mime.types;default_type application/octet-stream;# Loggingaccess_log /usr/local/nginx/logs/access.log;error_log /usr/local/nginx/logs/error.log warn;# SSLssl_session_timeout 1d;ssl_session_cache shared:SSL:10m;ssl_session_tickets off;# Diffie-Hellman parameter for DHE ciphersuitesssl_dhparam /usr/local/nginx/conf/dhparam.pem;# Mozilla Intermediate configurationssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;# OCSP Staplingssl_stapling on;ssl_stapling_verify on;# Connection header for WebSocket reverse proxymap $http_upgrade $connection_upgrade {default upgrade;"" close;}map $remote_addr $proxy_forwarded_elem {# IPv4 addresses can be sent as-is~^[0-9.]+$ "for=$remote_addr";# IPv6 addresses need to be bracketed and quoted~^[0-9A-Fa-f:.]+$ "for=\"[$remote_addr]\"";# Unix domain socket names cannot be represented in RFC 7239 syntaxdefault "for=unknown";}map $http_forwarded $proxy_add_forwarded {# If the incoming Forwarded header is syntactically valid, append to it"~^(,[ \\t]*)*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*([ \\t]*,([ \\t]*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*)?)*$" "$http_forwarded, $proxy_forwarded_elem";# Otherwise, replace itdefault "$proxy_forwarded_elem";}# Load configsinclude /usr/local/nginx/conf/conf.d/*.conf;include /usr/local/nginx/conf/sites-enabled/*;
}
别看以上生成的内容这么多,其实主要就是看最后两行,对应项目的 nginx.conf 文件就是在其对应的目录下,这里我只使用到了第二个目录,即 /usr/local/nginx/conf/sites-enabled/,以下就是这个目录中创建的专属于当前 exam 项目的 .conf 文件:
以下是当前 exam 项目 .conf 的配置信息,同样, /usr/local/nginx/web/ai-trainer-exam 这个目录下对应的就是前端项目的 dist 静态文件,然后进行端口映射,这样就能以 外网IP + 9300端口 进行访问(前提是需根据 nginx 配置在云服务器中放开 映射端口9300 或/与 项目gateway端口,由于是外网访问,可直接放开IP 0.0.0.0)
server {listen 9300;listen [::]:9300;server_name localhost;root /usr/local/nginx/web/ai-trainer-exam;# securityinclude nginxconfig.io/security.conf;# loggingaccess_log /usr/local/nginx/logs/ai-trainer-exam.9300.access.log;error_log /usr/local/nginx/logs/ai-trainer-exam.9300.error.log warn;# index.html fallbacklocation / {try_files $uri $uri/ /index.html;}# additional configinclude nginxconfig.io/general.conf;
}
7.3 端口放开注意事项(可选)
若不想直接在云服务器中放开 gateway 端口,而是只放开映射的端口,可以在对应服务器中的 nginx 中自行配置
同样,/usr/local/nginx/web/ai-trainer-exam; 这一行对应前端中的 dist 静态文件位置,然后映射访问端口 9300,并在云服务器的安全组中进行放开,最后自行配置内部反向代理 gateway 9311 端口即可
server {listen 9300;# 这里写为 _ 更适合公网访问场景server_name _;# 1. 前端页面:返回 dist 文件location / {root /usr/local/nginx/web/ai-trainer-exam;index index.html;try_files $uri $uri/ /index.html;}# 2. API 内部反向代理:关键!location /api/ {# 使前端项目能够访问 gateway 端口proxy_pass http://localhost:9311/; proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}