在GitLab-CI中设置不同过期时间的多个路径

125次阅读
没有评论

问题描述

在使用GitLab-CI时遇到了问题,他想在不同阶段之间保留build目录中的构建产物。然而,GitLab-CI在不同阶段之间会清除已创建的构建产物,这似乎很奇怪。用户想要在构建阶段和测试阶段之间存储构建产物,但构建阶段中也包含了他想保留的构建产物,同时还有下一阶段所需的构建产物。

用户尝试了使用artifacts选项,但是在尝试使用多个paths定义时,只有第二个paths定义(build/test*路径)起作用,而第一个paths定义(.dmg路径)被忽略了。

以下是他尝试过的定义:

artifacts:
  paths:
    - build/*.dmg
  expire_in: 1 week
  paths:
    - build/test1
    - build/test2
    - build/test3
  expire_in: 15 mins

他还尝试过使用caches,但似乎无法正常工作。他希望能得到一些建议。

解决方案

根据社区中的回答,目前没有直接的方法在artifacts选项中为不同的路径设置不同的过期时间。但可以通过一些变通的方式来实现这一目标。

方案1:分阶段设置过期时间

这个方法将任务分为多个阶段,并在各个阶段中设置不同的过期时间。以下是一个可能的解决方案:

阶段1:构建并存储所有构建产物

build_stage:
  script:
    - build
  artifacts:
    paths:
      - build/*.dmg
      - build/test1
      - build/test2
      - build/test3
    expire_in: 15 mins

阶段2.1:进行下一个正式阶段的工作(例如运行测试)

test_stage:
  script:
    - test
  dependencies:
    - build

阶段2.2:与阶段2.1并行运行,仅设置新的构建产物过期时间

overwrite_artifact_stage:
  script:
    - echo 'saving artifact'
  artifacts:
    paths:
      - build/*.dmg
    expire_in: 1 week

这种方法的思路是,通过分阶段的设置,将不同的构建产物放在不同的阶段中,并通过阶段2.2来重新设置过期时间。

方案2:为每个作业单独定义路径

这个方法是针对每个作业(job)单独定义路径,并设置各自的过期时间。这种方法需要在每个作业中定义artifacts选项。

build:
  script:
    - buildjob
  artifacts:
    paths:
      - build/test1
      - build/test2
      - build/test3
    expire_in: 15 mins

test:
  script:
    - testjob
  artifacts:
    paths:
      - build/*.dmg
    expire_in: 1 week

需要注意的是,这种方法需要在每个作业中都定义artifacts选项,但它可以实现不同路径的不同过期时间。

总结

在GitLab-CI中,目前无法直接为不同路径设置不同的过期时间。但通过分阶段设置过期时间或为每个作业单独定义路径,可以实现类似的效果。根据实际需求,选择合适的方法来管理构建产物的过期时间。

正文完