diff --git a/Jenkinsfile b/Jenkinsfile index fd9d6e9..07534f3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,8 +2,12 @@ pipeline { agent any environment { - DEPLOY_DIR = '/data/nginx/www/fafamall/h5' - DIST_PATH = 'dist' + DEPLOY_DIR = '/data/nginx/www/fafamall/h5' // 主节点部署目录(保留原配置) + DIST_PATH = 'dist' // 编译产物目录(保留原配置) + SLAVE_IP = '172.16.0.10' // 从节点 IP(与之前一致) + SLAVE_DEPLOY_DIR = '/data/nginx/www/fafamall/h5' // 从节点目标目录(与主节点一致) + SSH_PORT = '2203' // 从节点 SSH 端口(固定配置) + SSH_KEY = '/root/.ssh/id_rsa' // 主节点免密私钥路径(固定配置) } stages { @@ -17,20 +21,86 @@ pipeline { } } - stage('部署') { + stage('主节点部署') { steps { sh """ mkdir -p ${DEPLOY_DIR} rm -rf ${DEPLOY_DIR}/* cp -r ${DIST_PATH}/* ${DEPLOY_DIR}/ - echo "部署完成:${DIST_PATH} → ${DEPLOY_DIR}" + echo "主节点部署完成:${DIST_PATH} → ${DEPLOY_DIR}" + """ + } + } + + stage('同步到从节点并重启 Nginx') { + steps { + sh """ + echo "========================================" + echo "开始同步主节点 → 从节点(h5 项目)+ 重启 Nginx" + 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" \ + --exclude="*.tmp" \ + -e "ssh -i ${SSH_KEY} -p ${SSH_PORT} -o StrictHostKeyChecking=no" \ + ${DEPLOY_DIR}/ \ + root@${SLAVE_IP}:${SLAVE_DEPLOY_DIR}/ + + # 检查同步结果,失败则终止 + if [ \$? -eq 0 ]; then + echo "✅ 从节点同步成功!主从 h5 目录完全一致" + else + echo "❌ 从节点同步失败!请查看 Jenkins 控制台日志详情" + exit 1 + fi + + # 步骤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 "❌ 部署失败" } + success { echo "🎉 h5 项目 - 主节点部署+从节点同步+Nginx重启全部完成!" } + failure { echo "❌ h5 项目 - 部署/同步流程失败,请排查问题后重试" } } } \ No newline at end of file