如何在构建之间缓存 Maven 存储库?

How to cache maven repository between builds?

我的目标是能够构建、打包和测试 java 使用 maven 使用 councourse 构建管道构建的项目。

这样的设置已经到位,一切运行良好,但由于我们的 nexus 的 maven 下载率很低,构建时间太长了。

我的构建作业 yml 文件使用以下资源作为 maven 构建的基础:

# ...
image_resource:
  type: docker-image
  source:
    repository: maven
    tag: '3.3-jdk-8'
# ...

我知道这样一个事实,即每个建筑都有一个 "blank slate" 是某种程度上由设计内置到大厅中的。

现在我的问题是:什么是缓存本地 Maven 存储库的好方法(比如,至少有一些基本的东西,比如 Spring 和它的依赖项)?

我想到以下选项:

  1. 使用 docker 已经内置依赖项的图像
  2. 创建资源以提供所需的依赖关系

据我所知,选项 1) 不会使构建的下载大小变小,因为大厅似乎不会缓存用作构建作业基础的 docker 图片(或者我错了在吗?)

在我继续之前,我想确保以下选项 2) 给我任何优势 - 大厅缓存 docker 图像是否用作资源?

我可能会错过一些东西,因为我对课程比较陌生。如果我强迫你在这里陈述显而易见的事情,请原谅我。 :)

  • 假设您的 Nexus 是本地的,我会调查为什么下载率很低,因为在本地使用 Nexus 和 Artifactory 之类的东西是目前进行缓存的最简单方法。它们将管理您缓存的依赖项的生命周期,这样您就不会将依赖项缓存得比它们需要的时间更长,并且新的依赖项会在使用时添加。
  • 如果要在作业的任务之间共享缓存,则 output the cached dependencies folder (.m2 folder for maven) of a task and use that as an input 另一个任务。作为参考,请参见以下示例:
 ---
 jobs:
   - name: create-and-consume
     public: true
     plan:
       - task: make-a-file
         config:
           platform: linux
           run:
             # ...
           outputs:
             # ensure that relative .m2 folder is used: 
             - name: .m2
       - task: consume-the-file
         config:
           platform: linux
           inputs:
             - name: .m2
           run:
             # ...
  • 如果要在作业中的单个任务的所有执行之间共享缓存,也可以将任务配置为cache folders
  • 如果你想在作业之间缓存,那么你可以:

我认为 Concourse CI 会缓存 docker 用于任务的图像,但也可以将它们作为管道的资源,然后使用 [=16= 的 image parameter of the task to pass that resource. You can see what is cached and for how long using the volumes 命令].

我可以确认 concourse 实际上确实缓存了 docker 个图像,因此创建一个具有所有依赖项的图像可能是一个不错的选择。

您可以使用 git 资源类型用于缓存您的 Maven 缓存的相同机制,就像他们现在在这里所做的那样:https://github.com/ymedlop-sandbox/npm-cache-resource(不是我的回购协议)