Gitlab通过触发或更改来运行作业

时间:2020-01-31 14:10:12

标签: continuous-integration gitlab devops gitlab-ci gitlab-api

我试图在两种情况之一后触发CI中的特殊工作

  1. 在同一管道中触发另一个作业 或
  2. 更改:somefile.txt

我的CI如所述

job1:
    stage: build
    script: 
    - echo "JOb1"
    - curl -X POST -F token=2342344444 -F "variables[TRIGGER_JOB]=job1" -F ref=master https://main.gitlab.myconmpanyxyz.com/api/v4/projects/1234/trigger/pipeline
    only:
     changes:
     - job1.md

job2: # This does not RUN as expected because of the TRIGGER_JOB set to job1
    stage: test
    script: 
    - echo "Job2"   
    rules:
    - if: $TRIGGER_JOB =="job2"

job3: # this RUNS as expected because of VARIABLE TRIGGER_JOB
    stage: test
    script: 
    - echo "Job3"   
    rules:
    - if: $TRIGGER_JOB =="job1"

job4: # this also RUNS, but this should not be the expected behavior 
    stage: test
    script: 
    - echo “job4“   
    rules:
    - if: $TRIGGER_JOB == "xyz"
    - changes: 
      - job4.md

在job1完成之后,还需要调用job4,并且不要调用任何其他作业(在本例中为job2)。所以我正在使用CURL来调用作业本身。如果在同一个配置项中有更好的调用特定作业的方法,也请告诉我。 我已经看过this堆栈溢出页面,但这无济于事,因为我的工作需要由 2个条件之一触发,这是不允许的gitlab-ci位。

我需要通过以下两个条件之一来调用job4-如果 TRIGGER_JOB ==“ job1” 或job4.md 文件中有任何更改。 当前,如果在job4.md文件中进行了更改,job4将运行,但是如果job1被触发,它也将运行。但是afaik这不应该是预期的行为。 docs。任何人都可以给我一些如何创建这种设计的线索。

1 个答案:

答案 0 :(得分:0)

您的解决方案几乎是正确的,但是仅当管道由changes或{{1触发时,才可以使用带有onlyexcept的{​​{1}}关键字}}事件。这在变量push中定义。当您通过调用API触发管道时,变量merge_request包含值CI_PIPELINE_SOURCE,因此CI_PIPELINE_SOURCE始终返回true,从而再次触发trigger并以无限循环结束。您可以向您的only:changes添加一个简单的job1规则来防止这种情况:

except

您可以在the documentation中找到有关job1的更多信息。