您能否停止基于不同管道 运行 的一个 Spinnaker 管道?

Can you stop one Spinnaker pipeline based on a different pipeline running?

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

我将两个管道都设置为不允许并发 运行s - 你不能在另一个清理正在进行时开始清理,你不能用另一个部署开始部署 运行宁.

但是,如果清理正在 运行 宁,我不希望启动部署。清理可能会错误地从部署下重置东西并导致它失败了,或者更糟的是,错误地成功了。

如何确保仅部署 运行s 如果清理不是 运行ning and 如果没有其他部署 运行宁?


更新:我知道这可能都是一个管道的一部分,但是,为了阐明为什么这些是单独的管道,让我添加上下文。

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 内容。

据我所知,工作流程并不是真正的程序化。我无法 "GOTO" 清理。我也真的,真的不想 copy/paste 五个步骤的集合进入它可能成功或失败的每个地方。我还想确保如果其他事情失败了——也许是启用产品流量的步骤或其他事情——清理 运行s。我并不总是有一个简单的方法来 "hook in" 我能找到。

我还没有找到任何类型的 "on error, execute this set of steps" 或 "on success, execute this set of steps" 除了可以根据这些条件触发的单独管道 .

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

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

但是,考虑到我看到无法在管道中使用 try/finally 的限制,每当部署完成(成功或失败)时,我都会触发清理管道。但是,在清理仍在 运行 期间,我看不到任何可以 "block" 从开始部署的东西,所以如果有一组备份更改都在等待部署,清理的东西可以把我下面的东西清理干净。

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

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

我将部署和清理作为同一管道的一部分,并且在我发现可能出错的阶段(例如金丝雀分析阶段)添加了“忽略失败”。金丝雀分析之后应该发生的所有后续步骤都以金丝雀分析阶段为条件,清理阶段除外。所以我的清理总是会发生,不管任何其他失败。

第 1 步: Select Canary 分析阶段的以下选项:

第 2 步: 在后续步骤中添加条件以确保它们 运行 仅当 Canary 分析阶段成功时。例如:

第 3 步: 确保清理阶段没有任何条件,这将确保它们 运行 无论如何。