如果前一阶段成功,是否可以将Gitlab CI管道作业配置为自动,否则可以手动配置?

时间:2020-09-12 02:13:21

标签: gitlab gitlab-ci

我使用Gitlab CI部署服务。目前,我只有一个部署作业,可以将更改发布到负载均衡器后面的每个服务器。

我想分阶段进行部署,在此过程中,我将部署到负载均衡器中的一台服务器,等待几分钟以烘烤并在出现问题时发出警报,然后自动继续部署到其余服务器。如果在延迟的全自动部署发生之前发生任何问题,我将手动取消该作业,以防止不良更改更加广泛地出现。

出于这个目标,我使用以下.gitlab-ci.yml配置了管道:

stages:
 - canary_deploy
 - full_deploy

canary:
 stage: canary_deploy
 allow_failure: false
 when: manual
 script: make deploy-canary

full:
 stage: full_deploy
 when: delayed
 start_in: 10 minutes
 script: make deploy-full

这相对来说效果很好,但是当我试图快速推出关键更改时遇到了一个问题。 Canary部署脚本已挂起,这阻止了第二个作业的启动,因为它必须等待第一阶段完成。在这种情况下,我宁愿完全跳过金丝雀,但由于管道的配置方式,无法手动调用完整部署。

理想情况下,我希望full_deploy阶段按典型的延迟运行,但是如果我不想等待,可以允许我强制启动它。我已经查看了rulesneedswhen的配置选项,希望找到一种方法来实现我的目标,但我一直找不到有效的解决方案。

我尝试过的一些事情,没有运气:

  • 我可以创建一个重复的full_deploy作业,该作业是手动的,并且不依赖于canary_deploy阶段,但是感觉有些不客气。实际上,我的配置比我在这里进行的配置要复杂一些,因此实际上有几个特定于区域的部署作业,我希望不必重复每个作业。
  • 除非上级成功,否则我试图使用rules考虑上一阶段的状态并制作full_deploy手册。这是不可能的,因为rules是在管道创建时执行的,并且无法在运行时动态调整此属性。
  • 我将canary_deploy更改为允许失败,从而有效地立即解除了第二阶段的封锁。这里的问题是,它导致延迟计时器在创建管道时立即开始倒计时,而不是等待第一阶段完成。

1 个答案:

答案 0 :(得分:1)

您可以做的一件事情来使重复full_deploy的工作少一些“ hacky”:定义一次,然后两次使用extends

stages:
 - canary_deploy
 - full_deploy

.full:
  script: make deploy-full

canary:
 stage: canary_deploy
 allow_failure: false
 when: manual
 script: make deploy-canary

full_automatic:
  extends: .full
  stage: full_deploy
  when: delayed
  start_in: 10 minutes

full_manual:
  stage: full_deploy
  extends: .full
  when: manual
  needs: []

这样,您只需定义一次scripts部分,并且full_manualfull_automatic作业都将使用它。在运行管道时,您可以选择先运行哪个作业(手动还是金丝雀):

Screenshot of the GitLab UI for selecting which job to run

通过指定needs: [],您告诉GitLab,full_manual作业不依赖于任何其他作业,并且可以立即执行而无需运行之前canary_deploy的作业。

执行full_manual时,不会执行canary作业:

Overview of executed pipeline jobs