如何让gitlab按顺序运行作业?

Ale*_*lex 6 gitlab

我有一个gitlab-ci.yml如下所示的文件:

stages:
  - test
  - job1
  - job2


test:
  stage: test
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
  script:
    ...

myjob1:
  stage: job1
  script:
    ...


myjob2:
  stage: job2
  script:
    ...
Run Code Online (Sandbox Code Playgroud)

根据此处的文档(或者至少我的理解),第一阶段/作业仅在我创建合并请求时运行。

这是事实,但是当第一个作业 ( ) 启动时,下一个阶段 ( job1) 会并行运行。test据我了解,按test-> job1-> job2)顺序定义的阶段始终按顺序运行。

那么我做错了什么?为什么作业testjob1运行是并行的,而不是按预期顺序运行?

Ale*_*lex 5

经过大量的尝试和错误以及阅读和重读那些真正不清楚和令人困惑的文档的部分之后,我可能已经找到了解决方案。

首先,您只想在合并请求上运行的阶段(或者如果您计划触发器或手动启动管道则不想运行的阶段),您需要按如下方式更改该阶段:

test:
  rules:
    - if: $CI_PIPELINE_SOURCE == "web" || $CI_PIPELINE_SOURCE == "schedule"
      when: never
    - when: on_success
  stage: test
  script:
    - 'echo "Running Test"'
    - 'echo $CI_PIPELINE_SOURCE'
Run Code Online (Sandbox Code Playgroud)

在这里,您定义一个规则来检查变量CI_PIPELINE_SOURCE是否为webschedule。如果变量是,web这意味着手动管道触发器(即您手动按下Run pipeline,这在文档中没有解释),或者如果管道是由计划触发的(未测试,但我认为这就是意思)。schedule

因此,如果管道是由计划事件或手动触发的,never则告诉 gitlab 不要执行该阶段。这when: on_success就像一个else声明,告诉 gitlab 在任何其他情况下运行该阶段。

然而,这并不是完整的故事。因为当你使用git更改代码并通过 推送到 gitlab 时git push,你在 gitlab 中有两个触发器!一个触发器merge_request_event和一个触发器push。这意味着管道启动了两次

为了避免管道启动两次,您需要使用密钥workflow,这有助于定义管道(=工作流)是否运行。(这个词的workflow意思似乎是pipeline)。这是要放入文件中的代码gitlab-ci.yml

workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      when: never
    - when: always
Run Code Online (Sandbox Code Playgroud)

当触发器为 时,此构造会抑制要运行的管道merge_request_event。在这种情况下,不会运行附加管道。在所有其他情况下(当触发器为 例如 时push),管道将运行。

这是完整的gitlab-ci.yaml代码:

workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      when: never
    - when: always


stages:
  - test
  - stage1
  - stage2


test:
  rules:
    - if: $CI_PIPELINE_SOURCE == "web" || $CI_PIPELINE_SOURCE == "schedule"
      when: never
    - when: on_success
  stage: test
  script:
    - 'echo "Running Test"'

my_stage1:
  stage: stage1
  script:
    - 'echo "Running stage 1"'


my_stage2:
  stage: stage2
  script:
    - 'echo "Running stage 2"'
Run Code Online (Sandbox Code Playgroud)

如果您创建了git push一个管道,则将使用阶段testmy_stage1my_stage2运行一个管道,并且当您手动启动管道或由计划触发管道时,将使用阶段my_stage1和启动一个管道my_stage2

至于为什么会如此复杂和令人困惑,我一点也不知道。

  • 这可能会使管道稍微不那么混乱:https://dev.to/jphi_baconnais/gitlab-cheatsheet-1-basics-of-stages-and-jobs-14p0 (2认同)