我正在使用CDK
将cf堆栈部署到AWS。它有cdk diff
命令来告诉我这次部署中发生了什么变化。如果没有任何更改,它只显示cdk project
中包含的每个堆栈的There were no differences
。
我需要根据cdk是否需要更改来运行不同的命令。我如何知道它是否需要从脚本中进行更改?我已经检查了change
和no change
的cdk 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