15

我有一个Node.js 应用程序,它使用CodeDeploy AWS 部署系统通过Codeship自动部署到 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 文件之外,我还尝试进行以下更改:

  • 没有列出每个钩子的runas参数
  • 引用已部署目录中的脚本
  • 引用部署目录之外的脚本
  • 版本参数初始设置为0.0

不幸的是,除了AWS 文档之外,关于 appspec.yml 故障排除的在线文档很少。

我做错了什么非常明显的事情?

4

2 回答 2

32

ApplicationStop在尝试运行当前部署appspec.yml文件之前,正在从先前安装的部署中调用挂钩。

为了防止这种情况发生,您必须从服务器中删除任何以前安装的部署。

  • 停止代码部署代理 -sudo service codedeploy-agent stop
  • 清除下的所有部署/opt/codedeploy-agent/deployment-root
  • 重新启动代码部署代理 -sudo service codedeploy-agent start
于 2015-01-13T15:26:57.243 回答
18

AWS 开发人员论坛中记录了另一种方式,我认为这种方式更可取。

在进行部署时将 --ignore-application-stop-failures 选项与 CLI 工具一起使用,它对我来说非常有效。

取自论坛的例子:

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"

https://forums.aws.amazon.com/thread.jspa?threadID=166904

于 2015-01-23T21:46:44.593 回答