2014-05-14 49 views
5

我不知道在不依赖外部npm存储库可用性的情况下使用弹性beanstalk部署复杂node.js的最佳实践(以及处理私有管理的git存储库的凭据和高可用性内部开发的软件包)。使用弹性beanstalk部署复杂的node.js项目

它看起来像有一个流派,它实际上检查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重建”命令失败(它试图chmod bin文件夹中的东西不存在于express.js模块中),所以我甚至都没有尝试看看beanstalk默认的部署环境将如何使用这样一个仓库。我假设它运行“npm install”(它不会执行任何操作),但它会运行“npm rebuild”吗?

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

谢谢

+0

了解到您使用的可能是依赖于binary.If一个lib暂存ENV是100%和你的生产环境一样,然后继续,检查node_modules文件夹,没问题。如果你在升级和生产中没有使用不同版本的节点,你不需要npm重建。只需复制一切,你应该没问题。 – mpm

+0

mongodb bson,kerberos使用二进制文件,我在部署到亚马逊linux机器时在mac上开发,我不能将二进制文件提交到存储库 –

+0

我明白了。但是在这一点上,您可能想要考虑使用类似vagrant的东西,会让你的生活变得更简单。 – mpm

回答

2

下面是我的配置,你要说什么。将它保存在.ebextensions文件夹中,然后设置。矿山和https://stackoverflow.com/a/23242623/34340优越的答案之间的唯一区别是NPM_CONFIG_UNSAFE_PERM =真线,这是我从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 
+0

我认为这个解决方案可以加快npm的安装速度,但是在部署新实例的时候并没有消除对npmjs或其他服务器的依赖,也没有解决跨实例的模块版本不一致的问题,对吧? –

+0

这是正确的 - 外部服务和不一致的模块版本仍然会对您造成影响。对于这些情况,您可能希望从“git aws.push”转向类似https://github.com/simoneb/grunt-awsebtdeploy +对package.json版本控制和npm shrinkwrap的健康帮助。 –

相关问题