使用弹性beanstalk部署复杂的node.js项目

时间:2014-05-14 05:22:03

标签: node.js npm elastic-beanstalk

我想知道使用弹性beanstalk部署复杂node.js的最佳做法是什么,而不依赖于外部npm存储库的可用性(以及处理内部开发的软件包的凭据和私有管理git存储库的高可用性)。

看起来有一种思想流派,它实际上将node_modules检入到实际部署的项目的源代码树中。

来源1:http://www.futurealoof.com/posts/nodemodules-in-git.html

来源2:http://eng.yammer.com/managing-node-js-dependencies-and-deployments-at-yammer/

所以听起来像检查它们是正确的方法,但是对于某些已编译的软件包(在Mac上开发并部署到linux)存在不同二进制格式的问题

我尝试过像yammer家伙建议的那样(签入模块除了bin文件夹),但即便如此,本地" npm重建"命令失败(它尝试在bin文件夹中chmod某些东西,而不是在express.js模块中存在),所以我甚至没有试图查看beanstalk默认部署环境将对这样的存储库做什么。我认为它运行" npm install" (它什么都不做),但它会运行" npm rebuild"?

那么,再次,部署具有多个依赖项的复杂项目的最佳实践是什么?现在在node / beanstalk世界中它一定是一个已经解决的问题,不是吗?

由于

1 个答案:

答案 0 :(得分:2)

这是我的配置,可以完成您正在谈论的内容。将其保存在.ebextensions文件夹中,即可进行设置。我和https://stackoverflow.com/a/23242623/34340中的优秀答案之间的唯一区别是 NPM_CONFIG_UNSAFE_PERM = true 行,我从https://forums.aws.amazon.com/thread.jspa?messageID=534612

中学到了这一点。
packages:
  yum:
    git: []
    gcc: []
    make: []
    openssl-devel: []
    libxml2: []
    libxml2-devel: []

files:
  "/opt/elasticbeanstalk/env.vars" :
    mode: "000775"
    owner: root
    group: users
    content: |
      export HOME=/home/ec2-user # ADDED EXPORT COMMAND
      export NPM_CONFIG_LOGLEVEL=error
      export NPM_CONFIG_UNSAFE_PERM=true
      export NODE_PATH=`ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh" :
    mode: "000775"
    owner: root
    group: users
    content: |
      #!/bin/bash
      . /opt/elasticbeanstalk/env.vars
      function error_exit
      {
        eventHelper.py --msg "$1" --severity ERROR
        exit $2
      }

      #install not-installed yet app node_modules
      if [ ! -d "/var/node_modules" ]; then
        mkdir /var/node_modules ;
      fi
      if [ -d /tmp/deployment/application ]; then
        ln -s /var/node_modules /tmp/deployment/application/
      fi

      OUT=$([ -d "/tmp/deployment/application" ] && cd /tmp/deployment/application && $NODE_PATH/npm install 2>&1) || error_exit "Failed to run npm install.  $OUT" $?
      echo $OUT
  "/opt/elasticbeanstalk/hooks/configdeploy/pre/50npm.sh" :
    mode: "000666"
    owner: root
    group: users
    content: |
       #no need to run npm install during configdeploy