如何为gitlab ci runner启用maven工件缓存?

hel*_*elt 43 maven gitlab-ci gitlab-ci-runner gitlab-8

我们使用gitlab ci和共享运行器来进行持续集成.对于每个构建,运动员下载大量的maven工件.

有没有办法配置gitlab ci来缓存这些工件,这样我们可以通过阻止一遍又一遍地下载相同的工件来加快构建过程?

小智 55

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

一个缓存构建中所有作业依赖项的示例:

cache:
  paths:
    - .m2/

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=.m2"

maven_job:
  script:
    - mvn clean install
Run Code Online (Sandbox Code Playgroud)

  • 现在是2017年和新人:`GitLab`维护[一个不错的项目] [1],其CI跑者的样本配置.[示例Maven项目] [2]文件演示了如何缓存maven工件.[1]:https://gitlab.com/gitlab-org/gitlab-ci-yml/tree/master [2]:https://gitlab.com/gitlab-org/gitlab-ci-yml/blob/master /Maven.gitlab-ci.yml (27认同)
  • 在我改变`-Dmaven.repo.local = .m2/repository`中的`-Dmaven.repo.local = .m2`之前,这对我不起作用. (10认同)
  • 更新到@zloster链接.Gitlab在这些链接中弃用了该项目.更新的链接是https://gitlab.com/gitlab-org/gitlab-ce/tree/master/lib/gitlab/ci/templates (5认同)
  • 是否可以在项目之间共享缓存的工件? (4认同)
  • 更新@antonkronaj 链接。项目 'gitlab-org/gitlab-ce' 已移至 ['gitlab-org/gitlab-foss'](https://gitlab.com/gitlab-org/gitlab-foss/-/tree/master/lib/gitlab /ci/模板)。 (2认同)

Ond*_*pek 10

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

cache:
  paths:
    - ./.m2/repository
  # keep cache across branch
  key: "$CI_BUILD_REF_NAME"
Run Code Online (Sandbox Code Playgroud)

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

此外,本地Maven存储库是当前目录的子级是至关重要的.出于某种原因,把它放进/cache/builds我没有工作,即使从GitLab有人声称它应该.

gitlab-ci.ymlMaven + Java 的工作配置文件示例:

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"
Run Code Online (Sandbox Code Playgroud)

  • @GGO `MAVEN_OPTS` 是 Maven 自动使用的众所周知的环境变量。 (4认同)

Nic*_*ter 6

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

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

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
Run Code Online (Sandbox Code Playgroud)

2) 引用 PV 以获取作为 runner pod 中卷的声明:

[[runners.kubernetes.volumes.pvc]]
  name = "pvc-1"
  mount_path = "/path/to/mount/point1"
Run Code Online (Sandbox Code Playgroud)

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

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

[[runners]]
  executor = "kubernetes"
  # ...
  cache_dir = "/path/to/mount/point1"
Run Code Online (Sandbox Code Playgroud)

或者

--cache-dir "/path/to/mount/point1"在交互模式下

-Dmaven.repo.local4)在选项中使用“/path/to/mount/point1”目录


小智 5

您可以将缓存文件夹添加到gitlab-ci runner配置并将其传递给maven.

/etc/gitlab-runner/config.toml

[[runners]]
...
  [runners.docker]
  ...
   volumes = ["/cache", "/.m2"]
  ...
Run Code Online (Sandbox Code Playgroud)

.gitlab-ci.yml

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

build:
  script:
    - mvn package
Run Code Online (Sandbox Code Playgroud)


Ion*_*uta 5

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

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

基本上,您需要这些行:

cache:
  paths:
    - .m2/repository
Run Code Online (Sandbox Code Playgroud)

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