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

5.7 KiB
Raw Blame History

Jenkins 构建速度优化方案

当前问题

  1. Maven 依赖重复下载 - 每次构建都要下载依赖(~5-10分钟
  2. 串行构建 - 5个服务依次构建~30-50分钟
  3. 无 Docker 缓存 - 每次都是全新构建
  4. 无 Maven 缓存 - 依赖不复用

优化方案

方案 1: 启用 Docker BuildKit 缓存(推荐,最简单)

优化效果: 构建时间减少 60-80%

实施步骤

  1. 修改 Jenkinsfile启用 BuildKit
environment {
    // 启用 Docker BuildKit
    DOCKER_BUILDKIT = '1'
    BUILDKIT_PROGRESS = 'plain'
}
  1. 使用缓存挂载优化 Dockerfile

修改 docker/Dockerfile.template:

# 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

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 缓存目录
mkdir -p /opt/jenkins-cache/maven-repo
chown -R 1000:1000 /opt/jenkins-cache/maven-repo
  1. 修改 Jenkinsfile挂载缓存
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

# 使用 1Panel 部署 Nexus
# 或使用 Docker Compose
docker run -d \
  --name nexus \
  -p 8081:8081 \
  -v nexus-data:/nexus-data \
  sonatype/nexus3

配置 Maven 使用 Nexus

修改 pom.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:

environment {
    DOCKER_BUILDKIT = '1'
}

2. 创建 Maven 缓存目录

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分钟 最复杂

下一步

选择您想要实施的优化方案,我会帮您修改配置文件!