我正在尝试使用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'
......
答案 0 :(得分:1)
退出代码127通常意味着操作系统无法找到执行命令所需的内容。在这种情况下,可能是脚本不在预期的路径上,或者/bin/bash
不存在(不太可能)。
检查构建过程生成的存档是否实际将脚本放在appspec期望的存档中。 scripts/setup.sh
需要存档中的确切路径。
您还可以通过检查部署的部署档案来查看代理实际获得的内容:/opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive
以确保正确提取存档。
答案 1 :(得分:1)
执行以下调试步骤:
/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可能会在与您的项目根目录不同的文件夹中执行此代码。因此,请确保所有路径都有效。