除非手动执行,否则 Elastic Beanstalk 上的“npm install”会失败

Posted

技术标签:

【中文标题】除非手动执行,否则 Elastic Beanstalk 上的“npm install”会失败【英文标题】:"npm install" on Elastic Beanstalk fails unless manually executed 【发布时间】:2017-01-28 20:53:11 【问题描述】:

我有一个带有 php 应用程序的 Elastic Beanstalk 环境。我想在部署我的应用程序后运行npm install

nodenpm 都通过部署配置安装在服务器上。我已经定义了一个容器命令来简单地 cd 进入正确的目录,然后运行 ​​npm install,但它 always 失败并出现相同的错误。

如果我手动执行npm install,一切都会完美安装。

我该如何调试这个?

deploy.config

commands:
    01_mkdir_webapp_dir:
      # use the test directive to create the directory
      # if the mkdir command fails the rest of this directive is ignored
      test: 'mkdir /home/webapp'
      command: 'ls -la /home/webapp'
    02_chown_webapp_dir:
      command: 'chown webapp:webapp /home/webapp'
    03_chmod_webapp_dir:
      command: 'chmod 700 /home/webapp'
    04_node_install:
        cwd: /tmp
        test: '[ ! -f /usr/bin/node ] && echo "node not installed"'
        command: 'yum install -y nodejs --enablerepo=epel'
    05_npm_install:
        cwd: /tmp
        test: '[ ! -f /usr/bin/npm ] && echo "npm not installed"'
        command: 'curl -L http://npmjs.org/install.sh | sh'
    06_node_update:
        cwd: /tmp
        test: '[ ! -f /usr/bin/n ] && echo "node not updated"'
        command: 'npm install -g n && n stable'

# These commands will be run just before the application is started
container_commands:
    01_npm_build:
        cwd: '/var/app/ondeck/wp-content/themes/gift-certificates'
        command: 'npm install && npm run build'

npm-debug.log的尾巴

...

90557 silly lifecycle gifsicle@3.0.4~install: no script for install, continuing
90558 silly install imagemin-gifsicle@4.2.0 /var/app/ondeck/wp-content/themes/gift-certificates/node_modules/.staging/imagemin-gifsicle-836840bb
90559 info lifecycle imagemin-gifsicle@4.2.0~install: imagemin-gifsicle@4.2.0
90560 silly lifecycle imagemin-gifsicle@4.2.0~install: no script for install, continuing
90561 silly install jpegtran-bin@3.1.0 /var/app/ondeck/wp-content/themes/gift-certificates/node_modules/.staging/jpegtran-bin-6b358de8
90562 info lifecycle jpegtran-bin@3.1.0~install: jpegtran-bin@3.1.0
90563 silly rollbackFailedOptional Finishing
90564 silly runTopLevelLifecycles Starting
90565 silly runTopLevelLifecycles Finishing
90566 silly install printInstalled
90567 warn optional Skipping failed optional dependency /chokidar/fsevents:
90568 warn notsup Not compatible with your operating system or architecture: fsevents@1.0.14
90569 verbose stack Error: node-sass@3.10.0 install: `node scripts/install.js`
90569 verbose stack spawn ENOENT
90569 verbose stack     at errnoException (child_process.js:1011:11)
90569 verbose stack     at Process.ChildProcess._handle.onexit (child_process.js:802:34)
90570 verbose pkgid node-sass@3.10.0
90571 verbose cwd /var/app/ondeck/wp-content/themes/gift-certificates
90572 error Linux 4.4.15-25.57.amzn1.x86_64
90573 error argv "node" "/usr/local/bin/npm" "install"
90574 error node v6.6.0
90575 error npm  v3.10.3
90576 error file sh
90577 error code ELIFECYCLE
90578 error errno ENOENT
90579 error syscall spawn
90580 error node-sass@3.10.0 install: `node scripts/install.js`
90580 error spawn ENOENT
90581 error Failed at the node-sass@3.10.0 install script 'node scripts/install.js'.
90581 error Make sure you have the latest version of node.js and npm installed.
90581 error If you do, this is most likely a problem with the node-sass package,
90581 error not with npm itself.
90581 error Tell the author that this fails on your system:
90581 error     node scripts/install.js
90581 error You can get information on how to open an issue for this project with:
90581 error     npm bugs node-sass
90581 error Or if that isn't available, you can get their info via:
90581 error     npm owner ls node-sass
90581 error There is likely additional logging output above.
90582 verbose exit [ 1, true ]

eb-commandprocessor.log的尾巴

  ...

  | `-- osenv@0.0.3
  +-- chalk@0.5.1
  | +-- ansi-styles@1.1.0
  | +-- has-ansi@0.1.0
  | | `-- ansi-regex@0.2.1
  | +-- strip-ansi@0.3.0
  | `-- supports-color@0.2.0
  +-- glob@4.5.3
  | +-- inflight@1.0.5
  | | `-- wrappy@1.0.2
  | `-- once@1.4.0
  +-- lodash@2.4.2
  +-- propprop@0.3.1
  `-- through2@0.6.5
  `-- readable-stream@1.0.34
  `-- isarray@0.0.1

  npm WARN optional Skipping failed optional dependency /chokidar/fsevents:
  npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.0.14
  npm ERR! Linux 4.4.15-25.57.amzn1.x86_64
  npm ERR! argv "node" "/usr/local/bin/npm" "install"
  npm ERR! node v6.6.0
  npm ERR! npm  v3.10.3

  npm ERR! Callback called more than once.
  npm ERR!
  npm ERR! If you need help, you may report this error at:
  npm ERR!     <https://github.com/npm/npm/issues>

  npm ERR! Please include the following file with any support request:
  npm ERR!     /var/app/ondeck/wp-content/themes/gift-certificates/npm-debug.log
   (ElasticBeanstalk::ExternalInvocationError)


[2016-09-20T17:38:57.831Z] ERROR [4286]  : Command CMD-AppDeploy failed!
[2016-09-20T17:38:57.837Z] INFO  [4286]  : Command processor returning results:
"status":"FAILURE","api_version":"1.0","results":["status":"FAILURE","msg":"(TRUNCATED)...\nnpm ERR! If you need help, you may report this error at:\nnpm ERR!     <https://github.com/npm/npm/issues>\n\nnpm ERR! Please include the following file with any support request:\nnpm ERR!     /var/app/ondeck/wp-content/themes/gift-certificates/npm-debug.log. \ncontainer_command 01_npm_build in .ebextensions/deploy.config failed. For more detail, check /var/log/eb-activity.log using console or EB CLI","returncode":1,"events":[]],"truncated":"true"

【问题讨论】:

您是否在日志中看到这些行:npm WARN optional Skipping failed optional dependency /chokidar/fsevents: npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.0.14 是的,但这只是一个“WARN”级别的日志。我读到的所有内容都是可以忽略 fsevents(尽管您可能比我更了解它) 嗯。另一个嫌疑人是“node-sass”。也许以下链接对您有帮助github.com/sass/node-sass/issues/1504 我也遇到了同样的问题。 npm install 在我 ssh 进入实例时有效,但不是来自 .ebextensions/02env.config。你有没有深入了解这个@AlecSanger @andreobrown 我相信这个特殊问题与两件事有关:1:在 Amazon Linux PHP Elastic Beanstalk 实例上获取节点的更新版本显然非常困难,如果你只是用百胜安装。 2:如果您使用的是微型实例,node-sass 构建可能会超时。将我的服务器大小提升到至少 t2.small 让我超越了这一点。希望对您有所帮助! 【参考方案1】:

对于在 PHP Elastic Beanstalk 实例上遇到此问题的其他人,以下是帮助我解决此问题的方法:

1) 如果您在 Amazon Linux 实例上运行,则执行yum install nodejs 将为您提供一个极有可能与许多东西不兼容的超级旧版本。我必须在我的.ebextensions 目录中添加一个脚本并从我的一个配置中执行它以安装更新版本的 nodejs。这是该脚本的副本:

#!/bin/bash

hash_file="/tmp/nodejshash"

check_if_npm_packages_has_to_be_installed () 
    if [ -f $hash_file ]; then
        check_if_same_hash
    else
        return 0
    fi


check_if_same_hash () 
    hash_new="$(md5sum .ebextensions/bin/install-nodejs.sh 2> /dev/null | cut -d ' ' -f 1)"
    hash_current="$(cat "$hash_file" 2> /dev/null | cut -d ' ' -f 1)"

    if [ $hash_new == $hash_current ]; then
        return 1
    else
        return 0
    fi


install_node () 
    if hash nodejs 2> /dev/null; then
        echo 'nodejs install, add more processing if needed' > /dev/null
    else
        curl -sL https://rpm.nodesource.com/setup_6.x | bash -
        yum install -y nodejs
    fi


install_npm_packages () 
    npm install -g bower
    npm install -g gulp


update_current_hash () 
    echo $hash_new > $hash_file


install_node

if check_if_npm_packages_has_to_be_installed; then
    install_npm_packages
    update_current_hash
fi

2) 如果您默认使用微实例,node-sass 包需要很长时间才能构建并最终超时。我将我的实例大小增加到 t2.small 以解决这个问题。

希望这对其他人有所帮助。

【讨论】:

谢谢! 2 号为我修好了。 这个脚本的文件名是什么?

以上是关于除非手动执行,否则 Elastic Beanstalk 上的“npm install”会失败的主要内容,如果未能解决你的问题,请参考以下文章

除非手动保存,否则无法使用 SSIS 打开 excel 文件

除非主窗口未聚焦,否则不会更新 QLabel

除非主窗口未聚焦,否则不会更新 QLabel

除非在视图上手动更新,否则不会自动触发视图上的更新触发器

Elastic Beanstalk:将分支部署到环境

Elastic Beanstalk 在配置菜单中没有负载均衡器设置