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

How to make external stages in gitlab pipeline "wait" until all the gitlab internal stages are done?

我在gitlab-ci.yml中定义了3个阶段。当有新的提交时,管道 运行s 和这 3 个阶段 运行 并行,这是预期和需要的。 (这些阶段 运行 先决条件步骤,例如对代码和其他 linting 功能的安全检查)。我还有 Scalr(另一个提供商)将外部阶段注入同一个管道(这些 运行 terraform 策略检查和计划并应用)。

但是,问题在于这些外部阶段与上述内部阶段并行启动。我希望 gitlab 暂停任何执行外部阶段,直到内部(预请求)阶段完成后。

如果您想知道,运行将 terraform 计划并应用为 gitlab 内部阶段不是一种选择。

无论如何要完成这个?

GitLab 拥有超级强大的 API。这可能是去这里的路。

条款

我确实想对某些术语进行标准化,以确保我的建议有意义。你说你的 stages 是 运行 并联的-但是 jobs 运行 在 given stage。对于我的回答,我假设您的意思是您在 'internal repo' 上有一个 单阶段 ,其中包含 3 个作业。

设置

  • 在您的 'internal repository' 中创建第二个 stage,其中包含一个作业。
  • 第二阶段中的这个单一作业将用作同步器,因为第二阶段只有在第一阶段中的所有作业完成后才会开始。
  • 这个作业应该有一个 activity,它使用 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 个作业 - 一旦第一阶段的所有并行作业(安全检查和 linter)完成,Terraform 步骤就可以开始了。