有没有可能;锁;跨多个gitlab管道的作业组
我有多个作业使用单个外部资源(服务器)。第一个作业将应用程序部署到环境中,第二个作业在此环境中执行测试,第三个作业在此环境中执行集成测试有没有可能;锁;跨多个gitlab管道的作业组,gitlab,gitlab-ci,Gitlab,Gitlab Ci,我有多个作业使用单个外部资源(服务器)。第一个作业将应用程序部署到环境中,第二个作业在此环境中执行测试,第三个作业在此环境中执行集成测试 我知道有选择。但它只锁定工作。如果两个管道同时运行,我需要从第一个管道执行job1,job2,job3,并且只有当第一个管道释放资源时,第二个管道才能启动jobs1-3。有没有办法做到这一点?还有其他工作正在进行中-它们应该同时工作。我认为可以通过需求和资源组关键字和gitlab API来实现 每个作业都会将其所属的管道id作为预定义变量接收。如果使用gitl
我知道有选择。但它只锁定工作。如果两个管道同时运行,我需要从第一个管道执行
job1
,job2
,job3
,并且只有当第一个管道释放资源时,第二个管道才能启动jobs1-3
。有没有办法做到这一点?还有其他工作正在进行中-它们应该同时工作。我认为可以通过需求
和资源组
关键字和gitlab API来实现
每个作业都会将其所属的管道id作为预定义变量接收。如果使用gitlab api,可以看到管道中其他作业的状态。如果您可以使用此状态,需要
和资源组
关键字,我认为您可以实现预期目标。有关更多详细信息,请参阅下面代码的说明及其注释
stages:
- ready
- build
job1:
stage: build
needs: [starting_signal]
script:
- sleep 10 && echo "job1"
job2:
stage: build
needs: [starting_signal]
script:
- sleep 20 && echo "job2"
job3:
stage: build
needs: [starting_signal]
script:
- sleep 30 && echo "job3"
starting_signal:
stage: ready
script:
- # TODO: You need to implement it using the GitLab API.
- # The starting condition for "job1-3" is
- # that this `starting_signal` job finished successfully.
- # And the condition that ends with the success of this job
- # is that `traffic_light` becomes running.
traffic_light:
stage: ready
resource_group: traffic_light
script:
- # TODO: You need to implement it using the GitLab API.
- # The end condition for `traffic_light` is
- # the end of job1-3 execution.
- # In other words, this job must be checked and waited
- # through gitlab api until job 1,2,3 is finished.
- # Since this job locks the execution of a `traffic_light` job
- # in another pipeline, the `starting_signal` job in another
- # pipeline does not succeed.
(我自己没有测试过,所以这个方法需要检查。)
参考:
job1:
tags:
- jobs-1-2-3
job2:
tags:
- jobs-1-2-3
job3:
tags:
- jobs-1-2-3
在与gitlab支持部门建立通信后,我认为这是一种更省力、更可靠的方法。。你可以用拇指向上投票。不确定它是否有效。可能的场景:管道1(p1)运行作业1(j1),然后管道2(p2)运行作业1(j1),然后管道1启动作业2。我需要p1运行j1、j2、j3,然后p2运行j1、j2、j3。看起来资源组也会这样做,因为新的运行程序一次只处理一个作业,并且由于唯一的标记,没有其他运行程序会选择作业,确保p2等待p1完成。还可以看到,我不想取消挂起的管道。正如我所说,还有其他工作——他们应该同时工作。那么,您是说如果两个管道正在运行,并且设置了并发选项-runner将始终从第一个管道中选择作业?是的,在处理p2中的作业之前,runner将在p1中完成作业。这个答案不再适用于最新的gitlab。作业执行顺序在管道之间混合。感谢您的回答。如果我在
交通灯作业中理解正确,我应该在并发管道中等待作业1-3的执行完成。我不喜欢这种方法—您的ci分钟数将浪费在检查并发管道的状态上。如果您担心ci分钟数,可以使用自托管gitlab runner fortraffic\u light
使用标记
关键字。如今,许多云供应商提供免费的层实例,这些实例足以运行简单的等待作业,如traffic\u light
。看起来gitlab即使在自托管的运行程序中也能计算分钟数。我正在尝试重试具有自托管运行程序标记的作业,但它不会启动并显示有关管道分钟数限制超出的消息:如果它与this()问题有关,则在超出配额后,特定运行程序似乎无法工作。我不确定这是否清楚,但这与您最初的问题没有直接关系,因此我建议在此处或gitlab上发布一个单独的问题。