我使用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
阶段按典型的延迟运行,但是如果我不想等待,可以允许我强制启动它。我已经查看了rules
和needs
和when
的配置选项,希望找到一种方法来实现我的目标,但我一直找不到有效的解决方案。
我尝试过的一些事情,没有运气:
full_deploy
作业,该作业是手动的,并且不依赖于canary_deploy
阶段,但是感觉有些不客气。实际上,我的配置比我在这里进行的配置要复杂一些,因此实际上有几个特定于区域的部署作业,我希望不必重复每个作业。rules
考虑上一阶段的状态并制作full_deploy
手册。这是不可能的,因为rules
是在管道创建时执行的,并且无法在运行时动态调整此属性。canary_deploy
更改为允许失败,从而有效地立即解除了第二阶段的封锁。这里的问题是,它导致延迟计时器在创建管道时立即开始倒计时,而不是等待第一阶段完成。答案 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_manual
和full_automatic
作业都将使用它。在运行管道时,您可以选择先运行哪个作业(手动还是金丝雀):
Screenshot of the GitLab UI for selecting which job to run
通过指定needs: []
,您告诉GitLab,full_manual
作业不依赖于任何其他作业,并且可以立即执行而无需运行之前canary_deploy
的作业。
执行full_manual
时,不会执行canary
作业: