diff --git a/Jenkinsfile b/Jenkinsfile index 5a928c9..63efff6 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,12 +1,11 @@ pipeline { agent any environment { - // 本地 Web 部署目录(根据实际环境修改,需确保 Jenkins 有读写权限) - LOCAL_WEB_ROOT = '/mnt' - // 项目部署子目录(避免与其他项目冲突) - PROJECT_DEPLOY_DIR = "${LOCAL_WEB_ROOT}/aistudy" - // 备份目录(保留历史版本,便于回滚) - BACKUP_DIR = "${LOCAL_WEB_ROOT}/aistudy-backups" + HOST_IP = '192.168.10.168' # 宿主机内网 IP(容器可访问) + HOST_USER = 'root' # 宿主机用户名 + HOST_PASS = '123456' # 宿主机密码(生产环境用密钥更安全) + HOST_TARGET = '/www/wwwroot/gitadmin.localgitserver.com/aistudy' # 宿主机目标目录 + HOST_BACKUP = '/www/wwwroot/gitadmin.localgitserver.com/aistudy-backups' # 宿主机备份目录 } // 定义工具(Node.js 需在 Jenkins 全局工具配置中提前配置) tools { @@ -16,14 +15,14 @@ pipeline { stages { stage('Checkout') { steps { - echo '检出代码...' + echo "===============================检出代码...========================================" checkout scm } } stage('Build') { steps { - echo '构建项目...' + echo '===============================构建项目...===============================' sh ''' # 验证 Node.js 环境 if ! command -v node >/dev/null 2>&1; then @@ -40,11 +39,11 @@ pipeline { npm run install:all # 构建前端(生成静态资源) - echo "构建前端..." + echo "===============================构建前端...===============================" npm run build --workspace=frontend # 构建后端(TypeScript 编译 + Prisma Client 生成) - echo "构建后端..." + echo "===============================构建后端...===============================" cd backend npm run prisma:generate npm run build @@ -55,7 +54,7 @@ pipeline { stage('Prepare Deployment Files') { steps { - echo '准备部署文件...' + echo '===============================准备部署文件...===============================' sh ''' # 创建临时构建目录(整理部署所需文件) mkdir -p build-output/frontend @@ -74,65 +73,70 @@ pipeline { ''' } } - - stage('Deploy to Local Web Server') { - steps { - echo "部署到本地 Web 目录: ${PROJECT_DEPLOY_DIR}" - sh ''' - # 创建备份目录(若不存在) - mkdir -p ${BACKUP_DIR} - - # 备份当前运行版本(保留时间戳,便于回滚) - if [ -d ${PROJECT_DEPLOY_DIR} ]; then - BACKUP_NAME="backup-$(date +%Y%m%d-%H%M%S)" - mv ${PROJECT_DEPLOY_DIR} ${BACKUP_DIR}/${BACKUP_NAME} - echo "✅ 已备份当前版本到: ${BACKUP_DIR}/${BACKUP_NAME}" - fi - - # 创建新的部署目录 - mkdir -p ${PROJECT_DEPLOY_DIR} - - # 复制前端静态资源到 Web 可访问目录 - cp -r build-output/frontend/* ${PROJECT_DEPLOY_DIR}/ - - # 复制后端文件到部署目录(后端可通过 Node 服务运行) - mkdir -p ${PROJECT_DEPLOY_DIR}/backend - cp -r build-output/backend/* ${PROJECT_DEPLOY_DIR}/backend/ - - - - # 安装后端生产依赖(避免复制 node_modules,减少体积) - echo "安装后端生产依赖..." - cd ${PROJECT_DEPLOY_DIR}/backend - npm install --production - - # 启动/重启后端服务(根据项目实际启动方式调整) - echo "启动后端服务..." - # 方式1:直接通过 node 启动(前台运行,适合简单场景) - # nohup node dist/index.js > ${PROJECT_DEPLOY_DIR}/backend.log 2>&1 & - - - # 配置目录权限(确保 Web 服务器和 Node 服务可访问) - chmod -R 755 ${PROJECT_DEPLOY_DIR} - # 若 Web 服务器用户为 www(如 Nginx/Apache),添加权限 - if id -u www >/dev/null 2>&1; then - chown -R www:www ${PROJECT_DEPLOY_DIR} - fi - - echo "✅ 部署完成!" - echo "前端访问地址: http://192.168.10.168/aistudy" - echo "后端服务目录: ${PROJECT_DEPLOY_DIR}/backend" + stage('Install SSH Client') { + steps { + echo "===============================安装SSH Client========================================" + sh ''' + # 基于 Debian 镜像的 Jenkins(官方镜像默认是 Debian) + apt-get update && apt-get install -y openssh-client ''' } } - } + stage('Deploy via SSH') { + steps { + withEnv([]) { + echo "通过 SSH 部署到宿主机: ${HOST_TARGET}" + sh ''' + # 1. 宿主机创建备份目录(通过 SSH 执行宿主机命令) + sshpass -p "${HOST_PASS}" ssh -o StrictHostKeyChecking=no ${HOST_USER}@${HOST_IP} "mkdir -p ${HOST_BACKUP}" + + # 2. 宿主机备份原有部署目录(如有) + sshpass -p "${HOST_PASS}" ssh -o StrictHostKeyChecking=no ${HOST_USER}@${HOST_IP} " + if [ -d '${HOST_TARGET}' ]; then + TIMESTAMP=$(date +%Y%m%d%H%M%S) + mv '${HOST_TARGET}' '${HOST_BACKUP}/backup_$TIMESTAMP' + fi + " + + # 3. SCP 传输构建产物到宿主机 + sshpass -p "${HOST_PASS}" scp -r -o StrictHostKeyChecking=no build-output/* ${HOST_USER}@${HOST_IP}:${HOST_TARGET}/ + + # 4. 宿主机修复目录权限(确保 Web 服务可访问) + sshpass -p "${HOST_PASS}" ssh -o StrictHostKeyChecking=no ${HOST_USER}@${HOST_IP} "chmod -R 755 ${HOST_TARGET}" + + # 安装后端生产依赖(避免复制 node_modules,减少体积) + echo "安装后端生产依赖..." + cd ${PROJECT_DEPLOY_DIR}/backend + npm install --production + + # 启动/重启后端服务(根据项目实际启动方式调整) + echo "启动后端服务..." + # 方式1:直接通过 node 启动(前台运行,适合简单场景) + # nohup node dist/index.js > ${PROJECT_DEPLOY_DIR}/backend.log 2>&1 & + + + # 配置目录权限(确保 Web 服务器和 Node 服务可访问) + chmod -R 755 ${PROJECT_DEPLOY_DIR} + # 若 Web 服务器用户为 www(如 Nginx/Apache),添加权限 + if id -u www >/dev/null 2>&1; then + chown -R www:www ${PROJECT_DEPLOY_DIR} + fi + + echo "✅ 部署完成!" + echo "前端访问地址: http://192.168.10.168/aistudy" + echo "后端服务目录: ${PROJECT_DEPLOY_DIR}/backend" + ''' + } + } + } + } post { success { echo '🎉 本地部署成功!' - echo "📁 部署目录: ${PROJECT_DEPLOY_DIR}" - echo "💾 备份目录: ${BACKUP_DIR}" + echo "📁 部署目录: ${HOST_TARGET}" + echo "💾 备份目录: ${HOST_BACKUP}" } failure { echo '❌ 部署失败!请查看构建日志排查问题'