如何为gitlab CIRunner启用Maven工件缓存?

How to enable maven artifact caching for gitlab ci runner?

我们将gitlab ci与共享跑步者一起使用来进行持续集成。对于每次构建,跑步者都会下载大量的Maven工件。

是否有一种方法可以配置gitlab ci来缓存这些工件,因此我们可以通过防止一次又一次地下载相同的工件来加快构建过程?


Gitlab CI允许您基于每个作业或构建来定义某些路径,其中包含应在构建之间缓存的数据(有关更多详细信息,请参见此处)。结合khmarbaise的建议,可以将其用于缓存多个版本之间的依赖关系。

在您的版本中缓存所有作业依赖项的示例:

1
2
3
4
5
6
7
8
9
10
cache:
  paths:
    - .m2/repository

variables:
  MAVEN_OPTS:"-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository"

maven_job:
  script:
    - mvn clean install


根据GitLab的问题跟踪器上的对话,我设法更改了Maven本地存储库路径,并将其放入./.m2/repository/目录,然后我们将在全局运行之间添加以下全局块,以将其保留在CI配置中:<铅>

1
2
3
4
5
cache:
  paths:
    - ./.m2/repository
  # keep cache across branch
  key:"$CI_BUILD_REF_NAME"

不幸的是,根据这个StackOverflow回答,只能在每次运行时使用-Dmaven.repo.local或通过编辑settings.xml来设置maven本地存储库路径,这在gitlab-ci配置脚本中是一项繁琐的任务。一种选择是使用默认的Maven选项设置变量,并将其传递给每次运行。

此外,至关重要的是,本地Maven存储库是当前目录的子级。出于某种原因,即使将它放在/cache/builds中对我也不起作用,即使来自GitLab的人声称应该也可以。

用于Maven Java的有效gitlab-ci.yml配置文件的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
image: maven:3-jdk-8

variables:
  MAVEN_OPTS:"-Djava.awt.headless=true -Dmaven.repo.local=./.m2/repository"
  MAVEN_CLI_OPTS:"--batch-mode --errors --fail-at-end --show-version"

cache:
  paths:
    - ./.m2/repository
  # keep cache across branch
  key:"$CI_BUILD_REF_NAME"

stages:
  - build
  - test
  - deploy

build-job:
  stage: build
  script:
    -"mvn clean compile $MAVEN_CLI_OPTS"
  artifacts:
    paths:
      - target/

unittest-job:
  stage: test
  dependencies:
    - build-job
  script:
    -"mvn package $MAVEN_CLI_OPTS"
  artifacts:
    paths:
      - target/

integrationtest-job:
  stage: test
  dependencies:
    - build-job
  script:
    -"mvn verify $MAVEN_CLI_OPTS"
  artifacts:
    paths:
      - target/

deploy-job:
  stage: deploy
  artifacts:
    paths:
      -"target/*.jar"


被接受的答案对我没有帮助。

正如zlobster所提到的,GitLab的家伙拥有这个惊人的存储库,您可以在其中找到用于Maven项目的.gitlab-ci.yml文件的正确示例。

基本上,您需要以下几行:

1
2
3
cache:
  paths:
    - .m2/repository

请记住,如果您决定为某个作业添加本地缓存,则上面添加的全局缓存将被替换。有关此的更多信息。


您可以将缓存文件夹添加到gitlab-ci Runner配置中,并将其传递给Maven。

/etc/gitlab-runner/config.toml

1
2
3
4
5
6
[[runners]]
...
  [runners.docker]
  ...
   volumes = ["/cache","/.m2"]
  ...

.gitlab-ci.yml

1
2
3
4
5
6
variables:
  MAVEN_OPTS:"-Dmaven.repo.local=/.m2"

build:
  script:
    - mvn package


如果您使用kubernetes作为gitlab-runner的执行器,则还可以使用Maven缓存。我选择在具有k8s PV的NFS上具有持久性缓存(但是gitlab-runner支持其他卷类型)。由于NFS提供的持久性,因此以下配置未使用缓存gitlab功能。

1)在群集上创建一个PersistentVolume,在此处使用NFS(适用于您的持久层和您的选项):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gitlabrunner-nfs-volume
spec:
  capacity:
    storage: 10Gi
  mountOptions:
    - nolock
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /gitlabrunner
    server: 1.2.3.4

2)引用PV以获得流道容器中的体积索赔:

1
2
3
[[runners.kubernetes.volumes.pvc]]
  name ="pvc-1"
  mount_path ="/path/to/mount/point1"

注意(03/09/18):这些参数的命令行选项尚不存在。有一个未解决的问题。

3)为gitlab-runner缓存指定相同的路径:

1
2
3
4
[[runners]]
  executor ="kubernetes"
  # ...
  cache_dir ="/path/to/mount/point1"

交互模式下的

--cache-dir"/path/to/mount/point1"

4)使用-Dmaven.repo.local选项

中的" / path / to / mount / point1"目录


还有另一种方法。不要使用gitlab缓存并使用自定义(每个项目)的docker映像。

一些细节:

首先,您需要创建一个maven docker映像,其中显示了项目依赖项所需的全部(或大部分)。将其发布到您的注册表(gitlab有一个注册表),并将其用于运行maven的任何作业。

要创建这样的图像,我通常会在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层缓存在运行程序上)
  • 作业完成后不需要上传工件
  • 缓存未下载到作业中不使用Maven


我能够使用主机卷共享我的.m2存储库目录。这还具有共享我的settings.xml文件的优点(并非每个人都想要)。我发现这比使用提到的cache解决方案要快。

1
2
3
[[runners]]
  [runners.docker]
    volumes = ["/home/<user>/.m2:/root/.m2"]

使用CI_PROJECT_DIR变量(克隆存储库和运行作业的完整路径)时,无需在变量部分声明MAVEN_OPTS。

1
2
3
4
cache:
    key: maven-cache
    paths:
    - $CI_PROJECT_DIR/.m2/