refactor(deploy): 统一发布脚本为单一入口 scripts/deploy.sh
- 新增 scripts/deploy.sh,支持 build/deploy/rollback/status 子命令 - 删除 deploy.sh、deploy-dist.sh、scripts/deploy-static.sh、scripts/deployment/deploy-production.sh - Jenkinsfile 部署/回滚改为调用统一脚本,移除内联部署逻辑与 STATIC_DIR - 同步 README、DEPLOYMENT、docs、CLAUDE.md、setup-cicd 与 package.json 脚本
This commit is contained in:
Vendored
+8
-146
@@ -8,7 +8,6 @@ pipeline {
|
||||
SERVER_IP = '139.155.109.62'
|
||||
SERVER_USER = 'root'
|
||||
DEPLOY_ROOT = '/home/novalon/docker-app'
|
||||
STATIC_DIR = 'novalon-static'
|
||||
NGINX_CONTAINER = 'novalon-nginx-secure'
|
||||
DOMAIN = 'https://novalon.cn'
|
||||
BACKUP_RETENTION_COUNT = 3
|
||||
@@ -53,7 +52,7 @@ pipeline {
|
||||
steps {
|
||||
echo "=========================================="
|
||||
echo "🚀 Novalon Website CI/CD Pipeline"
|
||||
echo "🐳 Docker Shell Mode (参考 deploy-dist.sh)"
|
||||
echo "🐳 Docker Shell Mode (参考 scripts/deploy.sh)"
|
||||
echo "=========================================="
|
||||
|
||||
sh '''
|
||||
@@ -286,156 +285,19 @@ pipeline {
|
||||
echo "⚠️ 准备部署到生产环境: ${DOMAIN}"
|
||||
sleep(time: 3, unit: 'SECONDS')
|
||||
|
||||
sh """
|
||||
set -e
|
||||
|
||||
DIST_DIR='dist'
|
||||
|
||||
echo "=========================================="
|
||||
echo "📋 步骤 1: 检查 dist 目录"
|
||||
echo "=========================================="
|
||||
if [ ! -d "\$DIST_DIR" ]; then
|
||||
echo "❌ dist 目录不存在,请先构建"
|
||||
exit 1
|
||||
fi
|
||||
DIST_SIZE=\$(du -sh "\$DIST_DIR" | cut -f1)
|
||||
echo "✅ dist 目录大小: \$DIST_SIZE"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "📋 步骤 2: 验证 SSH 连接"
|
||||
echo "=========================================="
|
||||
if ! ssh -o ConnectTimeout=5 ${SERVER_USER}@${SERVER_IP} exit; then
|
||||
echo "❌ 无法连接到服务器 ${SERVER_IP}"
|
||||
exit 1
|
||||
fi
|
||||
echo "✅ SSH 连接验证成功"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "📋 步骤 3: 备份旧版本"
|
||||
echo "=========================================="
|
||||
ssh ${SERVER_USER}@${SERVER_IP} "
|
||||
set -e
|
||||
STATIC_PATH='${DEPLOY_ROOT}/${STATIC_DIR}'
|
||||
TIMESTAMP=\$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_PATH='${DEPLOY_ROOT}/${STATIC_DIR}_backup_\${TIMESTAMP}'
|
||||
|
||||
if [ -d \"\$STATIC_PATH\" ]; then
|
||||
echo \"📦 备份旧版本到: \$BACKUP_PATH\"
|
||||
cp -r \"\$STATIC_PATH\" \"\$BACKUP_PATH\"
|
||||
echo \"✅ 备份完成\"
|
||||
|
||||
echo \"🧹 清理旧备份(保留最近 ${BACKUP_RETENTION_COUNT} 个)...\"
|
||||
cd '${DEPLOY_ROOT}'
|
||||
ls -dt ${STATIC_DIR}_backup_* 2>/dev/null | tail -n +$((BACKUP_RETENTION_COUNT + 1)) | xargs rm -rf 2>/dev/null || true
|
||||
echo \"✅ 清理完成\"
|
||||
else
|
||||
echo \"ℹ️ 无需备份(目录不存在),首次部署\"
|
||||
fi
|
||||
"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "📋 步骤 4: 上传 dist 目录"
|
||||
echo "=========================================="
|
||||
ssh ${SERVER_USER}@${SERVER_IP} "mkdir -p '${DEPLOY_ROOT}/${STATIC_DIR}'"
|
||||
|
||||
echo "📤 使用 rsync 同步文件..."
|
||||
rsync -avz --delete "\$DIST_DIR/" ${SERVER_USER}@${SERVER_IP}:${DEPLOY_ROOT}/${STATIC_DIR}/
|
||||
|
||||
FILE_COUNT=\$(find \$DIST_DIR -type f | wc -l)
|
||||
echo "✅ 上传完成: \$FILE_COUNT 个文件, 总大小 \$DIST_SIZE"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "📋 步骤 5: 设置权限"
|
||||
echo "=========================================="
|
||||
ssh ${SERVER_USER}@${SERVER_IP} "
|
||||
set -e
|
||||
STATIC_PATH='${DEPLOY_ROOT}/${STATIC_DIR}'
|
||||
chown -R www-data:www-data \"\$STATIC_PATH\" 2>/dev/null || true
|
||||
chmod -R 755 \"\$STATIC_PATH\"
|
||||
echo \"✅ 权限设置完成\"
|
||||
"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "📋 步骤 6: 重载 Nginx"
|
||||
echo "=========================================="
|
||||
ssh ${SERVER_USER}@${SERVER_IP} "
|
||||
set -e
|
||||
if docker exec ${NGINX_CONTAINER} nginx -t; then
|
||||
docker exec ${NGINX_CONTAINER} nginx -s reload
|
||||
echo \"✅ Nginx 重载成功\"
|
||||
else
|
||||
echo \"⚠️ Nginx 配置检测失败,尝试重启容器...\"
|
||||
docker restart ${NGINX_CONTAINER}
|
||||
sleep 3
|
||||
echo \"✅ Nginx 容器已重启\"
|
||||
fi
|
||||
"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "📋 步骤 7: 验证部署"
|
||||
echo "=========================================="
|
||||
sleep 3
|
||||
|
||||
HTTP_STATUS=\$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 10 ${DOMAIN})
|
||||
if [ "\$HTTP_STATUS" = "200" ]; then
|
||||
echo "✅ 主页访问正常 (HTTP \$HTTP_STATUS)"
|
||||
else
|
||||
echo "❌ 主页返回异常状态码: \$HTTP_STATUS"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "🔍 检查关键页面..."
|
||||
for PAGE in "/contact" "/about" "/products" "/services"; do
|
||||
STATUS=\$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 5 \${DOMAIN}\$PAGE)
|
||||
if [ "\$STATUS" = "200" ]; then
|
||||
echo " ✅ \$PAGE (\$STATUS)"
|
||||
else
|
||||
echo " ⚠️ \$PAGE (\$STATUS) - 需要关注"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "🎉 部署成功!"
|
||||
echo "📋 访问地址:"
|
||||
echo " HTTP: http://${SERVER_IP}"
|
||||
echo " HTTPS: https://novalon.cn"
|
||||
"""
|
||||
sh '''
|
||||
# 统一发布脚本(单一事实源: scripts/deploy.sh)
|
||||
./scripts/deploy.sh deploy --skip-build
|
||||
'''
|
||||
}
|
||||
post {
|
||||
failure {
|
||||
echo "❌ 部署失败!正在执行自动回滚..."
|
||||
|
||||
script {
|
||||
try {
|
||||
sh """
|
||||
ssh ${SERVER_USER}@${SERVER_IP} '
|
||||
set -e
|
||||
LATEST_BACKUP=\$(ls -dt ${DEPLOY_ROOT}/${STATIC_DIR}_backup_* 2>/dev/null | head -1)
|
||||
|
||||
if [ -n "\$LATEST_BACKUP" ]; then
|
||||
echo "🔄 回滚到: \$LATEST_BACKUP"
|
||||
rm -rf "${DEPLOY_ROOT}/${STATIC_DIR}"
|
||||
cp -r "\$LATEST_BACKUP" "${DEPLOY_ROOT}/${STATIC_DIR}"
|
||||
|
||||
if docker exec ${NGINX_CONTAINER} nginx -t; then
|
||||
docker exec ${NGINX_CONTAINER} nginx -s reload
|
||||
else
|
||||
docker restart ${NGINX_CONTAINER}
|
||||
fi
|
||||
echo "✅ 回滚完成"
|
||||
else
|
||||
echo "❌ 未找到可用备份!需要手动介入"
|
||||
exit 1
|
||||
fi
|
||||
'
|
||||
"""
|
||||
sh '''
|
||||
./scripts/deploy.sh rollback
|
||||
'''
|
||||
} catch (Exception e) {
|
||||
echo "❌ 自动回滚失败: ${e.getMessage()}"
|
||||
echo "🚨 需要立即手动介入!"
|
||||
|
||||
Reference in New Issue
Block a user