一. 当前配置 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_PATH=/opt/module/java/$2 / if [ -d "$JAR_PATH " ]; then echo "目录存在" else echo "目录不存在" mkdir -p $JAR_PATH /logs fi JAR_NAME=$2 .jar cd ${JAR_PATH} curl -O https://ip/${JAR_NAME} 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=$(netstat -nlp | grep :$PORT | grep LISTEN | awk '{print $7}' | cut -d/ -f1) 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 -xcd /datacurl -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 /datarm -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 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里,可能是在其他文件系统或者服务器上,根据实际情况进行修改