stages: - build_backend - build_frontend - deploy variables: GIT_STRATEGY: clone JAVA_HOME: "/data2/wzb/tools/jdk8" M2_HOME: "/data2/wzb/tools/maven" PATH: "/data2/wzb/tools/maven/bin:/data2/wzb/tools/jdk8/bin:/usr/local/bin:/usr/bin:/bin" # 1. 编译打包后端 build_backend: stage: build_backend tags: - railway-deploy rules: - if: '$CI_COMMIT_BRANCH' - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' script: - echo "=== 开始编译后端 RuoYi-Vue ===" - export JAVA_HOME=/data2/wzb/tools/jdk8 - export PATH=/data2/wzb/tools/maven/bin:$JAVA_HOME/bin:$PATH - javac -version - bash scripts/bootstrap/check-kingbase-jdbc.sh - cd RuoYi-Vue - mvn clean package - | python3 -c 'import glob, re; runs = [int(m.group(1)) for f in glob.glob("ruoyi-*/target/surefire-reports/*.txt") for m in re.finditer(r"Tests run:\s*(\d+)", open(f, errors="ignore").read())]; print("=== 后端测试执行统计: Tests run: %d ===" % sum(runs))' - echo "=== 后端测试与构建成功 ===" artifacts: expire_in: 2 days paths: - RuoYi-Vue/ruoyi-admin/target/ruoyi-admin.jar # 2. 编译打包前端 build_frontend: stage: build_frontend tags: - railway-deploy rules: - if: '$CI_COMMIT_BRANCH' - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' script: - echo "=== 开始编译前端 build_ui ===" - export NODE_OPTIONS="--openssl-legacy-provider --dns-result-order=ipv4first" - cd build_ui - if [ ! -d "node_modules" ] && [ -d "/data2/wzb/tools/frontend-cache/node_modules" ]; then echo "使用服务器本地缓存的 node_modules"; ln -sfn /data2/wzb/tools/frontend-cache/node_modules ./node_modules; fi - npm run build:prod - if [ ! -d "dist" ] || [ ! -f "dist/index.html" ]; then echo "错误:前端构建产物 build_ui/dist/index.html 不存在,构建失败"; exit 1; fi - echo "=== 前端编译成功,build_ui/dist/index.html 校验通过 ===" artifacts: expire_in: 2 days paths: - build_ui/dist/ # 3. 部署到业务目录并平滑重启 deploy_production: stage: deploy tags: - railway-deploy rules: - if: '$CI_COMMIT_BRANCH == "feat/cicd-pipeline"' - when: never script: - echo "=== 0. 验证部署运行时环境配置 ===" - if [ -z "${TRAIN_STUDENT_IDENTITY_ENCRYPTION_KEY:-}" ] || [ -z "${TRAIN_STUDENT_IDENTITY_HASH_KEY:-}" ] || [ -z "${SPRING_REDIS_PASSWORD:-}" ]; then echo "错误:缺少必需的运行时配置"; exit 1; fi - echo "required runtime configuration present." - echo "=== 1. 执行部署备份 (Rollback 兜底) ===" - if [ -d "/data2/wzb/deploy/frontend" ] && [ "$(ls -A /data2/wzb/deploy/frontend 2>/dev/null)" ]; then echo "备份现有前端资源到 /data2/wzb/deploy/frontend.bak ..."; mkdir -p /data2/wzb/deploy/frontend.bak; cp -a /data2/wzb/deploy/frontend/. /data2/wzb/deploy/frontend.bak/; fi - if [ -f "/data2/wzb/deploy/backend/ruoyi-admin.jar" ]; then echo "备份现有后端 Jar 到 /data2/wzb/deploy/backend/ruoyi-admin.jar.bak ..."; cp -p /data2/wzb/deploy/backend/ruoyi-admin.jar /data2/wzb/deploy/backend/ruoyi-admin.jar.bak; fi - echo "=== 2. 部署前端静态资源与文档中心 ===" - mkdir -p /data2/wzb/deploy/frontend - rm -rf /data2/wzb/deploy/frontend/* - cp -r build_ui/dist/* /data2/wzb/deploy/frontend/ - mkdir -p /data2/wzb/deploy/frontend/docs - cp -r docs/* /data2/wzb/deploy/frontend/docs/ - echo "=== 3. 部署后端 Jar 包 ===" - mkdir -p /data2/wzb/deploy/backend - cp RuoYi-Vue/ruoyi-admin/target/ruoyi-admin.jar /data2/wzb/deploy/backend/ - echo "=== 4. 执行平滑重启与生产自检 ===" - chmod +x deploy/restart-all.sh - bash deploy/restart-all.sh - echo "=== 5. 输出访问地址 ===" - echo "APPLICATION_URL=http://192.168.139.230:8082/" - echo "DOCUMENTATION_URL=http://192.168.139.230:8082/docs/visual/index.html" - echo "=== 部署与自检成功完成! ==="