diff --git a/Jenkinsfile b/Jenkinsfile index 576bb25..475684e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -22,6 +22,10 @@ pipeline { // Docker Registry 配置 REGISTRY = 'localhost:5000' + // 启用 Docker BuildKit(加速构建) + DOCKER_BUILDKIT = '1' + BUILDKIT_PROGRESS = 'plain' + // Maven 配置 MAVEN_OPTS = '-Xmx2048m -Dmaven.repo.local=.m2/repository' diff --git a/docker/Dockerfile.template b/docker/Dockerfile.template index 0b004d7..071a8c8 100644 --- a/docker/Dockerfile.template +++ b/docker/Dockerfile.template @@ -1,45 +1,55 @@ -# 多阶段构建 Dockerfile 模板 -# 适用于所有 Spring Boot 服务 +# syntax=docker/dockerfile:1.4 + +# ============================================ +# 多阶段构建:Maven 编译 + 运行时镜像 +# 使用 Docker BuildKit 缓存加速构建 +# ============================================ # ============ 构建阶段 ============ -FROM eclipse-temurin:17-jdk-alpine AS builder +FROM maven:3.9.9-eclipse-temurin-17-alpine AS builder -# 安装必要工具 -RUN apk add --no-cache maven - -# 设置工作目录 WORKDIR /build -# 复制 Maven 配置文件(利用 Docker 缓存) +# 构建参数 +ARG MODULE_NAME +ARG JAR_NAME +ARG SKIP_TESTS=true + +# 复制 pom 文件(利用 Docker 层缓存) COPY pom.xml . COPY viewsh-dependencies/pom.xml viewsh-dependencies/ COPY viewsh-framework/pom.xml viewsh-framework/ COPY viewsh-gateway/pom.xml viewsh-gateway/ COPY viewsh-module-system/pom.xml viewsh-module-system/ +COPY viewsh-module-system/viewsh-module-system-api/pom.xml viewsh-module-system/viewsh-module-system-api/ +COPY viewsh-module-system/viewsh-module-system-server/pom.xml viewsh-module-system/viewsh-module-system-server/ COPY viewsh-module-infra/pom.xml viewsh-module-infra/ +COPY viewsh-module-infra/viewsh-module-infra-api/pom.xml viewsh-module-infra/viewsh-module-infra-api/ +COPY viewsh-module-infra/viewsh-module-infra-server/pom.xml viewsh-module-infra/viewsh-module-infra-server/ COPY viewsh-module-iot/pom.xml viewsh-module-iot/ -COPY viewsh-server/pom.xml viewsh-server/ +COPY viewsh-module-iot/viewsh-module-iot-core/pom.xml viewsh-module-iot/viewsh-module-iot-core/ +COPY viewsh-module-iot/viewsh-module-iot-api/pom.xml viewsh-module-iot/viewsh-module-iot-api/ +COPY viewsh-module-iot/viewsh-module-iot-server/pom.xml viewsh-module-iot/viewsh-module-iot-server/ +COPY viewsh-module-iot/viewsh-module-iot-gateway/pom.xml viewsh-module-iot/viewsh-module-iot-gateway/ -# 下载依赖(利用缓存层) -RUN mvn dependency:go-offline -B || true +# 下载依赖(使用 BuildKit 缓存挂载) +# 缓存会保存在 Docker 的缓存卷中,不会包含在最终镜像里 +RUN --mount=type=cache,target=/root/.m2 \ + mvn dependency:go-offline -B -q || true # 复制源代码 COPY . . -# 构建参数:指定要构建的模块 -ARG MODULE_NAME -ARG SKIP_TESTS=true - -# 编译打包 -RUN if [ "$SKIP_TESTS" = "true" ]; then \ - mvn clean package -pl ${MODULE_NAME} -am -DskipTests -B; \ - else \ - mvn clean package -pl ${MODULE_NAME} -am -B; \ - fi +# 编译打包(使用 BuildKit 缓存挂载) +RUN --mount=type=cache,target=/root/.m2 \ + mvn clean package -pl ${MODULE_NAME} -am -DskipTests=${SKIP_TESTS} -B -q # ============ 运行阶段 ============ FROM eclipse-temurin:17-jre-alpine +# 安装必要工具(用于健康检查) +RUN apk add --no-cache wget curl + # 构建参数 ARG MODULE_NAME ARG JAR_NAME diff --git a/docs/build-optimization-guide.md b/docs/build-optimization-guide.md new file mode 100644 index 0000000..abc8fe1 --- /dev/null +++ b/docs/build-optimization-guide.md @@ -0,0 +1,273 @@ +# 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分钟 | ⭐⭐⭐⭐ 最复杂 | + +--- + +## 下一步 + +选择您想要实施的优化方案,我会帮您修改配置文件!