如何使用"cdk diff"以编程方式检查堆栈是否需要更新



我正在使用CDK将cf堆栈部署到AWS。它有cdk diff命令来告诉我这次部署中发生了什么变化。如果没有任何更改,它只显示cdk project中包含的每个堆栈的There were no differences

我需要根据cdk是否需要更改来运行不同的命令。我如何知道它是否需要从脚本中进行更改?我已经检查了changeno changecdk diff返回代码都是0。知道变更集是否会更改任何内容的正确方法是什么?

虽然cdk diff --fail通常有效,但我觉得这有点危险。如果应用程序出现错误,或者aws凭据或权限丢失(等等(有问题,只有通过查看CI作业的输出才能注意到。

在我们的管道中,我现在正在检查输出:

cdk diff "*" 2>&1 | tee cdk.diff
grep "There were no differences" cdk.diff && echo "no diffs found" || echo "diffs found"

使用tee命令,输出同时写入stdout和文件cdk.diff

--fail标志将导致cdk diff在出现diff的情况下退出,退出代码为1。添加条件逻辑来处理退出代码情况:

cdk diff --fail && echo "no diffs found" || echo "diffs found"

我认为使用cdk diff --fail和处理结果在大多数情况下都有效,如@fedonev的回答所示,但我同意@udodan的回答,即如果权限有问题,它会掩盖其他问题。然而,如果你有一个具有跨堆栈引用或其他依赖关系的CDK应用程序,你就不能完全依赖CCD_;没有差异";处于CCD_ 14输出中。

例如,如果Stack B有更改,但它依赖于Stack A作为引用,并且

Stack A您可以使用以下内容继续使用--fail,但仍然可以捕获其他问题:

set -o pipefail
if cdk diff "*" --fail 2>&1 | tee cdk.diff; then
echo "No changes"
else
if grep "Could not assume role in target account|no credentials have been configured" cdk.diff > /dev/null; then
echo "Failed due to IAM permissions problem or IAM credentials not configured"
exit 1
else
echo "Changes detected"
fi
fi

代码可能需要扩展以检测其他潜在问题,但我认为大多数其他情况,如纯代码语法问题,都会更早地被捕获。

相关内容

最新更新