Files
aiot-platform-cloud/docs/build-optimization-guide.md
lzh 25fad8d6fd
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
perf: 启用 Docker BuildKit 和 Maven 缓存优化构建速度
- 启用 Docker BuildKit 缓存挂载
- 使用 --mount=type=cache 缓存 Maven 依赖
- 优化 Dockerfile 层缓存策略
- 添加构建优化指南文档

预期效果:
- 首次构建: ~30分钟
- 后续构建(无变更): ~2分钟
- 后续构建(有变更): ~5-8分钟
2026-01-13 15:36:29 +08:00

274 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Jenkins 构建速度优化方案
## 当前问题
1. **Maven 依赖重复下载** - 每次构建都要下载依赖(~5-10分钟
2. **串行构建** - 5个服务依次构建~30-50分钟
3. **无 Docker 缓存** - 每次都是全新构建
4. **无 Maven 缓存** - 依赖不复用
## 优化方案
### 方案 1: 启用 Docker BuildKit 缓存(推荐,最简单)
**优化效果**: 构建时间减少 60-80%
#### 实施步骤
1. **修改 Jenkinsfile启用 BuildKit**
```groovy
environment {
// 启用 Docker BuildKit
DOCKER_BUILDKIT = '1'
BUILDKIT_PROGRESS = 'plain'
}
```
2. **使用缓存挂载优化 Dockerfile**
修改 `docker/Dockerfile.template`:
```dockerfile
# syntax=docker/dockerfile:1.4
# ============ 构建阶段 ============
FROM maven:3.9.9-eclipse-temurin-17-alpine AS builder
WORKDIR /build
# 利用 BuildKit 缓存挂载
RUN --mount=type=cache,target=/root/.m2 \
echo "Maven cache enabled"
# 复制 pom 文件
COPY pom.xml .
COPY viewsh-dependencies/pom.xml viewsh-dependencies/
# ... 其他 pom 文件
# 下载依赖(利用缓存)
RUN --mount=type=cache,target=/root/.m2 \
mvn dependency:go-offline -B
# 复制源代码
COPY . .
# 构建(利用缓存)
ARG MODULE_NAME
ARG SKIP_TESTS=true
RUN --mount=type=cache,target=/root/.m2 \
mvn clean package -pl ${MODULE_NAME} -am -DskipTests=${SKIP_TESTS} -B
# ============ 运行阶段 ============
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
ARG MODULE_NAME
ARG JAR_NAME
COPY --from=builder /build/${MODULE_NAME}/target/${JAR_NAME}.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
```
**预期效果**:
- 首次构建: ~30分钟
- 后续构建(无代码变更): ~2分钟
- 后续构建(有代码变更): ~5-10分钟
---
### 方案 2: 并行构建(中等难度)
**优化效果**: 构建时间减少 50-70%
#### 修改 Jenkinsfile
```groovy
stage('Build Docker Images') {
steps {
script {
def services = env.SERVICES_TO_BUILD.split(',')
// 并行构建
def parallelBuilds = [:]
services.each { service ->
parallelBuilds[service] = {
stage("Build ${service}") {
// 构建逻辑
}
}
}
parallel parallelBuilds
}
}
}
```
**注意**: 需要确保服务器有足够内存(至少 8GB
---
### 方案 3: 使用 Maven 本地仓库缓存(推荐)
**优化效果**: 依赖下载时间减少 90%
#### 实施步骤
1. **在宿主机创建 Maven 缓存目录**
```bash
mkdir -p /opt/jenkins-cache/maven-repo
chown -R 1000:1000 /opt/jenkins-cache/maven-repo
```
2. **修改 Jenkinsfile挂载缓存**
```groovy
stage('Build Docker Images') {
steps {
script {
services.each { service ->
sh """
docker build \
-f docker/Dockerfile.template \
--build-arg MODULE_NAME=${modulePath} \
--build-arg JAR_NAME=${jarName} \
-v /opt/jenkins-cache/maven-repo:/root/.m2/repository \
-t ${REGISTRY}/${service}:${IMAGE_TAG} \
.
"""
}
}
}
}
```
**预期效果**:
- 首次构建: ~30分钟
- 后续构建: ~8-12分钟
---
### 方案 4: 使用 Nexus 私服(最佳,但需要额外部署)
**优化效果**: 构建时间减少 70-90%
#### 部署 Nexus
```bash
# 使用 1Panel 部署 Nexus
# 或使用 Docker Compose
docker run -d \
--name nexus \
-p 8081:8081 \
-v nexus-data:/nexus-data \
sonatype/nexus3
```
#### 配置 Maven 使用 Nexus
修改 `pom.xml`:
```xml
<repositories>
<repository>
<id>nexus</id>
<url>http://127.0.0.1:8081/repository/maven-public/</url>
</repository>
</repositories>
```
**预期效果**:
- 依赖下载速度提升 5-10 倍
- 构建时间减少 70%
---
### 方案 5: 增量构建优化(已实现)
**当前状态**: ✅ 已实现
- 只构建变更的服务
- 跳过未变更的服务
---
## 推荐组合方案
### 🚀 快速优化5分钟实施
**方案 1 + 方案 3**
1. 启用 Docker BuildKit
2. 挂载 Maven 缓存目录
**预期效果**: 构建时间从 30分钟 → 8-10分钟
### 🎯 最佳优化30分钟实施
**方案 1 + 方案 2 + 方案 3**
1. 启用 Docker BuildKit
2. 并行构建
3. Maven 缓存
**预期效果**: 构建时间从 30分钟 → 3-5分钟
### 💎 终极优化(需要额外资源)
**方案 1 + 方案 2 + 方案 4**
1. 启用 Docker BuildKit
2. 并行构建
3. Nexus 私服
**预期效果**: 构建时间从 30分钟 → 2-3分钟
---
## 立即可实施的优化
### 1. 启用 Docker BuildKit最简单
修改 Jenkinsfile:
```groovy
environment {
DOCKER_BUILDKIT = '1'
}
```
### 2. 创建 Maven 缓存目录
```bash
ssh root@172.19.0.1 'mkdir -p /opt/jenkins-cache/maven-repo && chown -R 1000:1000 /opt/jenkins-cache/maven-repo'
```
### 3. 修改 Dockerfile 使用缓存挂载
使用 BuildKit 的 `--mount=type=cache` 特性
---
## 性能对比
| 优化方案 | 首次构建 | 后续构建(无变更) | 后续构建(有变更) | 实施难度 |
|---------|---------|------------------|------------------|---------|
| 无优化 | 30分钟 | 30分钟 | 30分钟 | - |
| BuildKit | 30分钟 | 2分钟 | 8分钟 | ⭐ 简单 |
| BuildKit + Maven缓存 | 30分钟 | 2分钟 | 5分钟 | ⭐⭐ 中等 |
| BuildKit + 并行 | 15分钟 | 1分钟 | 4分钟 | ⭐⭐⭐ 复杂 |
| 全部优化 + Nexus | 15分钟 | 1分钟 | 2分钟 | ⭐⭐⭐⭐ 最复杂 |
---
## 下一步
选择您想要实施的优化方案,我会帮您修改配置文件!