首页 > 解决方案 > 您能否根据正在运行的不同管道停止一个 Spinnaker 管道?

问题描述

作为部署的一部分,我有两个管道。

我将两个管道都设置为不允许并发运行 - 当另一个清理正在进行时你不能开始清理,你不能在另一个部署已经运行的情况下开始部署。

但是,如果 Clean Up 正在运行,我不希望启动 Deploy。Clean Up 可能会错误地从 Deploy 下重置事物并导致它失败,或者更糟糕的是,错误地成功。

如何确保仅在 Clean Up 未运行没有其他 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

在部署管道中,如果任何初始并行测试集失败,我需要运行该清理 - 重置网络并终止金丝雀。如果任一自动 Canary 分析运行失败,我需要运行清理。在成功部署结束时......我需要运行清理以确保那里没有剩余的金丝雀东西。

据我所知,工作流程并不是真正的程序化。我不能“转到”清理。我也真的,真的不想将这组五个步骤复制/粘贴到它可能成功或失败的每个地方。我还想确保如果其他事情失败 - 也许是启用 prod 流量的步骤或其他事情 - 清理运行。我并不总是有一种简单的方法来“吸引”我能找到的。

除了可以根据这些条件触发的单独管道之外,我还没有找到任何类型的“出错时,执行这组步骤”或“成功时,执行这组步骤” 。

我理想的解决方案是伪代码:

try {
  // do the deploy steps
}
finally {
  // whether success or fail
  // run the clean up steps
}

但是,鉴于我看到无法在管道中尝试/最终的限制,每当部署完成(成功或失败)时,我都会触发清理管道。但是,当清理仍在运行时,我看不到任何东西可以“阻止”部署启动,所以如果有一组备份的更改都在等待部署,清理的东西可能会从我下面清理掉.

标签: spinnaker

解决方案


我不认为 Spinnaker 具有该特定功能,但您可以做的一件事是让您的DeployClean Up阶段的所有部分在同一管道中并行运行,并且不允许并发运行。请参阅下面的屏幕截图中的示例。

这样,如果DeployClean Up阶段已经在运行,则管道不应启动。如果您的金丝雀失败,清理工作仍应运行。如果您的金丝雀通过,清理仍将运行,并且将进行部署。

在此处输入图像描述


推荐阅读