You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mac本地GitLab Runner构建Maven项目速度慢的优化咨询

问题描述

在Mac上为托管于gitlab.com的Maven/Java/Spring项目配置了本地GitLab Runner,但每次提交代码时,构建流程因重新下载所有依赖耗时极久——单次构建环节需7分钟,全流程超1小时。使用GitLab共享Runner构建测试速度更快,但会消耗配额时长,希望优化本地Runner的构建速度。

构建日志片段

Preparing the "docker" executor
00:22
Using Docker executor with image maven:3.8.5-openjdk-17-slim ...
Starting service docker:dind ...
Pulling docker image docker:dind ...
Using docker image sha256:7b7c9f4ae103441d225d2b3ea4a5dd0f8cb5673b44ec984353853b2791099bde for docker:dind with digest docker@sha256:999fc127a51b8a86593ff9ba2518f14cbd18555849f8927fd56fa82395effe16 ...
Waiting for services to be up and running (timeout 30 seconds)...
Pulling docker image maven:3.8.5-openjdk-17-slim ...
Using docker image sha256:7337649a0aedd0916ce8bc19a3e1d58779afec34e06ec893fec37fde07661d94 for maven:3.8.5-openjdk-17-slim with digest maven@sha256:502e781d39f0b40fbd02eb23f5b7663618b76ba52034da218c64e92f6c5647be ...
Preparing environment
00:00
Running on runner-v5bnsne3-project-37118324-concurrent-0 via giuseppefalco-QT0Q7VN4KR...
Getting source from Git repository
00:02
Fetching changes with git depth set to 20...
Reinitialized existing Git repository in /builds/gfalco77/maverick/.git/
Checking out 82e8826f as master...
Removing .m2/
Removing .sonar/
Removing target/
Skipping Git submodules setup
Restoring cache
00:00
Checking cache for master-1-protected...
No URL provided, cache will not be downloaded from shared cache server. Instead a local version of cache will be extracted. 
Successfully extracted cache
Executing "step_script" stage of the job script
Using docker image sha256:7337649a0aedd0916ce8bc19a3e1d58779afec34e06ec893fec37fde07661d94 for maven:3.8.5-openjdk-17-slim with digest maven@sha256:502e781d39f0b40fbd02eb23f5b7663618b76ba52034da218c64e92f6c5647be ...
$ echo "Building $MODULE"
Building 
$ mvn $MAVEN_CLI_OPTS -T 4 compile
Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
Maven home: /usr/share/maven
Java version: 17.0.2, vendor: Oracle Corporation, runtime: /usr/local/openjdk-17
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "5.10.124-linuxkit", arch: "aarch64", family: "unix"
[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects...
[INFO] Downloading from spring-milestones: https://repo.spring.io/milestone/com/gfs/phoenix/1.32/phoenix-1.32.pom
[INFO] Downloading from gitlab-maven: https://gitlab.com/api/v4/projects/37118324/packages/maven/com/gfs/phoenix/1.32/phoenix-1.32.pom

最终构建结果

[INFO] Compiling 18 source files to /builds/gfalco77/maverick/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  07:09 min (Wall Clock)
[INFO] Finished at: 2022-10-16T10:37:49Z
[INFO] ------------------------------------------------------------------------
Saving cache for successful job
00:02
Creating cache master-1-protected...
.m2/repository/: found 4492 matching files and directories 
No URL provided, cache will not be uploaded to shared cache server. Cache will be stored only locally. 
Created cache
Cleaning up project directory and file based variables
00:00
Job succeeded

release、测试、Docker推送、部署等其他任务也存在同样的耗时问题。

当前配置

GitLab Pipeline配置(构建与测试任务)

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository"
  MAVEN_CLI_OPTS: "-s settings.xml --batch-mode --errors --fail-at-end --show-version"
  MAVEN_IMAGE: maven:3.8.5-openjdk-17-slim
  IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  DOCKER_HOST: "tcp://docker:2375"
  DOCKER_DRIVER: "overlay2"
  DOCKER_TLS_CERTDIR: ""
  TESTCONTAINERS_RYUK_DISABLED: "true"

services:
  - docker:dind

stages:
  - build
  - test
  - release
  - docker-build
  - deploy

cache:
  paths:
    - .m2/repository/
  key: "$CI_BUILD_REF_NAME"

build-job:
  image: $MAVEN_IMAGE
  stage: build
  tags:
    - local-runner-maverick
  script:
    - echo "Building $MODULE"
    - mvn $MAVEN_CLI_OPTS -T 4 compile
  only:
    - merge_request
    - master

test-job:
  image: $MAVEN_IMAGE
  stage: test
  tags:
    - local-runner-maverick
  variables:
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"  # Defines the location of the analysis task cache
    GIT_DEPTH: "0"  # Tells git to fetch all the branches of the project, required by the analysis task
  cache:
    key: "${CI_JOB_NAME}"
    paths:
      - .sonar/cache
  script:
    - echo "Testing $MODULE"
    - mvn $MAVEN_CLI_OPTS verify -e sonar:sonar -Dsonar.qualitygate.wait=true -Dsonar.projectKey=gfalco77_maverick
  allow_failure: false
  only:
    - merge_requests
    - master

JIB Maven插件配置

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>${google.jib.version}</version>
    <configuration>
        <container>
            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
        </container>
        <from>
            <image>openjdk:17-jdk-slim-buster</image>
        </from>
    </configuration>
    <executions>
        <execution>
            <id>Skip-build-on-release</id>
            <phase>none</phase>
        </execution>
    </executions>
</plugin>

Runner的config.toml配置

[[runners]]
  name = "local-runner-maverick"
  url = "https://gitlab.com/"
  token = "..."
  executor = "docker"
  environment = ["DOCKER_DRIVER=overlay2"]
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "maven:3.8.5-openjdk-17-slim"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/certs/client", "/cache", "/.m2"]
    shm_size = 0
优化本地GitLab Runner构建速度的方案

1. 修复Maven依赖缓存失效问题

从日志可见拉取代码后执行了Removing .m2/,直接清空了项目目录下的.m2文件夹,导致缓存完全失效:

  • 检查是否存在自定义before_script或Runner默认清理规则删除.m2目录,移除rm -rf .m2/相关命令;
  • 确认全局cache配置的paths和key策略合理,使用分支名作为缓存key可避免分支间缓存冲突,同时确保缓存能被正确拉取和更新。

2. 复用宿主机Maven仓库缓存

当前Runner已挂载/.m2到容器,但Pipeline中MAVEN_OPTS指定Maven使用项目目录下的仓库,未利用宿主机共享缓存:

  • 修改MAVEN_OPTS为-Dmaven.repo.local=/.m2/repository,让容器直接读写宿主机挂载的.m2目录,所有构建任务共享宿主机的依赖缓存,无需每次重新缓存;
  • 确保宿主机/.m2目录权限正确,Docker容器内用户拥有读写权限。

3. 优化Docker镜像拉取效率

  • 给本地Docker配置镜像加速器,减少docker:dind、Maven基础镜像的拉取时间;
  • 提前在宿主机拉取所有所需镜像(maven:3.8.5-openjdk-17-slim、docker:dind、openjdk:17-jdk-slim-buster),避免每次构建重复拉取。

4. 优化Maven构建命令

  • 保留Maven增量构建默认行为,避免全量编译;
  • 根据Mac CPU核心数调整并行构建参数-T,比如核心数的1.5倍,避免资源过载;
  • 构建阶段(build-job)添加-DskipTests,仅在测试阶段执行测试,减少构建环节工作量。

5. 统一Pipeline缓存策略

测试任务当前未复用全局.m2缓存,导致测试环节重新下载依赖:

  • 修改test-job的缓存配置,同时继承全局.m2缓存和Sonar专属缓存:
    test-job:
      cache:
        - key: "$CI_BUILD_REF_NAME"
          paths:
            - .m2/repository/
        - key: "${CI_JOB_NAME}"
          paths:
            - .sonar/cache
      # 其他配置不变
    

6. 使用预缓存自定义Maven镜像

  • 基于maven:3.8.5-openjdk-17-slim制作自定义镜像,在Dockerfile中执行mvn dependency:go-offline提前下载项目常用依赖,推送到本地镜像仓库或GitLab容器仓库;
  • 后续构建直接使用该自定义镜像,大幅减少依赖下载时间。

7. 优化Runner资源配置

  • 在config.toml中设置concurrent = 2(根据Mac性能调整),同时通过runners.docker.limit限制每个容器的CPU/内存资源;
  • 启用Docker层缓存,减少容器启动时间;
  • 针对不需要docker:dind的任务,移除对应的services配置,避免不必要的服务启动等待。

内容的提问来源于stack exchange,提问作者Gfalco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:45:31