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 可能会在与项目根目录不同的文件夹中执行此代码。因此,请确保所有路径都有效。