如何仅为正在运行的管道缓存作业结果?

时间:2020-04-14 14:24:59

标签: maven gitlab-ci

我写了一条代码来用Maven构建Java应用程序。我的Git存储库中有功能分支和主分支,因此必须将Maven目标packagedeploy分开。因此,我在管道中创建了两个作业。最后一份工作需要第一份工作的工作结果。

我知道我必须缓存工作结果,但是我不想

  • 将工作结果显示到GitLab UI
  • 将其暴露给下一个管道

我尝试了以下解决方案,但没有成功。

使用cache

我关注了How to deploy Maven projects to Artifactory with GitLab CI/CD

缓存.m2/repository文件夹(存储所有Maven文件的位置)和target文件夹(将创建我们的应用程序的位置)对于通过运行所有Maven阶段来加快该过程很有用因此,按顺序执行mvn test会在必要时自动运行mvn compile

但是该解决方案在各点之间共享作业结果,请参见Cache dependencies in GitLab CI/CD

如果启用了缓存,则默认情况下,它会在项目级别的管道和作业之间共享,从GitLab 9.0开始。缓存不在项目之间共享。

,并且也不应将其用于同一管道中的缓存,请参见Cache vs artifacts

不要使用缓存在阶段之间传递工件,因为它旨在存储编译项目所需的运行时依赖项:

cache用于存储项目依赖项

缓存用于通过存储下载的依赖项来加快后续管道中给定作业的运行,这样就不必再次从Internet上获取它们(例如npm软件包,Go供应商)软件包等。)虽然可以将缓存配置为在阶段之间传递中间的构建结果,但应该使用工件来完成。

artifacts用于将在阶段之间传递的阶段结果。

工件是由作业生成的文件,存储并上载,然后可以在相同管道的后续阶段中由作业获取和使用。此数据在不同的管道中将不可用,但可以从UI中下载。

使用artifacts

此解决方案将作业结果公开到GitLab UI,请参见artifacts

工作完成后,工件将被发送到GitLab,并可在GitLab UI中下载。

并且在完成管道之后无法使缓存过期,请参见artifacts:expire_in

expire_in的值是经过的时间(以秒为单位),除非提供了单位。

有什么方法可以只为正在运行的管线缓存作业结果吗?

1 个答案:

答案 0 :(得分:1)

在GitLab中的作业之间无法发送构建工件,只能在管道运行时保留它们。这就是GitLab设计其CI解决方案的方式。

在GitLab中的作业之间发送构建工件的推荐方法是使用artifacts。此功能始终将文件上传到GitLab实例,在这种情况下,它们称为协调器。在编写时,可以通过GitLab UI使用这些文件。在大多数情况下,这是对空间的完全浪费,但是在极少数情况下,这非常有用,因为您可以下载工件并检查管道中断的原因。

项目成员至少可以使用Reporters来下载工件,但是如果启用了公共管道,则可以被所有人查看。您可以阅读有关权限here的更多信息。

要不填满硬盘或配额,应使用expire_in。如果您真的不想浪费空间,可以将其设置为仅几个小时。但是,我不建议这样做,好像依赖于这些工件的作业会失败,然后您重试,如果工件已过期,则必须重新启动整个管道。我通常把这个时间放在一个星期,以适应中级构建工件,因为这通常可以满足我的需求。

如果您要使用缓存来保留构建工件,可能是因为构建工件巨大,并且需要对其进行优化,则应该可以使用CI_PIPELINE_ID作为缓存(我尚未测试过):

cache:
  key: ${CI_PIPELINE_ID}

缓存中的文件应存储在安装了运行程序的位置。如果您确定所有需要这些构建工件的作业都由有权访问此缓存的运行者执行,则它应该可以工作。

您还可以尝试使用其他一些预定义的environment variables作为缓存的密钥。