Gitlab CI:为什么允许下一阶段 运行

Gitlab CI: Why next stage is allowed to run

我有一个这样的 gitlab CI 文件

stages:
  - build
  - deploy

build-job:
  stage: build
  script:
    - echo "Compiling the code..."
    - echo "Compile complete."
  when: manual

deploy-bridge:
  stage: deploy
  trigger:
    project: tests/ci-downstream

据我了解,除非手动构建作业 运行 成功,否则部署桥阶段不应 运行。但这里不是这种情况。这正常吗?

Jobs in the same stage run in parallel. Jobs in the next stage run after the jobs from the previous stage complete successfully.

您没有将 deploy-bridge 作业定义为 dependent job, or that it needs 另一项要先完成的作业,因此它一到达舞台就可以 运行 立即完成。由于前一阶段都是 manual 个作业,GitLab CI/CD 将其解释为 'done',至少足以让其他阶段可以开始。

由于您似乎没有将 build-job 中的编译代码作为 artifact 上传,因此我们不能在此处使用 dependencies 关键字。该关键字所做的只是控制哪些作业的依赖项作业需要,但如果它需要先前作业的工件,则该作业将需要运行并成功完成 作业开始。此外,默认情况下,所有先前作业的所有可用工件都将被下载并可用于管道中的所有作业。 dependencies 关键字也可用于限制 作业实际需要的工件。但是,如果我们“依赖”的作业中没有可用的工件,则会抛出错误。幸运的是我们可以使用另一个关键字。

needs 关键字控制着流水线的“流动”,以至于如果流水线中的任何一个作业(即使在最后的 1,000 个阶段)有 needs: [] 它会运行 一旦管道启动(并且一旦有可用的 运行ner)。我们可以在此处使用 needs 使管道按您需要的方式流动。

...
deploy-bridge:
  stage: deploy
  needs: ['build-job']
  trigger:
    project: tests/ci-downstream

现在,在 build-job 成功完成之前,deploy-bridge 作业不会 运行。如果 build-job 失败,将跳过 deploy-bridge

needs 的另一个用途是它具有与 dependencies 相同的功能,因为它可以控制在哪些作业中下载哪些工件,但如果“需要”的工作根本没有工件。

dependenciesneeds 都接受空数组,这等同于“不下载任何工件”,对于 needs,运行 一旦 运行ner 可用。