无论如何,当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

请按照指示行事。

bannerAds