如何在 gitlab 管道中"wait"外部阶段,直到所有 gitlab 内部阶段都完成?



我在gitlab-ci.yml中定义了3个阶段。当有一个新的提交时,管道运行,这3个阶段并行运行,这是预期和需要的。(这些阶段运行一些必要的步骤,比如对代码的安全检查和其他检查功能)。我还让Scalr(另一个提供者)将外部阶段注入到相同的管道中(这些阶段运行地形策略检查、计划和应用)。

然而,问题是这些外部阶段与上面提到的内部阶段并行启动。我希望gitlab暂停任何执行外部阶段,直到内部(pre-req)阶段完成后。

如果你想知道,运行地形计划并应用为gitlab内部阶段不是一个选择。

如何完成这个?

GitLab有一个超级健壮的API。这可能是这里的方法。

条款我确实想标准化一些术语,这样我就可以确保我的建议是有意义的。你说你的stages是并行运行的-但它是jobs在给定stage内并行运行。对于我的回答,我将假设你的意思是你有一个单阶段在'内部回购'包含3个作业。

设置
  • 在您的'内部存储库'中创建第二个stage,其中包含单个作业。
  • 第二阶段中的单个作业将作为同步器工作,因为第二阶段将在第一阶段中的所有作业完成之前开始。
  • 这个作业应该有一个单一的活动,这是调用您的"外部管道";使用GitLab作业API。您将配置一个触发器来播放被设置为仅手动的作业。https://docs.gitlab.com/ee/ci/triggers/
  • 配置"外部作业";设置为manual: true。这将阻止他们开始,直到他们得到了允许。

例子
stages:
  - test
  - remote_trigger
Linter:
  script:
    - echo "I linted lol!"
  stage: test
Security Check:
  script:
    - echo "I so secure!"
  stage: test
Start Terraform:
  script:
    - curl --request POST --form "token=$CI_JOB_TOKEN" --form ref=master "https://gitlab.example.com/api/v4/projects/9/trigger/pipeline"
  stage: remote_trigger

这将在2个阶段创建3个作业-一旦所有并行作业(安全检查&在第一阶段完成后,可以开始进行地形改造。

最新更新