如何使 gitlab 管道中的外部阶段“等待”直到所有 gitlab 内部阶段都完成?

时间:2021-01-15 19:35:40

标签: terraform gitlab-ci pipeline gitlab-ci-runner scalr

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

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

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

无论如何要做到这一点?

1 个答案:

答案 0 :(得分:3)

GitLab 有一个超级强大的 API。这可能是去这里的方式。

条款

我确实想对某些术语进行标准化,以便确保我的建议有意义。您说您的 stages 并行运行 - 但它是 jobsgiven 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 个作业 - 一旦第一阶段中的所有并行作业(安全检查和 linter)完成,Terraform 步骤就可以开始了。

相关问题