如何在AWS Elastic Beanstalk部署中运行npm脚本?

3

我的package.json文件包含:

  "scripts": {
    "start": "node_modules/.bin/coffee server.coffee",
    "test": "NODE_ENV=test node test/runner.js",
    "coverage": "NODE_ENV=test COVERAGE=1 node test/runner.js -R html-cov test/ > ./test/coverage.html",
    "testw": "fswatch -o test src | xargs -n1 -I{} sh -c 'coffeelint src server.coffee ; npm test'",
    "db:drop": "node scripts/drop-tables.js",
    "encryptConfig": "node_modules/.bin/coffee config/encrypt.coffee",
    "decryptConfig": "node_modules/.bin/coffee config/decrypt.coffee",
    "postinstall": "npm run decryptConfig"
  },

当我部署到弹性 Beanstalk 时,我想运行 postinstall,但显然它并没有这样做。没问题。
我创建了一个名为 .ebextensions/00.decrypt.config 的文件,其中包含:
commands:
  00-add-home-variable:
    command: sed -i 's/function error_exit/export HOME=\/root\n\nfunction error_exit/' /opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh

container_commands:
  02-decrypt-config:
    command: $NODE_HOME/bin/npm run decryptConfig

然而,这似乎也无法运行。我做错了什么?

1
尝试将您的命令用引号括起来,这是必需的。 - sap1ens
另外,我不确定 $NODE_HOME 是否正常工作 - 你能否运行一个简单的测试,比如将 echo $NODE_HOME > /tmp/test.txt 命令执行一下? - sap1ens
你能检查一下 /var/log/eb-activity.log 和 /var/log/eb-commandprocessor.log 吗?这些文件会告诉你当执行这些命令时发生了什么。 - Rohit Banga
@sap1ens - 请回答,我会接受它。 - Shamoon
2个回答

2
我找到了解决此问题的方法。在EB实例上,npm二进制文件位于/opt/elasticbeanstalk/node-install/node-{version}中。您应该首先确保将其添加到PATH中。 00_setpath.config
commands:
  01_set_path:
    command: echo 'export PATH=$PATH:`ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin' >> /root/.bash_profile
  02_set_path:
    command: export PATH=$PATH:`ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin

如您所见,我正在将内容附加到.bash_profile中,并将PATH添加到当前Shell中。前者应该足以满足您的目的。我添加了第二个是因为我在package.json中的脚本中使用npm命令,而这些脚本似乎是在同一个Shell中运行的。简而言之:现在您应该能够在两个地方使用npm了。
至于您的npm脚本,请尝试使用prestart而不是postinstall

1
一些建议:
  • 尝试用引号括起你的命令,这是必须的
  • 另外,我不确定 $NODE_HOME 是否可用 - 你能运行一个简单的测试,比如 echo $NODE_HOME > /tmp/test.txt 吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接