我有一个 Node.js应用程序,它使用 Codeship AWS通过CodeDeploy自动部署到Amazon Web Service 部署系统。
在部署过程中,我已在 appspec.yml 中设置当前正在运行的Web应用程序停止。部署完成后,我希望再次启动Web应用程序。
os: linux
files:
- source: /
destination: /var/www/app2
hooks:
AfterInstall:
- location: bash_scripts/stop_forever.sh
runas: ec2-user
ApplicationStart:
- location: bash_scripts/start_forever.sh
runas: ec2-user
但是,在部署期间,我还没有能够从appspec.yml文件中成功调用这些脚本。
我在AWS部署代理日志中看到的当前错误是
Error CodeScriptMissing
Script Name /var/scripts/stop_forever.sh
MessageScript does not exist at specified location: /var/scripts/stop_forever.sh
Log TailLifecycleEvent - ApplicationStop
这似乎是指旧版本的appspec.yml文件,它试图在不同的位置运行这些脚本。即使我已更改已部署包中的appspec.yml文件的内容,但每次部署时此错误消息仍然相同。
除了上面列出的appspec.yml文件外,我还尝试进行以下更改:
不幸的是,除了AWS documentation之外,appspec.yml故障排除方面的在线数量非常少。
我做错了什么非常明显的事情?
答案 0 :(得分:26)
在尝试运行当前部署ApplicationStop
文件之前,正在从先前安装的部署中调用appspec.yml
挂钩。
为了防止这种情况发生,您必须从服务器中删除任何以前安装的部署。
sudo service codedeploy-agent stop
/opt/codedeploy-agent/deployment-root
sudo service codedeploy-agent start
答案 1 :(得分:17)
AWS开发人员论坛中记录了另一种方式,我认为这种方式更受欢迎。
在部署时使用CLI工具使用--ignore-application-stop-failures选项,它对我来说非常有用。
来自论坛的例子:
aws deploy create-deployment --application-name APPLICATION --deployment-group-name GROUP --ignore-application-stop-failures --s3-location bundleType=tar,bucket=BUCKET,key=KEY --description "Ignore ApplicationStop failures due to broken script"