Jenkins 微服务自动化构建部署方案
Jenkins 微服务自动化构建部署方案(最终版)
一、项目背景
项目类型:Maven 多模块微服务项目
构建机器:Windows
部署机器:Linux
构建要求:
支持单个 / 多个 / 全量服务指定构建
只构建目标服务及其依赖,不打包无关模块
强制跳过单元测试,提升构建速度
杜绝 Jenkins 二次全量打包问题
构建产物可正常启动运行
二、服务映射配置
- 服务名称与模块路径
表格
务名称 服务模块路径 生成 JAR 包名称
ateway ./yudao-gateway yudao-gateway.jar
ystem ./yudao-module-system/yudao-module-system-server yudao-module-system-server.jar
nfra ./yudao-module-infra/yudao-module-infra-server yudao-module-infra-server.jar
pm ./yudao-module-bpm/yudao-module-bpm-server yudao-module-bpm-server.jar - 服务器部署目录
plaintext
/root/usr/local/jar/yudaocloud
三、Jenkins 关键配置(必看) - 构建参数配置
参数类型:String Parameter
Name:MODULES
Default Value:all
描述:
plaintext
all = 构建全部服务
单个服务:gateway/system/infra/bpm
多个服务:gateway,system - 构建核心配置(解决二次打包)
Root POM:pom.xml
Goals and options:help:help(关键:避免 Jenkins 自动执行二次全量构建)
四、完整构建脚本(Windows 执行)
Pre Steps 脚本(直接复制使用)
batch
@echo off
setlocal enabledelayedexpansion
:: ===================== 【微服务映射配置】 =====================
set "ALL_SERVICES=gateway,system,infra,bpm"
set "MAP_gateway=./yudao-gateway"
set "MAP_system=./yudao-module-system/yudao-module-system-server"
set "MAP_infra=./yudao-module-infra/yudao-module-infra-server"
set "MAP_bpm=./yudao-module-bpm/yudao-module-bpm-server"
:: ===================== 处理构建参数 =====================
if "%MODULES%"=="all" (
set "SELECTED=!ALL_SERVICES!"
) else (
set "SELECTED=!MODULES!"
)
:: ===================== 自动拼接 Maven 构建路径 =====================
set "MODULE_PATHS="
for %%i in ("%SELECTED:,=" "%") do (
set "s=%%~i"
call set "p=%%MAP_!s!%%"
if defined p (
if not "!MODULE_PATHS!"=="" set "MODULE_PATHS=!MODULE_PATHS!,"
set "MODULE_PATHS=!MODULE_PATHS!!p!"
)
)
:: ===================== 执行 Maven 构建 =====================
cd /d "%WORKSPACE%"
echo ========================================================
echo 构建服务:!SELECTED!
echo 构建模块:!MODULE_PATHS!
echo ========================================================
:: 核心构建命令(跳过测试 + 构建指定服务 + 自动构建依赖 + 保证可启动)
mvn -Dmaven.test.skip=true clean package -pl !MODULE_PATHS! -am
:: ===================== 构建结果判断 =====================
if %errorlevel% neq 0 (
echo ============= 构建失败 =============
exit /b 1
)
echo ============= 构建成功 =============
五、Linux 服务部署脚本
- SSH 配置
Source files:*/target/.jar
Remote directory:/root/usr/local/jar/yudaocloud - 执行命令(部署脚本)
bash
运行
!/bin/bash
set -e
===================== 部署配置 =====================
DEPLOY_DIR="/root/usr/local/jar/yudaocloud"
JAR_gateway="yudao-gateway.jar"
JAR_system="yudao-module-system-server.jar"
JAR_infra="yudao-module-infra-server.jar"
JAR_bpm="yudao-module-bpm-server.jar"
mkdir -p ${DEPLOY_DIR}
cd ${DEPLOY_DIR}
服务部署函数
deploy_service() {
service_name=$1
jar_name_var="JAR_${service_name}"
jar_name=${!jar_name_var}
if [ -z "${jar_name}" ]; then
echo "⚠️ 未知服务:${service_name}"
return
fi
echo -e "\n="
echo "🚀 开始部署:${service_name} → ${jar_name}"
echo "="
停止旧进程
pid=$(ps -ef | grep "${jar_name}" | grep -v grep | awk '{print $2}')
if [ -n "${pid}" ]; then
echo "🛑 停止旧进程:${pid}"
kill -9 ${pid} > /dev/null 2>&1
sleep 2
fi
启动新服务
echo "🔛 启动服务"
nohup java -jar "${jar_name}" > /dev/null 2>&1 &
sleep 3
echo "✅ ${service_name} 部署成功!"
}
批量部署
echo "📋 待部署服务:${MODULES}"
if [ "${MODULES}" = "all" ]; then
for s in gateway system infra bpm; do
deploy_service ${s}
done
else
IFS=',' read -ra LIST <<< "${MODULES}"
for s in "${LIST[@]}"; do
deploy_service ${s}
done
fi
echo -e "\n🎉 全部服务部署完成!"
六、核心命令说明(关键知识点)
- Maven 构建命令
bash
运行
mvn -Dmaven.test.skip=true clean package -pl !MODULE_PATHS! -am
-Dmaven.test.skip=true:强制跳过单元测试(Windows 环境必须放在最前面)
clean package:清理并打包
-pl:指定构建模块
-am:自动构建依赖模块(保证 jar 包可正常启动) - 二次打包解决
Jenkins Maven 项目默认会自动执行 install
解决方案:Goals and options 设置为 help:help
作用:仅打印帮助信息,不执行任何编译、打包操作
七、使用说明 - 构建全部服务
参数:all - 构建单个服务
参数:gateway - 构建多个服务
参数:gateway,system
八、常见问题与解决方案 - 构建时执行单元测试
原因:-Dmaven.test.skip=true 位置错误
解决:必须放在命令最开头 - 只打指定服务,但无法启动
原因:缺少依赖模块
解决:必须保留 -am 参数 - Jenkins 二次全量打包
原因:Maven 项目默认执行 install
解决:Goals and options 填写 help:help - Windows 中文路径乱码导致编译失败
解决:项目路径必须全部使用英文,无中文、无空格
九、最终效果
✅ 支持自定义服务构建
✅ 跳过测试,构建速度提升 50%+
✅ 无二次全量打包
✅ 构建产物 100% 可正常启动
✅ 自动停止旧进程 + 启动新服务
✅ 适用于生产环境自动化部署

浙公网安备 33010602011771号