appspec.yml无法调用脚本

时间:2015-10-22 14:44:36

标签: amazon-web-services circleci aws-code-deploy

我正在尝试使用AWS CodeDeploy和CircleCI设置CI。现在,我陷入了AWS CodeDeploy应该将内容复制到EC2并运行脚本的步骤。但不知怎的,CircleCI告诉我一些错误。有谁知道可能会发生什么?谢谢。

appspec.yml是:

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu
hooks:
  BeforeInstall:
    - location: scripts/setup.sh
      timeout: 3800
      runas: root
  ApplicationStart:
    - location: scripts/start.sh
      timeout: 3800
      runas: root

和setup.sh是:

#!/bin/bash
sudo apt-get install nodejs npm
npm install

在上面的代码中,我也只尝试了apt-get install nodejs npm,但它仍然无效。

/var/log/aws/codedeploy-agent/codedeploy-agent.log中的错误消息如下:

2015-10-22 08:02:54 ERROR [codedeploy-agent(1314)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Error during 
 perform: InstanceAgent::Plugins::CodeDeployPlugin::ScriptError - Script at specified location:
./scripts/setup.sh run as user root failed with exit code 127 - /opt/codedeploy-agent/lib/instance_agent/plugins/codedeploy/hook_executor.rb:150:in `execute_script'
/opt/codedeploy-agent/lib/instance_agent/plugins/codedeploy/hook_executor.rb:107:in `block (2 levels) in execute'
......

2 个答案:

答案 0 :(得分:1)

退出代码127通常意味着操作系统无法找到执行命令所需的内容。在这种情况下,可能是脚本不在预期的路径上,或者/bin/bash不存在(不太可能)。

检查构建过程生成的存档是否实际将脚本放在appspec期望的存档中。 scripts/setup.sh需要存档中的确切路径。

您还可以通过检查部署的部署档案来查看代理实际获得的内容:/opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive以确保正确提取存档。

答案 1 :(得分:1)

执行以下调试步骤:

    CodeLeploy错误日志/var/log/aws/codedeploy-agent/codedeploy-agent.log中的
  • 有一行显示Error during perform: InstanceAgent::Plugins::CodeDeployPlugin::ScriptError - Script at specified location: scripts/setup.sh failed with exit code 1。因此,从错误日志中我知道问题可能来自此脚本。

  • 在上面提到的脚本setup.sh中,在脚本的开头加上这样的内容:

exec 3>&1 4>&2 trap 'exec 2>&4 1>&3' 0 1 2 3 exec 1>/home/ubuntu/out.log 2>&1

这会记录整个错误输出。

  • 权限问题

EC2也可能无法执行这些脚本,您需要确保这些文件在复制到您的实例时至少具有755个权限。因此,您需要为脚本指定755文件模式。

How to change the File Mode on GitHub?

同样在appspec.yml中,您需要指定runas指令。可能是ubuntu或root或任何能给你正确权限的东西。

部署时遇到的一些陷阱就像执行sudo apt-get install nodejs时一样,会有一些中间步骤,询问您是否要安装软件包并使用磁盘空间,并且必须键入Y或N才能继续安装。那些脚本会挂起并超时导致部署失败。所以你做了

sudo apt-get -y install nodejs npm

或者在setup.sh脚本中,您可能

chmod -R 777 public

但是CodeDeploy可能会在与您的项目根目录不同的文件夹中执行此代码。因此,请确保所有路径都有效。