pipeline { agent any environment { DEPLOY_DIR = '/data/nginx/www/fafamall/website' // 主节点部署目录 DIST_PATH = 'dist' // 编译产物目录 SLAVE_IP = '172.16.0.10' // 从节点 IP SLAVE_DEPLOY_DIR = '/data/nginx/www/fafamall/website' // 从节点目标目录(与主节点一致) SSH_PORT = '2203' // 从节点 SSH 端口 SSH_KEY = '/root/.ssh/id_rsa' // Jenkins 服务器(主节点)免密私钥路径 } 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 """ # 核心逻辑:1. 远程创建从节点目录(不存在则创建) 2. rsync 同步文件 echo "开始同步主节点 ${DEPLOY_DIR} → 从节点 ${SLAVE_IP}:${SLAVE_DEPLOY_DIR}" # 步骤1:远程创建从节点目标目录(-p 递归创建父目录,已存在不报错) ssh -i ${SSH_KEY} -p ${SSH_PORT} -o StrictHostKeyChecking=no root@${SLAVE_IP} "mkdir -p ${SLAVE_DEPLOY_DIR}" if [ \$? -ne 0 ]; then echo "错误:从节点目录创建失败,请检查 SSH 免密/端口/权限" exit 1 fi # 步骤2:rsync 同步文件(保持主从一致) rsync -avz --delete \ -e "ssh -i ${SSH_KEY} -p ${SSH_PORT} -o StrictHostKeyChecking=no" \ ${DEPLOY_DIR}/ \ root@${SLAVE_IP}:${SLAVE_DEPLOY_DIR}/ # 验证同步结果 if [ \$? -eq 0 ]; then echo "✅ 从节点同步完成!主从目录已一致" else echo "❌ 从节点同步失败,请查看 Jenkins 控制台日志" exit 1 fi """ } } } post { success { echo "🎉 整体部署+同步流程全部成功" } failure { echo "❌ 部署/同步流程失败,请排查问题" } } }