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