AWS Codedeploy 错误:scripts/applicationstart.sh 不可执行。试图使其可执行

s_k*_*les 5 bash amazon-web-services node.js aws-code-deploy

我正在 EC2 实例上运行 Ubuntu,并尝试设置代码部署来运行脚本以在 appspec.yml 中配置部署。然而,这些钩子脚本似乎没有运行。当我检查代码部署错误日志时,我看到错误消息InstanceAgent::Plugins::CodeDeployPlugin::HookExecutor: Script at specified location: scripts/applicationstart.sh is not executable. Trying to make it executable.

这非常令人困惑,因为我的脚本非常简单,我不确定为什么它们不被接受。这是在 appspec.yml 文件中调用它们的位置:

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/teller-install
hooks:
  BeforeInstall:
    - location: scripts/beforeinstall.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: scripts/applicationstart.sh
      timeout: 300
      runas: root
Run Code Online (Sandbox Code Playgroud)

这是我调用的两个脚本:

#!/bin/bash

cd /home/ubuntu/teller-install/Server && npm install
exit 0
Run Code Online (Sandbox Code Playgroud)

第二个:

    #!/bin/bash

pm2 start /home/ubuntu/teller-install/Server/app.js
exit 0
Run Code Online (Sandbox Code Playgroud)

部署成功,但脚本未运行。

这是我在 codedeploy-agent 日志文件中收到的错误消息:

    2017-06-01 23:59:01 WARN  [codedeploy-agent(3504)]: InstanceAgent::Plugins::CodeDeployPlugin::HookExecutor: Script at specified location: scripts/applicationstart.sh is not executable.  Trying to make it executable.
2017-06-01 23:59:01 INFO  [codedeploy-agent(3504)]: Version file found in /opt/codedeploy-agent/.version.
2017-06-01 23:59:01 INFO  [codedeploy-agent(3504)]: [Aws::CodeDeployCommand::Client 200 0.028596 0 retries] put_host_command_complete(command_status:"Succeeded",diagnostics:{format:"JSON",payload:"{\"error_code\":0,\"script_name\":\"\",\"message\":\"Succeeded\",\"log\":\"\"}"},host_command_identifier:"WyJjb20uYW1hem9uLmFwb2xsby5kZXBsb3ljb250cm9sLmRvbWFpbi5Ib3N0Q29tbWFuZElkZW50aWZpZXIiLHsiZGVwbG95bWVudElkIjoiQ29kZURlcGxveS91cy1lYXN0LTEvUHJvZC9hcm46YXdzOnNkczp1cy1lYXN0LTE6MDEwNzAyMDY3ODAwOmRlcGxveW1lbnQvZC1LWFU2WjQ0UU0iLCJob3N0SWQiOiJhcm46YXdzOmVjMjp1cy1lYXN0LTE6MDEwNzAyMDY3ODAwOmluc3RhbmNlL2ktMGNkMzQ3OThlNDdiYzE3MjkiLCJjb21tYW5kTmFtZSI6IkFwcGxpY2F0aW9uU3RhcnQiLCJjb21tYW5kUG9zaXRpb24iOjYsImNvbW1hbmRBdHRlbXB0IjoxfV0=")  
Run Code Online (Sandbox Code Playgroud)

这是我正在谈论的文件的源代码。

https://github.com/SamKirkiles/Teller

jam*_*lol 7

我认为这里有一点误解。这是可以理解的,因为 CodeDeploy 的解释很差。

这个警告... is not executable. Trying to make it executable.有点转移注意力。请参阅OP片段中的下一行,其中表示它确实成功地将脚本设置为可执行:put_host_command_complete(command_status:"Succeeded" ...

因此,您根本不必在hooks脚本上设置权限 - CodeDeploy 会为您处理这些事情。

请注意,还有一个额外的、令人讨厌的特性。CodeDeploy 不会hooks从您选择的代码位置(例如,/srv/my-cool-app/scripts/beforeinstall.sh)执行您的脚本。它实际上会复制整个部署并将其存储在/opt/codedeploy-agent/deployment-root/[some-guid]/[newest-folder]/deployment-archive/. 这是运行hooks脚本的地方。您可以通过转到该文件夹​​并检查那里的脚本的权限来查看这一点的证据 - CodeDeploy 代理运行的脚本的权限将为 777。

此外,虽然您可以permissions在 appspec.yml 文件中放置一个部分,但它需要绝对路径,这同样只允许您编辑部署位置,而不是实际运行脚本的 /opt 位置。


s_k*_*les 1

好吧,经过一番挫折后,我解决了这个问题。首先,我必须使用 chmod 777 更改脚本的权限scriptname.sh,但您会希望授予它们比实际更严格的权限。这消除了那个烦人的错误消息。

那么脚本不起作用的原因是因为我的脚本在安装挂钩之前安装了依赖项,并且在任何文件存在之前调用它。我必须将依赖项安装移至安装后,一切正常。希望对遇到类似问题的人有所帮助。