# 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 nexus http://127.0.0.1:8081/repository/maven-public/ ``` **预期效果**: - 依赖下载速度提升 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分钟 | ⭐⭐⭐⭐ 最复杂 | --- ## 下一步 选择您想要实施的优化方案,我会帮您修改配置文件!