106 lines
4.8 KiB
Groovy
106 lines
4.8 KiB
Groovy
pipeline {
|
||
agent any
|
||
|
||
environment {
|
||
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 {
|
||
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('同步到从节点并重启 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 "🎉 h5 项目 - 主节点部署+从节点同步+Nginx重启全部完成!" }
|
||
failure { echo "❌ h5 项目 - 部署/同步流程失败,请排查问题后重试" }
|
||
}
|
||
} |