在Gitlab-CI中正确缓存Maven依赖项

时间:2019-06-08 12:55:52

标签: maven caching continuous-integration gitlab

我已经配置并按照设置进行工作

  • gitlab-ci,它使用docker-machineRunner并将缓存上传到S3
  • 具有已配置缓存的Maven构建
  • 正确缓存并上传每个作业

但是问题是,每次我运行mvn install时,本地maven存储库中的某些内容都会发生变化(我假设它会更新pom元数据),并且gitlabRunner在每次构建时都会不断上传新版本的缓存。

enter image description here

与每次从Internet上下载Dep相比,使用这种“破坏的”缓存仍然更快,更可靠,但是上载可能要花很长时间,我想省掉这额外的时间。

如何修改我的构建以强制Maven生成可缓存本地存储库?

.gitlab-ci.yml的简化版本:

variables:
  # we have a custom java+maven image, that uses this ENV variable,
  # to auto-configure path where to put the local maven repository
  MAVEN_LOCAL_REPOSITORY: $CI_PROJECT_DIR/.cache/maven

job-build:
  stage: build
  image: internal-gitlab/java/maven:3.6-jdk8-alpine
  script:
    - mvn -B clean package
  cache:
    key: backend-dependencies
    paths:
      - .cache/

2 个答案:

答案 0 :(得分:0)

您有一个常量作为缓存键。也许更细粒度的缓存会有所帮助。 See the link here

答案 1 :(得分:-1)

简而言之-准备具有所需依赖项的自己的Maven映像,并使用它代替internal-gitlab / java / maven:3.6-jdk8-alpine。

一些细节:

首先,您需要创建一个maven docker映像,其中显示了项目依赖项所需的全部(或大部分)。将其发布到注册表(gitlab有一个注册表),并使用它代替internal-gitlab / java / maven:3.6-jdk8-alpine。

要创建这样的图像,我通常会在CI中手动创建一个附加作业。您需要在初始阶段以及对项目依赖项进行大量修改时触发它。

可以在这里找到工作示例:

https://gitlab.com/alexej.vlasov/syncer/blob/master/.gitlab-ci.yml -该项目正在使用准备好的图像,并且它还有准备工作。

https://gitlab.com/alexej.vlasov/maven/blob/master/Dockerfile -dockerfile运行maven并下载依赖项一次。

优点:

  • 不需要每次都下载依赖项-它们位于内部 docker映像(并且docker层缓存在运行程序上)
  • 工作完成后不需要上传工件