问题描述
在使用Gitlab的CI/CD时,我有一个流水线(pipeline),其中包含以下步骤:
- 代码验证(code-verification)
- 一些测试(some tests)
- 部署(手动)(deploy)
- 更多测试(some more tests)
- 回滚(手动)(rollback)
其中,部署和回滚作业必须手动启动,因此我在我的gitlab-ci.yml文件中使用了when: manual
。
然而,我希望即使之前的某个步骤/作业失败了(例如,部署失败或者在“更多测试”阶段出现了失败),仍然可以启动回滚作业。我曾考虑使用when: always
,但由于我已经在使用when: manual
,所以无法实现(我尝试过了)。
目前,我将“更多测试”和“回滚”放在同一个阶段,这样一个步骤的失败不会影响另一个步骤。但是否有其他方法可以实现这一点呢?我真的希望将所有步骤都放在同一个流水线中(因此不使用触发器),并且始终有可能启动回滚作业,无论之前发生了什么。
解决方案
请注意以下操作可能受Gitlab版本影响,确保参考官方文档进行调整。
使用allow_failure
实现控制的回滚
在Gitlab CI/CD中,您可以使用allow_failure
属性来实现控制性的回滚。通过在您的测试作业中设置allow_failure: true
,即使其中的某个测试失败,整个流水线也不会中断,从而保留手动控制回滚的权利。以下是如何实现的步骤:
- 打开您的
gitlab-ci.yml
文件。 - 在您的测试作业中,将
allow_failure
属性设置为true
。 - 在回滚作业中,使用
when: manual
,以便您可以手动启动回滚。
以下是示例gitlab-ci.yml
文件的一部分:
stages:
- test
- deploy
- rollback
test_job:
stage: test
script:
- run your tests here
allow_failure: true # 允许测试失败,不会中断流水线
deploy_job:
stage: deploy
script:
- run your deployment here
when: manual
rollback_job:
stage: rollback
script:
- perform rollback actions here
when: manual
在上述示例中,我们将测试作业的allow_failure
属性设置为true
,以允许测试失败,但不会中断流水线。这样,即使测试失败,部署作业仍然会等待手动启动。回滚作业也设置为when: manual
,以便您可以手动控制何时启动回滚。
通过这种方式,您可以在保持手动控制的同时,即使部分作业失败,仍有可能启动回滚。这可以确保您始终有机会决定是否进行回滚操作,而不受之前步骤的影响。
请注意,具体的Gitlab版本可能会影响这些设置的行为。在使用之前,建议查阅官方文档以获取最新信息。
参考链接:Gitlab CI/CD – Jobs: allow_failure