作为部署的一部分,我有两个管道。
我将两个管道都设置为不允许同时运行-您无法在进行另一次清理时启动清理,也无法在已经运行另一部署的情况下启动部署。
但是,如果清理正在运行,我不希望开始部署。清理可能会错误地从Deploy下重置某些内容,并导致失败或更糟的是成功失败。
如何确保只有在清理未运行 时才运行部署?
更新:我知道这可能都是一个管道的一部分,但是为了澄清为什么这些管道是单独的管道,让我添加上下文。
Deploy管道大约有20个步骤,其中一些步骤是并行运行的。一种简化的外观是:
Bake and Deploy
Manifest as Canary
|
+------+------+
| | |
Tests Tests Tests
| | |
+------+------+
|
Enable Some Prod Traffic
|
+------+------+
| | |
Tests Tests Tests
| | |
+------+------+
|
Enable More Prod Traffic
|
Automated Canary Analysis
|
Enable More Prod Traffic
|
Automated Canary Analysis
|
Finish Rolling New Version
Into Production
清理大约有五个步骤,但归结为:
Ensure No Network Traffic Remains
Pointed at Canary Instances (Reset
Networking)
|
Delete Any Remaining Canary Instances
在Deploy管道中,如果任何初始并行测试集均失败,则需要运行该清理-重置网络并杀死金丝雀。如果任何自动Canary Analysis运行失败,则需要运行清理。成功部署结束后,我需要运行清理操作,以确保那里没有剩余的金丝雀。
据我所知,工作流程并不是程序性的。我无法“清除”清理操作。我也确实非常不想将这五个步骤复制/粘贴到可能成功或失败的每个位置。我还想确保,如果其他操作失败(例如启用产品流量的步骤或其他操作),则清除运行。我并非总能找到一种简单的“挂入”的简单方法。
除了可以根据这些条件触发的单独管道之外,我还没有发现任何类型的“错误时执行此步骤集”或“成功时执行此步骤集” 。
我的理想解决方案是使用伪代码:
try {
// do the deploy steps
}
finally {
// whether success or fail
// run the clean up steps
}
但是,鉴于我看到的无法在管道中进行尝试/最终操作的限制,每当Deploy完成(成功或失败)时,我都会触发Clean Up管道。但是,我看不出有什么可以阻止“清理”仍在运行时从启动中启动部署,因此,如果有一组备份更改都在等待部署,清理内容可能会清除我下面的内容
答案 0 :(得分:0)
我不认为Spinnaker具有该特定功能,但是您可以做的一件事是让Deploy
和Clean Up
阶段在同一管道的所有部分中并行运行,并且不允许并发运行。请参见下面的屏幕快照中的示例。
这样,如果Deploy
或Clean Up
阶段已经在运行,则管道不应启动。如果您的金丝雀失败了,清理工作仍然应该进行。如果您的金丝雀通过了,清理工作仍将继续,并且将进行部署。
答案 1 :(得分:0)