有没有可能;锁;跨多个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.
(我自己没有测试过,所以这个方法需要检查。)

参考:


为作业1-3设置专用跑步器

  • 带有独特的标签,如“jobs-1-2-3”和

  • 将唯一标签(如“jobs-1-2-3”)添加到相关作业中

    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 for
    traffic\u light
    使用
    标记
    关键字。如今,许多云供应商提供免费的层实例,这些实例足以运行简单的等待作业,如
    traffic\u light
    。看起来gitlab即使在自托管的运行程序中也能计算分钟数。我正在尝试重试具有自托管运行程序标记的作业,但它不会启动并显示有关管道分钟数限制超出的消息:如果它与this()问题有关,则在超出配额后,特定运行程序似乎无法工作。我不确定这是否清楚,但这与您最初的问题没有直接关系,因此我建议在此处或gitlab上发布一个单独的问题。