如何使AWS CodeDeploy在某些appspec钩子失败时返回错误?

10

我有一个AWS帐户,其中包括两个实例。我已经配置了CodeDeploy使其能够自动在所有实例上部署我的项目。

appspec.yml文件中,我有以下部分:

hooks:
   AfterInstall:
     - location: codedeploy_scripts/deploy_afterinstall
       timeout: 300
       runas: root

deploy_afterinstall是一个简单的Bash脚本。有时其中一些命令会失败,例如更新/安装Composer依赖项的命令。

if [ -f "composer.lock" ]; then
   composer update -n
else
   composer install -n
fi

但CodeDeploy忽略此脚本中的任何错误,并始终表示部署成功。我该如何更改这种行为?我希望当挂钩中的某些命令未成功完成时,部署会失败,并在部署控制台或日志中查看错误。

2个回答

13

我最初在使用CodeDeploy时遇到了类似的问题。我建议您让您的bash脚本更加严格:

#!/bin/bash
set -euo pipefail

通过将e、u和o pipefail设置为选项,Bash 将更像一种编程语言,而不是脚本。您可以在此处阅读有关"Bash Strict Mode"的更多信息。

当您的composer install或update失败时,Bash将以非零代码退出,代码部署也将失败。


谢谢 Cory。我一定会尝试你的解决方案。 - Stalinko
@Stalinko 你试过了吗?它有效吗? - danronmoon
嘿@danronmoon。已经过去6年了,我已经不记得细节了。我想我实际上没有尝试它,因为不再需要它了。 - Stalinko
有人能确认这种方法可行吗?如果可以的话,我会在上面打个绿色的勾 :) - Stalinko

3

CodeDeploy代理依赖于您的脚本“deploy_afterinstall”的退出状态来确定部署生命周期事件是成功还是失败。您可以尝试捕获脚本中运行的命令的退出状态,并从“deploy_afterinstall”返回它。脚本返回任何非零值都应该使部署生命周期事件失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接