Windows环境React应用CI/CD:Jenkins脚本与执行流程咨询
React+Express 应用 Jenkins CI/CD 流水线实现方案
针对你在Windows环境下搭建React+Express应用CI/CD的需求,结合你提供的初始脚本,下面给出优化后的流水线实现逻辑及执行流程说明:
现有脚本的核心问题
- 路径硬编码:直接写死Jenkins工作区路径,换项目或工作区后会失效,应该用Jenkins内置的
${WORKSPACE}变量 - 无变更检测:不管client/server是否有代码变更,都会执行全量构建部署,浪费资源
- 客户端部署逻辑有误:React构建后应该把
build目录(或dist,取决于你的React配置)的静态文件部署到Nginx的静态资源目录,而不是复制整个client目录 - PM2操作路径问题:执行
pm2 start/reload时需要确保在server目录下,或者指定server.js的绝对路径,否则可能找不到文件
优化后的Jenkins流水线脚本
pipeline { agent any environment { // 定义全局路径变量,方便维护 WORKSPACE_PATH = "${WORKSPACE}" DEPLOY_BASE_PATH = "C:\\APH_template" NGINX_STATIC_PATH = "C:\\nginx\\html\\react-app" // 根据你的Nginx配置调整 } stages { stage('Checkout Code') { steps { checkout scm } } // 检测变更,判断需要执行哪些步骤 stage('Detect Changes') { steps { script { // 检测client目录是否有变更 env.CLIENT_CHANGED = false env.SERVER_CHANGED = false def changeLog = currentBuild.changeSets for (set in changeLog) { for (entry in set.items) { for (file in entry.affectedFiles) { if (file.path.startsWith('client/')) { env.CLIENT_CHANGED = true } if (file.path.startsWith('server/')) { env.SERVER_CHANGED = true } } } } } } } // 构建并部署客户端(仅当client有变更时执行) stage('Build & Deploy Client') { when { expression { env.CLIENT_CHANGED == true } } steps { dir("${WORKSPACE_PATH}\\client") { powershell 'npm install --production' // 生产环境安装依赖,跳过devDependencies powershell 'npm run build' } // 复制构建后的静态文件到Nginx目录 powershell "Copy-Item -Path '${WORKSPACE_PATH}\\client\\build\\*' -Destination '${NGINX_STATIC_PATH}' -Recurse -Force" } } // 构建并部署服务端(仅当server有变更时执行) stage('Build & Deploy Server') { when { expression { env.SERVER_CHANGED == true } } steps { dir("${WORKSPACE_PATH}\\server") { powershell 'npm install --production' // 复制server文件到部署目录 powershell "Copy-Item -Path '.\\*' -Destination '${DEPLOY_BASE_PATH}\\server' -Recurse -Force" } // PM2操作:重启或启动服务 script { dir("${DEPLOY_BASE_PATH}\\server") { def pm2Status = powershell(script: 'pm2 list | findstr /i "server"', returnStatus: true) if (pm2Status == 0) { powershell 'pm2 reload server.js --name "express-server"' } else { powershell 'pm2 start server.js --name "express-server"' } } } } } } post { always { cleanWs() // 清理工作区 } success { echo "CI/CD 执行成功!" } failure { echo "CI/CD 执行失败,请检查日志!" } } }
不同变更场景的执行流程
1. 仅client目录变更
- 执行
Checkout Code拉取最新代码 Detect Changes检测到client目录有变更,标记CLIENT_CHANGED=true- 跳过
Build & Deploy Server阶段 - 执行
Build & Deploy Client:安装依赖→构建React项目→将build目录静态文件复制到Nginx静态目录 - 清理工作区,输出成功日志
2. 仅server目录变更
- 执行
Checkout Code拉取最新代码 Detect Changes检测到server目录有变更,标记SERVER_CHANGED=true- 跳过
Build & Deploy Client阶段 - 执行
Build & Deploy Server:安装依赖→复制server文件到部署目录→检查PM2中是否已有服务,存在则reload,不存在则start - 清理工作区,输出成功日志
3. client和server目录同时变更
- 执行
Checkout Code拉取最新代码 Detect Changes标记CLIENT_CHANGED=true和SERVER_CHANGED=true- 先执行
Build & Deploy Client全流程 - 再执行
Build & Deploy Server全流程 - 清理工作区,输出成功日志
关键注意事项
- Nginx配置:确保Nginx的静态资源目录指向
NGINX_STATIC_PATH,并配置反向代理到Express服务的端口(如果需要前后端同域名访问) - PM2权限:Jenkins服务运行的用户需要有PM2的执行权限,避免出现无法操作PM2的情况
- 依赖缓存:可以添加
cache步骤缓存node_modules,减少每次安装依赖的时间,比如用npm ci代替npm install配合缓存 - 数据库迁移:如果server有数据库变更,需要在
Build & Deploy Server阶段添加数据库迁移步骤(比如npx sequelize-cli db:migrate,根据你的ORM工具调整)
内容的提问来源于stack exchange,提问作者Aiden
相关产品推荐
相关产品推荐

