Jenkins配置前后端CI/CD流水线

Sabthever

一. 当前配置

Jenkins配置前后端CI/CD流水线,这边针对的配置是:

  • 后端:Java
  • 前端:Vue
  • 代码仓库:Gitlab
  • 服务器:CentOS7

当然其他的区别不大,要根据配置文件的各个参数以及各个配置的不同去进行修改。

二. 服务器上准备脚本

1. 后端脚本

backend-start.sh

该脚本用于在 Linux 环境下,自动化地下载、启动、停止、重启和查看状态 一个 Java 应用程序(打包为 JAR 文件)。放在服务器上可以访问的位置,并且设置执行权限,供后续调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/bin/bash
#您的jar包所在目录,例如:/home/projects/
JAR_PATH=/opt/module/java/$2/
if [ -d "$JAR_PATH" ]; then
echo "目录存在"
else
echo "目录不存在"
mkdir -p $JAR_PATH/logs
fi
#您的jar包,需要包含后缀,例如:xxx.jar
JAR_NAME=$2.jar
cd ${JAR_PATH}
curl -O https://ip/${JAR_NAME}

#您所希望jar启动的端口号,设置前请先查询是否已经被占用的情况
PORT=$3
YAML_TYPE=$4
# 设置日志输出文件信息
dat1=$(date +%Y-%m-%d-%H-%M)
jar_log_name=$2_${dat1}
cd `dirname $0`
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
# pid=`ps -ef|grep -E ''$JAR_NAME'.'$PORT'|'$PORT'.*'$JAR_NAME''|grep -v grep|awk '{print $2}'`
pid=$(netstat -nlp | grep :$PORT | grep LISTEN | awk '{print $7}' | cut -d/ -f1)
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}

#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${JAR_NAME} is already running. pid=${pid} ."
else
nohup java -Xms256m -Xmx524m -Dfastjson.parser.safeMode=true -Dfile.encoding=UTF-8 -Dserver.port=${PORT} -jar ${JAR_PATH}${JAR_NAME} --spring.profiles.active=${YAML_TYPE} > ${JAR_PATH}${jar_log_name} 2>&1 &
echo "${JAR_NAME} is start success"
fi
}


#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
echo "${JAR_NAME} is stoped"
else
echo "${JAR_NAME} is not running"
fi
}


#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${JAR_NAME} is running. Pid is ${pid}"
else
echo "${JAR_NAME} is NOT running."
fi
}

#重启
restart(){
stop
sleep 1
start
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac

curl -O https://ip/${JAR_NAME}的位置需要改为相应的jar获取路径。

其他的文件路径按照实际情况进行修改。

  • 参数说明(通过命令行传入)**

运行脚本时需要传入 4 个参数,例如:

1
sh your_script.sh start myapp 8080 dev
参数位置 参数名 含义 示例
$1 操作指令 控制脚本行为:start/ stop/ restart/ status start
$2 应用名称(目录 & JAR 名称) 用作存放 JAR 的目录名,也是 JAR 文件名(不含后缀) myapp→ 对应目录 /opt/module/java/myapp/,JAR 文件名为 myapp.jar
$3 端口号(PORT) Java 应用启动时监听的端口,如 8080 8080
$4 配置类型(YAML_TYPE) 传递给 Spring Boot 的 --spring.profiles.active参数,比如 dev/ prod dev

2. 前端脚本

web-start.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
set -x
cd /data

curl -O https://ip/$2/dist.tar.gz

HTML_PATH=/opt/module/nginx/html/$1/dist
if [ -d "$HTML_PATH" ]; then
echo "目录存在"
else
echo "目录不存在"
mkdir -p $HTML_PATH
fi
# ls /opt/module/nginx/html/$1/*
ls /data
rm -rf /opt/module/nginx/html/$1/dist/*
tar -zxvf /data/dist.tar.gz -C $HTML_PATH

curl -O https://ip/$2/dist.tar.gz是存储前端项目的位置

其他的文件路径按照实际情况进行修改。

三. Jenkins配置

1. 参数化构造

1
2
3
4
5
6
7
8
9
10
11
BRANCH:
参数类型: 分支
默认值: test
PORT:
默认值: 你的port
HOST_NAME:
默认值: ip:port # 执行命令所用的服务,通常有ip白名单限制
YAML_TYPE:
默认值: test # 或者其他分支,名字看后端配置
MODULE_NAME:
默认值: 包名

2. pipline script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// 通用 Git 仓库地址,请根据实际情况替换
def GitUrl = "http://your-git-server.com/your-group/your-project.git"

pipeline {
agent {
kubernetes {
defaultContainer 'maven'
yaml '''
apiVersion: v1
kind: Pod
metadata:
labels:
app: maven-builder
spec:
imagePullSecrets:
- name: default-secret
containers:
- name: maven
image: your-registry/your-maven-image:tag // 例如:swr.cn-east-3.myhuaweicloud.com/your-maven-image
command:
- cat
tty: true
securityContext:
runAsUser: 0
privileged: true
'''
retries 3
}
}

parameters {
gitParameter branchFilter: 'origin/(.*)',
defaultValue: 'test',
name: 'BRANCH',
type: 'PT_BRANCH',
listSize: '15',
quickFilterEnabled: true
}

environment {
// 以下为示例环境变量,实际应该通过 Jenkins 参数、Secrets 或配置文件传入
// MODULE_NAME = 'your-module' // 模块名,需根据项目设置
// PORT = '8080' // 应用端口
// YAML_TYPE = 'dev' // Spring Profile
// HOST_NAME = 'http://your-api-server' // 内部服务地址,用于回调通知
}

stages {
stage('Clone Code') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: "${params.BRANCH}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'gitlab', url: GitUrl]]
])
}
}

stage('Build & Deploy JAR to OBS') {
steps {
withCredentials([file(credentialsId: 'mvn-settings', variable: 'MVN_SETTING')]) {
sh '''
mvn -DskipTests clean package -s $MVN_SETTING -U

cd ${MODULE_NAME}/target
# 获取编译出的 JAR 包名称,假设只有一个 jar
JAR_DIRECTORY=$(ls *.jar | awk -F'.jar' '{print $1}')
JAR_NAME=${JAR_DIRECTORY}.jar
echo "JAR包的名称是: $JAR_NAME"

cd ..
mkdir -p docker
cp target/$JAR_NAME docker/$JAR_NAME

# 下载 OBS 工具(示例地址,请替换为真实下载链接或提前放入镜像)
curl -O https://example.com/obsutil/obsutil_linux_amd64.tar.gz
tar -xzvf obsutil_linux_amd64.tar.gz
mv obsutil_linux_amd64_* obsutil_linux_amd64_5.5.12
chmod -R 755 obsutil_linux_amd64_5.5.12/obsutil
cp obsutil_linux_amd64_5.5.12/obsutil .

# 配置 OBS(请替换为您的真实 AK/SK 和 Endpoint)
./obsutil config -i=YOUR_AK -k=YOUR_SK -e=obs.your-region.myhuaweicloud.com

# 上传 JAR 包到 OBS(请替换为您的实际 OBS 存储路径)
./obsutil cp docker/$JAR_NAME obs://your-bucket-name/your-path/$JAR_NAME -r -f

# 可选:通知部署服务重启(请替换为您实际的接口地址)
curl --location -X POST http://your-service-api/api/v1/cmd/run \
--header 'Content-Type: application/json' \
-d '{
"cmd": "sh /data/backend-start.sh restart ${JAR_DIRECTORY} ${PORT} ${YAML_TYPE}"
}'
'''
}
}
}
}
}

最后那段,包括前面的脚本,最后打的前后端都包不一定是放在OBS里,可能是在其他文件系统或者服务器上,根据实际情况进行修改

  • 标题: Jenkins配置前后端CI/CD流水线
  • 作者: Sabthever
  • 创建于 : 2025-11-13 16:08:15
  • 更新于 : 2025-11-13 16:31:33
  • 链接: https://sabthever.cn/2025/11/13/technology/operation/Jenkins配置前后端CI-CD流水线/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。