From 1f90427fb7220abd1bd0f1443400c652f66db64d Mon Sep 17 00:00:00 2001 From: wangtianqi <1350217033@qq.com> Date: Tue, 24 Jun 2025 00:08:36 +0800 Subject: [PATCH] feat: Enable Docker Buildx for faster and more reliable builds Features: - Enable Docker Buildx with advanced caching - Add BuildKit cache mount for Maven dependencies - Use Aliyun Maven mirror for faster dependency downloads - Optimize Docker layer caching strategy - Add automatic cache cleanup to prevent disk overflow - Increase build timeout to 30 minutes - Add buildx builder instance management Performance improvements: - Parallel builds with Buildx - Persistent Maven cache with RUN --mount=type=cache - Layer-optimized Dockerfile structure - Automatic cache rotation This should significantly reduce Docker build time and improve reliability. --- Dockerfile | 26 ++++++++++++++---- Jenkinsfile | 76 ++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 84 insertions(+), 18 deletions(-) diff --git a/Dockerfile b/Dockerfile index 30740c7..f79b0a2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,21 @@ FROM amazoncorretto:17-alpine-jdk as builder # 设置工作目录 WORKDIR /app -# 复制Maven配置文件 +# 设置Maven镜像源(提高下载速度) +RUN mkdir -p /root/.m2 && \ + echo '' > /root/.m2/settings.xml && \ + echo '' >> /root/.m2/settings.xml && \ + echo ' ' >> /root/.m2/settings.xml && \ + echo ' ' >> /root/.m2/settings.xml && \ + echo ' aliyun' >> /root/.m2/settings.xml && \ + echo ' Aliyun Central' >> /root/.m2/settings.xml && \ + echo ' https://maven.aliyun.com/repository/central' >> /root/.m2/settings.xml && \ + echo ' central' >> /root/.m2/settings.xml && \ + echo ' ' >> /root/.m2/settings.xml && \ + echo ' ' >> /root/.m2/settings.xml && \ + echo '' + +# 复制Maven配置文件和脚本(利用Docker缓存) COPY pom.xml . COPY .mvn .mvn COPY mvnw . @@ -12,14 +26,16 @@ COPY mvnw . # 给mvnw脚本添加执行权限 RUN chmod +x ./mvnw -# 下载依赖(利用Docker缓存层) -RUN ./mvnw dependency:go-offline -B +# 首先只复制pom.xml并下载依赖(利用Docker层缓存) +RUN --mount=type=cache,target=/root/.m2 \ + ./mvnw dependency:resolve -B # 复制源代码 COPY src ./src -# 构建应用 -RUN ./mvnw clean package -DskipTests +# 构建应用(使用缓存挂载优化Maven依赖下载) +RUN --mount=type=cache,target=/root/.m2 \ + ./mvnw clean package -DskipTests -B -q # 运行时镜像 - 使用更小的Alpine镜像 FROM amazoncorretto:17-alpine diff --git a/Jenkinsfile b/Jenkinsfile index 2154198..9db13e9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -143,24 +143,58 @@ pipeline { } } } - } - stage('构建Docker镜像') { + } stage('构建Docker镜像') { steps { echo '🐳 构建Docker镜像...' script { - retry(2) { + retry(3) { try { // 清理旧镜像以节省空间 sh 'docker image prune -f || true' echo "开始构建Docker镜像: ${IMAGE_NAME}:${IMAGE_TAG}" - // 使用timeout包装Docker构建 - timeout(time: 15, unit: 'MINUTES') { - def image = docker.build("${IMAGE_NAME}:${IMAGE_TAG}") + // 启用Docker Buildx并创建构建器 + sh ''' + # 检查并安装buildx(如果需要) + if ! docker buildx version; then + echo "Installing Docker Buildx..." + DOCKER_BUILDX_VERSION=v0.12.1 + curl -L https://github.com/docker/buildx/releases/download/${DOCKER_BUILDX_VERSION}/buildx-${DOCKER_BUILDX_VERSION}.linux-amd64 -o docker-buildx + chmod +x docker-buildx + mkdir -p ~/.docker/cli-plugins + mv docker-buildx ~/.docker/cli-plugins/ + fi - // 也创建latest标签 - sh "docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${IMAGE_NAME}:latest" + # 创建并使用新的构建器实例 + docker buildx create --name jenkins-builder --use --bootstrap || docker buildx use jenkins-builder + + # 验证构建器状态 + docker buildx inspect --bootstrap + ''' + + // 使用Buildx构建镜像,增加超时时间到30分钟 + timeout(time: 30, unit: 'MINUTES') { + sh ''' + # 使用Buildx构建镜像,启用缓存和并行构建 + docker buildx build \\ + --builder jenkins-builder \\ + --platform linux/amd64 \\ + --cache-from type=local,src=/tmp/.buildx-cache \\ + --cache-to type=local,dest=/tmp/.buildx-cache-new,mode=max \\ + --build-arg BUILDKIT_INLINE_CACHE=1 \\ + --build-arg HTTP_PROXY= \\ + --build-arg HTTPS_PROXY= \\ + --network=host \\ + --load \\ + -t ${IMAGE_NAME}:${IMAGE_TAG} \\ + -t ${IMAGE_NAME}:latest \\ + . + + # 移动缓存(避免缓存无限增长) + rm -rf /tmp/.buildx-cache || true + mv /tmp/.buildx-cache-new /tmp/.buildx-cache || true + ''' } echo "✅ Docker镜像构建完成: ${IMAGE_NAME}:${IMAGE_TAG}" @@ -170,8 +204,11 @@ pipeline { } catch (Exception e) { echo "⚠️ Docker构建失败: ${e.getMessage()}" - // 清理可能的中间状态 - sh 'docker system prune -f || true' + // 清理可能的中间状态和缓存 + sh ''' + docker system prune -f || true + rm -rf /tmp/.buildx-cache* || true + ''' throw e } } @@ -387,14 +424,27 @@ EOF unstable { echo '⚠️ 构建不稳定,可能存在测试失败' } - - cleanup { + cleanup { script { try { + // 清理Docker构建缓存(防止磁盘空间不足) + sh ''' + # 清理buildx缓存 + rm -rf /tmp/.buildx-cache* || true + + # 清理未使用的Docker资源 + docker system prune -f || true + + # 移除构建器(如果存在) + docker buildx rm jenkins-builder || true + ''' + // 清理工作空间 cleanWs() + + echo "✅ 清理完成" } catch (Exception e) { - echo "⚠️ 工作空间清理失败: ${e.getMessage()}" + echo "⚠️ 清理失败: ${e.getMessage()}" } } }