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