- 启用 Docker BuildKit 缓存挂载 - 使用 --mount=type=cache 缓存 Maven 依赖 - 优化 Dockerfile 层缓存策略 - 添加构建优化指南文档 预期效果: - 首次构建: ~30分钟 - 后续构建(无变更): ~2分钟 - 后续构建(有变更): ~5-8分钟
5.7 KiB
5.7 KiB
Jenkins 构建速度优化方案
当前问题
- Maven 依赖重复下载 - 每次构建都要下载依赖(~5-10分钟)
- 串行构建 - 5个服务依次构建(~30-50分钟)
- 无 Docker 缓存 - 每次都是全新构建
- 无 Maven 缓存 - 依赖不复用
优化方案
方案 1: 启用 Docker BuildKit 缓存(推荐,最简单)
优化效果: 构建时间减少 60-80%
实施步骤
- 修改 Jenkinsfile,启用 BuildKit
environment {
// 启用 Docker BuildKit
DOCKER_BUILDKIT = '1'
BUILDKIT_PROGRESS = 'plain'
}
- 使用缓存挂载优化 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%
实施步骤
- 在宿主机创建 Maven 缓存目录
mkdir -p /opt/jenkins-cache/maven-repo
chown -R 1000:1000 /opt/jenkins-cache/maven-repo
- 修改 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
- 启用 Docker BuildKit
- 挂载 Maven 缓存目录
预期效果: 构建时间从 30分钟 → 8-10分钟
🎯 最佳优化(30分钟实施)
方案 1 + 方案 2 + 方案 3
- 启用 Docker BuildKit
- 并行构建
- Maven 缓存
预期效果: 构建时间从 30分钟 → 3-5分钟
💎 终极优化(需要额外资源)
方案 1 + 方案 2 + 方案 4
- 启用 Docker BuildKit
- 并行构建
- 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分钟 | ⭐⭐⭐⭐ 最复杂 |
下一步
选择您想要实施的优化方案,我会帮您修改配置文件!