java-mall-admin/Jenkinsfile
panjunjie e8b7e24e85 增加从节点部署文件同步逻辑
增加从节点部署文件同步逻辑。

Signed-off-by: panjunjie <46790855@qq.com>
2025-11-10 01:08:24 +08:00

121 lines
4.6 KiB
Groovy
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

pipeline {
agent any
tools {
nodejs 'NodeJS16'
}
environment {
DEPLOY_DIR = '/data/nginx/www/fafamall/demo' // 主节点部署目录
SLAVE_IP = '172.16.0.10' // 从节点 IP
SLAVE_DEPLOY_DIR = '/data/nginx/www/fafamall/demo' // 从节点目标目录(与主节点一致)
SSH_PORT = '2203' // 从节点 SSH 端口
SSH_KEY = '/root/.ssh/id_rsa' // Jenkins 服务器(主节点)免密私钥路径
DIST_PATH = 'dist' // 编译产物目录(与 npm run build 输出目录一致)
}
stages {
stage('拉取代码') {
steps {
checkout scm
}
}
stage('安装依赖') {
steps {
sh '''
echo "清理旧依赖..."
rm -rf node_modules package-lock.json
npm cache clean --force
echo "设置国内镜像源加速..."
npm config set registry https://registry.npmmirror.com
# 安装其他依赖
npm install
'''
}
}
stage('构建项目') {
steps {
sh 'npm run build'
// 验证构建产物是否存在(避免空同步)
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 "========================================"
echo "开始同步主节点 → 从节点"
echo "主节点目录:${DEPLOY_DIR}"
echo "从节点信息:${SLAVE_IP}:${SLAVE_DEPLOY_DIR}SSH端口${SSH_PORT}"
echo "========================================"
# 步骤1远程创建从节点目标目录-p 递归创建,已存在不报错)
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. 从节点 SSH 端口 ${SSH_PORT} 是否放行"
echo "3. 从节点 root 权限是否足够"
exit 1
fi
# 步骤2rsync 同步文件(核心同步逻辑)
echo "第二步:开始 rsync 同步文件..."
rsync -avz \
--delete \
--exclude="*.log" \
--exclude="node_modules" \
-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 '❌ 项目部署/同步失败,请排查问题后重试!'
}
}
}