java-mall-admin/Jenkinsfile
panjunjie 632fff2f27 重启 nginx
Signed-off-by: panjunjie <46790855@qq.com>
2025-11-10 01:15:58 +08:00

131 lines
5.2 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}/
# 步骤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 '❌ 项目部署/同步失败,请排查问题后重试!'
}
}
}