You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
slms/docs/CICD_WORKFLOW.md

7.8 KiB

SLMS CI/CD 完整流程

流程概览

开发者推送代码到 Gitea
    ↓
Gitea Webhook 触发 Jenkins
    ↓
Jenkins 执行流水线
    ├─ 1. 拉取代码
    ├─ 2. 编译项目
    ├─ 3. 运行测试
    ├─ 4. SonarQube 质检
    ├─ 5. 质量阈检查
    ├─ 6. 四端打包 (CLI/GUI/WUI/MUI)
    ├─ 7. 归档制品
    ├─ 8. 推送源代码到头歌 feature-ldl 分支
    └─ 9. 推送制品到头歌 release 分支

详细流程

1. Gitea → Jenkins (Webhook 触发)

Gitea 配置

  • 仓库地址: http://localhost:3000/slms/SLMS
  • Webhook URL: http://localhost:8084/gitea-webhook/post
  • 触发事件: Push events
  • 分支过滤: mainfeature-*

Jenkins 配置

  • 项目名称: slms
  • 项目 URL: http://localhost:8084/job/slms
  • SCM: Git
  • 仓库 URL: http://localhost:3000/slms/SLMS.git
  • 构建触发器: Gitea webhook

2. Jenkins 流水线执行

Stage 1: 拉取代码

checkout scm
  • 从 Gitea 拉取最新代码
  • 自动检出触发构建的分支

Stage 2: 编译项目

mvn clean compile -DskipTests
  • 清理旧的编译输出
  • 编译 Java 源代码
  • 跳过测试以加快编译速度

Stage 3: 运行测试

mvn test
  • 执行单元测试
  • 生成测试报告
  • 如果测试失败,标记为 UNSTABLE 但继续流水线

Stage 4: SonarQube 质检

mvn sonar:sonar -Dsonar.qualitygate.wait=true -Dsonar.qualitygate.timeout=300
  • 扫描代码质量
  • 分析四端应用代码CLI/GUI/WUI/MUI
  • 上传分析结果到 SonarQube
  • 等待质量阈结果(最多 5 分钟)

扫描范围

  • Java 主代码: src/main/java
  • Android 代码: android/src/main/java
  • 测试代码: src/test/java
  • Web 模板: src/main/resources/templates

Stage 5: 质量阈检查

def qg = waitForQualityGate()
if (qg.status != 'OK') {
    error "质量门禁未通过"
}
  • 等待 SonarQube 后台分析完成
  • 检查质量阈状态
  • 如果不通过,中断流水线

质量阈: SLMS-Quality-Gate

  • 新代码覆盖率 < 70% → Failed
  • 重复代码率 > 3% → Failed
  • 可维护性评级差于 A → Failed
  • 可靠性评级差于 A → Failed
  • 安全性评级差于 A → Failed

Stage 6: 四端打包(并行)

6.1 CLI 打包 (JAR)

mvn clean package -DskipTests -P cli
  • 输出: target/slms-cli.jar
  • 特点: 命令行可执行 JAR

6.2 GUI 打包 (EXE)

mvn clean package -DskipTests -P gui
jpackage --input target --name SLMS-GUI --main-jar slms-gui.jar --type exe
  • 输出: target/SLMS-GUI.exe
  • 特点: Windows 原生安装程序

6.3 Web 打包 (WAR)

mvn clean package -DskipTests -P web
  • 输出: target/slms-web.war
  • 特点: 可部署到 Tomcat/Jetty

6.4 Android 打包 (APK)

cd android
gradlew assembleDebug
  • 输出: android/build/outputs/apk/debug/app-debug.apk
  • 特点: Android 安装包

Stage 7: 归档制品

archiveArtifacts artifacts: '''
    **/target/*.jar,
    **/target/*.war,
    **/target/*.exe,
    **/android/build/outputs/apk/**/*.apk
'''
  • 归档所有构建制品
  • 可在 Jenkins 界面下载
  • 保留构建历史

Stage 8: 推送源代码到头歌

git push https://bdgit.educoder.net/pu6zrsfoy/CHZU_CS231_SEB_lab.git HEAD:refs/heads/feature-ldl --force
  • 推送源代码到头歌 feature-ldl 分支
  • 使用 URL 编码的凭据
  • 强制推送以覆盖远程分支

Stage 9: 推送制品到头歌

# 复制制品到 artifacts 目录
xcopy target\*.jar artifacts\
xcopy target\*.war artifacts\
xcopy android\build\outputs\apk\debug\*.apk artifacts\

# 提交并推送到 release 分支
git add artifacts/
git commit -m "chore: 发布构建制品 Build #${BUILD_NUMBER}"
git push https://bdgit.educoder.net/pu6zrsfoy/CHZU_CS231_SEB_lab.git HEAD:release --force
  • 收集所有构建制品
  • 提交到 Git
  • 推送到头歌 release 分支

3. Jenkins → SonarQube (质量检测)

SonarQube 配置

  • 服务地址: http://localhost:9000
  • 项目 Key: slms:slms
  • 项目名称: SLMS - Smart Library Management System
  • 质量阈: SLMS-Quality-Gate

Webhook 配置

  • URL: http://localhost:8084/sonarqube-webhook/
  • 用途: 通知 Jenkins 质量阈结果

分析内容

  • 代码行数统计
  • 代码覆盖率
  • 代码重复率
  • 代码异味
  • Bug 和漏洞
  • 安全热点
  • 技术债务

4. Jenkins → 头歌 (发布)

头歌仓库

  • 地址: https://bdgit.educoder.net/pu6zrsfoy/CHZU_CS231_SEB_lab.git
  • 凭据: educoder-credentials (Jenkins 凭据管理)

分支策略

  • feature-ldl: 源代码分支

    • 包含完整的项目源代码
    • 用于代码审查和协作开发
  • release: 制品发布分支

    • 只包含构建制品JAR/WAR/EXE/APK
    • 用于下载和部署

环境配置

Gitea (本地 Git 服务)

  • 地址: http://localhost:3000
  • 用途: 源代码托管
  • 仓库: slms/SLMS

Jenkins (CI/CD 服务)

  • 地址: http://localhost:8084
  • 用途: 自动化构建和部署
  • 项目: slms

SonarQube (代码质量平台)

  • 地址: http://localhost:9000
  • 用途: 代码质量检测和分析
  • 项目: slms:slms

头歌 (远程 Git 服务)

  • 地址: https://bdgit.educoder.net
  • 用途: 代码发布和提交
  • 仓库: pu6zrsfoy/CHZU_CS231_SEB_lab

触发方式

自动触发

  1. 开发者推送代码到 Gitea
  2. Gitea Webhook 自动触发 Jenkins 构建
  3. Jenkins 执行完整流水线

手动触发

  1. 访问 Jenkins: http://localhost:8084/job/slms
  2. 点击 "Build Now"
  3. 选择分支(如果配置了参数化构建)

构建结果通知

成功通知

  • 邮件主题: ✅ SLMS 构建成功 - Build #${BUILD_NUMBER}
  • 包含内容:
    • 构建编号和时间
    • Git 提交信息
    • 各阶段执行结果
    • Jenkins 构建链接
    • SonarQube 报告链接
    • 制品下载链接

失败通知

  • 邮件主题: ❌ SLMS 构建失败 - Build #${BUILD_NUMBER}
  • 包含内容:
    • 失败原因分析
    • 构建日志链接
    • SonarQube 报告链接

故障排查

问题 1: Webhook 未触发

检查项

  • Gitea Webhook 配置是否正确
  • Jenkins 是否可访问(防火墙)
  • Webhook 日志是否有错误

问题 2: 编译失败

检查项

  • Java 版本是否正确(需要 JDK 21
  • Maven 依赖是否下载完整
  • 代码是否有语法错误

问题 3: 测试失败

检查项

  • 数据库连接是否正常
  • 测试数据是否准备好
  • 测试代码是否与实际代码匹配

问题 4: SonarQube 质检超时

检查项

  • SonarQube 服务是否运行
  • Webhook 配置是否正确
  • 质量阈超时时间是否足够(当前 5 分钟)

问题 5: 推送头歌失败

检查项

  • 凭据是否正确
  • 网络连接是否正常
  • URL 编码是否正确(邮箱地址)

性能优化

编译优化

  • 使用 Maven 本地仓库缓存
  • 并行编译多模块项目
  • 跳过不必要的插件

测试优化

  • 并行执行测试
  • 使用内存数据库H2
  • 跳过集成测试CI 环境)

打包优化

  • 并行打包四端应用
  • 复用编译结果
  • 增量打包

推送优化

  • 只推送变更的文件
  • 使用浅克隆
  • 压缩传输数据

最佳实践

  1. 频繁提交 - 小步快跑,及时发现问题
  2. 保持绿色 - 确保主分支始终可构建
  3. 快速反馈 - 优化流水线执行时间
  4. 自动化测试 - 提高测试覆盖率
  5. 代码审查 - 结合 SonarQube 报告
  6. 版本管理 - 使用语义化版本号
  7. 文档同步 - 及时更新配置文档

总结

SLMS 的 CI/CD 流程实现了:

  • 自动化构建和测试
  • 代码质量检测
  • 四端应用打包
  • 自动发布到头歌
  • 完整的通知机制

整个流程从代码推送到发布完全自动化,大大提高了开发效率和代码质量!