我有多个工作使用单个外部资源(服务器)。第一项工作将应用程序部署到环境中,第二项在此环境中执行测试,第三项在此环境中执行集成测试。
我知道有资源组选项。但是它仅锁定作业。如果两条管道并行运行,我需要执行job1
,job2
,job3
从第一管线,只有当第一管线释放的资源-第二个管道可以启动jobs1-3
。有没有办法做到这一点?管道中还有其他工作-它们应该同时工作。
我有多个工作使用单个外部资源(服务器)。第一项工作将应用程序部署到环境中,第二项在此环境中执行测试,第三项在此环境中执行集成测试。
我知道有资源组选项。但是它仅锁定作业。如果两条管道并行运行,我需要执行job1
,job2
,job3
从第一管线,只有当第一管线释放的资源-第二个管道可以启动jobs1-3
。有没有办法做到这一点?管道中还有其他工作-它们应该同时工作。
Answers:
设置作业1-3的专用转轮。
使用唯一标签(例如'jobs-1-2-3')设置新跑步者,并将选项设置concurrent
为1
。
在问题中添加唯一标签,例如“ jobs-1-2-3”。
job1:
tags:
- jobs-1-2-3
job2:
tags:
- jobs-1-2-3
job3:
tags:
- jobs-1-2-3
恕我直言,这是更少的努力,更可靠。
我认为可以通过needs
和resource_group
关键字以及gitlab API 来实现。
每个作业都会以形式接收其所属的管道ID predefined-variable
。如果使用gitlab api,则可以查看管道中其他作业的状态。如果您可以使用此状态needs
以及resource_group
关键字,我认为您可以实现预期的目标。有关更多详细信息,请参见以下代码的说明及其注释。
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.
(我没有亲自测试过,因此此方法需要进行审查。)
参考:
traffic_light
作业的正确性,则应该等待并发管道中作业1-3的执行完成。我不喜欢这种方法-您的ci分钟将浪费在检查并发管道的状态上。
traffic_light
使用tags
关键字。如今,许多云供应商都提供免费层实例,这些实例足以运行诸如之类的简单等待作业traffic_light
。