pipeline { agent any tools { maven 'mvn3.8.8' jdk 'jdk21' } parameters { choice( name: 'ENV', choices: ['sit'], description: '部署环境' ) gitParameter( branchFilter: 'origin/(.*)', defaultValue: 'code/1118_java_re', name: 'GIT_BRANCH', type: 'PT_BRANCH_TAG', selectedValue: 'DEFAULT', sortMode: 'NONE', description: '选择代码分支: ', quickFilterEnabled: true, tagFilter: '*', listSize: "1" ) string( name: 'TARGET_JDK_HOME', defaultValue: '/data/jdk-21.0.7', description: '目标机器 JDK 路径' ) string( name: 'TARGET_HOST', defaultValue: '192.168.70.18', description: '目标服务器地址' ) string( name: 'DEPLOY_DIR', defaultValue: '/data/webapps/flymoon_admin', description: '部署目录' ) } environment { APP_NAME = 'flymoon-admin' GIT_REPO = 'http://172.24.16.20/root/fly_moon_admin.git' GIT_CREDS = 'fly_gitlab_auth' BUILD_DIR = "${WORKSPACE}" } stages { stage('01-代码检出') { steps { script { echo "==========================================" echo "Git 仓库: ${env.GIT_REPO}" echo "分支: ${params.GIT_BRANCH}" echo "==========================================" git branch: "${params.GIT_BRANCH}", credentialsId: "${env.GIT_CREDS}", url: "${env.GIT_REPO}" } } } stage('02-Maven 构建') { steps { echo "==========================================" echo "执行 Maven 打包..." echo "构建目录: ${env.BUILD_DIR}" echo "==========================================" sh """ cd ${env.BUILD_DIR}/bin/ sh package.sh """ } } stage('03-上传构建产物') { steps { echo "==========================================" echo "上传到: ${params.TARGET_HOST}:${params.DEPLOY_DIR}" echo "==========================================" sh """ scp ${env.BUILD_DIR}/target/${env.APP_NAME}.jar \ ${params.TARGET_HOST}:${params.DEPLOY_DIR}/${env.APP_NAME}-new.jar scp ${env.BUILD_DIR}/bin/start.sh \ ${params.TARGET_HOST}:${params.DEPLOY_DIR}/ scp ${env.BUILD_DIR}/bin/stop.sh \ ${params.TARGET_HOST}:${params.DEPLOY_DIR}/ """ } } stage('04-备份与替换') { steps { echo "==========================================" echo "备份旧版本并替换 JAR 包..." echo "==========================================" sh """ ssh ${params.TARGET_HOST} ' cd ${params.DEPLOY_DIR} && if [ -f ${env.APP_NAME}.jar ]; then echo "[INFO] 备份: ${env.APP_NAME}.jar -> ${env.APP_NAME}-backup.jar" cp ${env.APP_NAME}.jar ${env.APP_NAME}-backup.jar fi && echo "[INFO] 替换: ${env.APP_NAME}-new.jar -> ${env.APP_NAME}.jar" mv ${env.APP_NAME}-new.jar ${env.APP_NAME}.jar && echo "[INFO] 设置脚本执行权限" chmod +x start.sh stop.sh && echo "[SUCCESS] JAR 替换完成" ' """ } } stage('05-停止旧服务') { steps { echo "==========================================" echo "停止旧版本服务..." echo "==========================================" sh """ ssh ${params.TARGET_HOST} ' cd ${params.DEPLOY_DIR} && if [ -f stop.sh ]; then sh stop.sh || true echo "[INFO] 等待服务完全停止..." sleep 3 else echo "[WARN] 未找到 stop.sh,跳过停止步骤" fi ' """ } } stage('06-启动新服务') { steps { echo "==========================================" echo "启动新版本服务..." echo "环境: ${params.ENV}" echo "JDK: ${params.TARGET_JDK_HOME}" echo "==========================================" sh """ ssh ${params.TARGET_HOST} ' cd ${params.DEPLOY_DIR} && echo "[INFO] 执行启动命令: sh start.sh ${params.ENV} ${params.TARGET_JDK_HOME}" sh start.sh ${params.ENV} ${params.TARGET_JDK_HOME} && echo "[INFO] 等待启动完成..." sleep 5 && if [ -f app.pid ]; then PID=\$(cat app.pid) if ps -p \$PID > /dev/null 2>&1; then echo "[SUCCESS] 服务启动成功 (PID: \$PID)" else echo "[ERROR] 服务启动失败" tail -50 /root/logs/${env.APP_NAME}/app.log exit 1 fi else echo "[ERROR] PID 文件不存在" exit 1 fi ' """ } } stage('07-健康检查') { steps { echo "==========================================" echo "执行服务健康检查..." echo "==========================================" sh """ ssh ${params.TARGET_HOST} ' cd ${params.DEPLOY_DIR} && echo "[INFO] 等待服务完全启动..." sleep 10 && if [ -f app.pid ]; then PID=\$(cat app.pid) if ps -p \$PID > /dev/null 2>&1; then echo "[SUCCESS] 服务运行正常 (PID: \$PID)" echo "" # 显示进程信息 echo "==================== 进程信息 ====================" ps -p \$PID -o pid,etime,cmd --no-headers echo "" # 显示日志位置 echo "==================== 日志位置 ====================" echo "[INFO] 管道日志: /root/logs/${env.APP_NAME}/app.log" echo "[INFO] 应用日志目录: ${params.DEPLOY_DIR}/logs" echo "==================================================" else echo "[ERROR] 服务进程已退出" echo "==================== 错误日志 ====================" tail -100 /root/logs/${env.APP_NAME}/app.log echo "==================================================" exit 1 fi else echo "[ERROR] PID 文件不存在" exit 1 fi ' """ } } } post { success { echo "" echo "==================================================" echo " 部署成功 " echo "==================================================" echo "环境: ${params.ENV}" echo "服务器: ${params.TARGET_HOST}" echo "部署路径: ${params.DEPLOY_DIR}" echo "JDK 路径: ${params.TARGET_JDK_HOME}" echo "Git 分支: ${params.GIT_BRANCH}" echo "==================================================" } failure { echo "" echo "==================================================" echo " 部署失败 " echo "==================================================" echo "请检查上述日志排查问题" echo "常见问题:" echo "1. 检查目标服务器 JDK 路径是否正确" echo "2. 检查 SSH 连接是否正常" echo "3. 查看应用启动日志" echo "==================================================" } always { echo "" echo "流水线状态: ${currentBuild.currentResult}" echo "执行耗时: ${currentBuild.durationString}" } } }