You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows环境React应用CI/CD:Jenkins脚本与执行流程咨询

React+Express 应用 Jenkins CI/CD 流水线实现方案

针对你在Windows环境下搭建React+Express应用CI/CD的需求,结合你提供的初始脚本,下面给出优化后的流水线实现逻辑及执行流程说明:

现有脚本的核心问题

  1. 路径硬编码:直接写死Jenkins工作区路径,换项目或工作区后会失效,应该用Jenkins内置的${WORKSPACE}变量
  2. 无变更检测:不管client/server是否有代码变更,都会执行全量构建部署,浪费资源
  3. 客户端部署逻辑有误:React构建后应该把build目录(或dist,取决于你的React配置)的静态文件部署到Nginx的静态资源目录,而不是复制整个client目录
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 00:39:53