无论如何,当CodeDeploy的hook失败时,用劲地使CodeDeploy失败
AWS的CodeDeploy是一项相对方便易用的部署服务,但存在一个问题。
只要在sh文件中出现错误并终止,就不会成为CodeDeploy的错误。
最后的结论
如果执行 set -euo pipefail,当 hook 的 sh 出错时,CodeDeploy 也会失败。
验证 (验证)
大致上述的感覺可以按這種方式來準備appspec.yml文件
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/appdir/
permissions:
- object: /home/ec2-user/appdir
owner: ec2-user
group: ec2-user
hooks:
AfterInstall:
- location: setup/codedeploy/01-ansible.sh
timeout: 1200
runas: root
在bash中,设置-e类似于在perl中使用strict命令,期望它可以在失败时抛出错误,但实际上它并未失败。
看到CodeDeploy的日志才发现Ansible出了问题,但是CodeDeploy却显示成功了,感觉很奇怪。
#!/bin/bash
set -eu
unset PYTHON_INSTALL_LAYOUT
cd /home/ec2-user/appdir/ansible
echo ####################
echo setup app with ansible..
echo ####################
/usr/local/bin/ansible-playbook -vv -i init.hosts init.yam 2>&1 | tee /tmp/codedeploy-ansible1.log
所以在上述代码中加入pipefail,如下所示。
这样,如果ansible失败,CodeDeploy也会失败。
#!/bin/bash
set -euo pipefail
unset PYTHON_INSTALL_LAYOUT
cd /home/ec2-user/appdir/ansible
echo ####################
echo setup app with ansible..
echo ####################
/usr/local/bin/ansible-playbook -vv -i init.hosts init.yam 2>&1 | tee /tmp/codedeploy-ansible1.log