pipeline { agent any environment { DEPLOY_DIR = '/data/nginx/www/fafamall/mchapp' // 主节点部署目录 DIST_PATH = './java-mall-app-shop-admin/dist/web' // 编译产物目录(按原脚本保留) SLAVE_IP = '172.16.0.10' // 从节点 IP SLAVE_DEPLOY_DIR = '/data/nginx/www/fafamall/mchapp' // 从节点目标目录(与主节点一致) SSH_PORT = '2203' // 从节点 SSH 端口 SSH_KEY = '/root/.ssh/id_rsa' // 主节点免密私钥路径 } stages { stage('拉取代码并验证') { steps { checkout scm sh """ [ -d "${DIST_PATH}" ] || { echo "错误:未找到 ${DIST_PATH} 文件夹"; exit 1; } echo "${DIST_PATH} 验证通过" """ } } stage('主节点部署') { steps { sh """ mkdir -p ${DEPLOY_DIR} rm -rf ${DEPLOY_DIR}/* cp -r ${DIST_PATH}/* ${DEPLOY_DIR}/ echo "主节点部署完成:${DIST_PATH} → ${DEPLOY_DIR}" """ } } stage('同步到从节点') { steps { sh """ echo "========================================" echo "开始同步主节点 → 从节点" echo "主节点目录:${DEPLOY_DIR}" echo "从节点信息:${SLAVE_IP}:${SLAVE_DEPLOY_DIR}(SSH端口:${SSH_PORT})" echo "========================================" # 步骤1:远程创建从节点目标目录(不存在则递归创建) echo "第一步:创建从节点目录..." ssh -i ${SSH_KEY} \ -p ${SSH_PORT} \ -o StrictHostKeyChecking=no \ -o ConnectTimeout=10 \ root@${SLAVE_IP} \ "mkdir -p ${SLAVE_DEPLOY_DIR}" # 检查目录创建结果 if [ \$? -ne 0 ]; then echo "错误:从节点目录创建失败!请检查:" echo "1. 主节点免密登录是否配置(私钥路径:${SSH_KEY})" echo "2. 从节点 2203 端口是否放行" echo "3. 从节点 root 权限是否正常" exit 1 fi # 步骤2:rsync 同步文件(保持主从一致) echo "第二步:执行 rsync 同步..." rsync -avz \ --delete \ --exclude="*.log" \ -e "ssh -i ${SSH_KEY} -p ${SSH_PORT} -o StrictHostKeyChecking=no" \ ${DEPLOY_DIR}/ \ root@${SLAVE_IP}:${SLAVE_DEPLOY_DIR}/ # 步骤3:远程重启从节点 Nginx(加载新代码) echo "第三步:重启从节点 Nginx 服务..." ssh -i ${SSH_KEY} \ -p ${SSH_PORT} \ -o StrictHostKeyChecking=no \ -o ConnectTimeout=10 \ root@${SLAVE_IP} \ "systemctl restart nginx" # 检查 Nginx 重启结果(容错处理:重启失败不终止流程,仅告警) if [ \$? -eq 0 ]; then echo "✅ 从节点 Nginx 重启成功!新代码已生效" else echo "⚠️ 警告:从节点 Nginx 重启失败!请手动执行以下命令排查:" echo "ssh -i ${SSH_KEY} -p ${SSH_PORT} root@${SLAVE_IP} 'systemctl status nginx'" echo "(同步已完成,仅 Nginx 重启失败,不影响代码一致性)" fi """ } } } post { success { echo "🎉 主节点部署+从节点同步全部成功!" } failure { echo "❌ 部署/同步失败,请排查问题后重试" } } }