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本地存储库路径,并将其放入
1 2 3 4 5 | cache: paths: - ./.m2/repository # keep cache across branch key:"$CI_BUILD_REF_NAME" |
不幸的是,根据这个StackOverflow回答,只能在每次运行时使用
此外,至关重要的是,本地Maven存储库是当前目录的子级。出于某种原因,即使将它放在
用于Maven Java的有效
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项目的
基本上,您需要以下几行:
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" |
或
交互模式下的
4)使用
中的" / 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
我能够使用主机卷共享我的
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/ |