0

我正在尝试使用 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'
......
4

2 回答 2

1

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

检查您的构建过程生成的存档是否实际上将您的脚本放入您的应用规范期望它们的存档中。scripts/setup.sh需要在存档中的确切路径中。

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

于 2015-10-22T17:12:13.627 回答
1

执行以下步骤进行调试:

  • 在 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为你的脚本指定文件模式。

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

于 2015-10-26T07:08:41.973 回答