0

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

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

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

无论如何要做到这一点?

4

1 回答 1

3

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 个作业 - 一旦第一阶段中的所有并行作业(安全检查和 linter)完成,Terraform 步骤就可以开始了。

于 2021-01-15T23:38:05.970 回答