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.
7.8 KiB
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
- 分支过滤:
main或feature-*
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
触发方式
自动触发
- 开发者推送代码到 Gitea
- Gitea Webhook 自动触发 Jenkins 构建
- Jenkins 执行完整流水线
手动触发
- 访问 Jenkins:
http://localhost:8084/job/slms - 点击 "Build Now"
- 选择分支(如果配置了参数化构建)
构建结果通知
成功通知
- 邮件主题:
✅ 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 环境)
打包优化
- 并行打包四端应用
- 复用编译结果
- 增量打包
推送优化
- 只推送变更的文件
- 使用浅克隆
- 压缩传输数据
最佳实践
- 频繁提交 - 小步快跑,及时发现问题
- 保持绿色 - 确保主分支始终可构建
- 快速反馈 - 优化流水线执行时间
- 自动化测试 - 提高测试覆盖率
- 代码审查 - 结合 SonarQube 报告
- 版本管理 - 使用语义化版本号
- 文档同步 - 及时更新配置文档
总结
SLMS 的 CI/CD 流程实现了:
- ✅ 自动化构建和测试
- ✅ 代码质量检测
- ✅ 四端应用打包
- ✅ 自动发布到头歌
- ✅ 完整的通知机制
整个流程从代码推送到发布完全自动化,大大提高了开发效率和代码质量!