如何使用本地gitlab-runner测试job2且无需每次重复运行耗时的job1
实现方案
你完全可以通过以下几种方式复用job1的输出,无需每次测试job2都重新运行job1:
方法1:使用CI制品 + 手动触发job(最易用,无需修改runner配置)
- 先在
.gitlab-ci.yml中给job1配置制品规则,指定要保留的输出目录/文件,设置足够长的过期时间:
job1: script: # 你的job1原有脚本 artifacts: paths: - ./job1_output/ # 替换为你的实际输出路径 expire_in: 7d # 按需设置保留时长
- 运行一次完整流水线生成job1的制品后,后续修改完job2的配置,只需要在GitLab流水线页面找到对应的job2,点击手动运行即可,GitLab会自动将job1生成的制品注入到job2的运行环境中,不会触发job1重跑。
- 如果是用
gitlab-runner exec本地测试job2,执行命令时加上--artifacts-download-from参数指定本地保存的job1制品路径即可。
方法2:本地挂载持久化目录(适合本地频繁测试job2的场景)
如果你用的是docker executor,跑job1时直接将输出目录挂载到宿主机本地路径:
gitlab-runner exec docker job1 --docker-volumes /本地/宿主机/保存路径:/容器内/job1输出路径
后续测试job2时,执行命令带上同样的挂载参数:
gitlab-runner exec docker job2 --docker-volumes /本地/宿主机/保存路径:/容器内/job1输出路径
job2可以直接读取挂载路径里已经生成好的job1输出,完全不需要运行job1。
如果你用的是shell executor,操作更简单:跑完一次job1后,不要清理runner的工作目录,后续跑job2时会直接复用工作目录里的已有文件。
方法3:commit容器镜像(适合job1有大量环境配置/依赖安装的场景)
如果job1不仅输出文件,还安装了很多依赖、配置了运行环境,你可以在跑完一次job1后,将对应的运行容器保存为自定义镜像:
- 跑完job1后执行
docker ps -a找到刚运行完job1的容器ID - 执行
docker commit <容器ID> job1-built:v1生成自定义镜像 - 修改job2的配置,指定image为刚才生成的镜像:
job2: image: job1-built:v1 script: # 你的job2原有脚本
后续跑job2时会直接使用这个已经完成job1所有操作的镜像,不需要再重新执行job1的逻辑。
关于你问的是否可以保存runner状态:是完全可以的,以上三种方案本质都是对job1运行后的状态/产物进行持久化保存,你可以根据自己的使用场景选择对应的方案即可。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

