挂在npm上的厨师客户端安装在node-gyp rebuild

 ____L振豪 发布于 2023-02-04 18:20

npm install从厨师食谱中跑出来我遇到了问题.当我从命令行运行它时,它在一分钟内完成,只有一些与package.json没有存储库字段相关的警告(应该是无害的).但是当我从chef运行它时,它会挂起最后一行输出回命令行,如下所示:

* execute[npm-install-app] action run

配方中的这个资源块是:

execute "npm-install-app" do
  cwd "#{home}/#{prefix}#{app}"
  command "npm --registry #{priv['url']}:#{priv['port']}#{priv['path']} install --cache #{home}/.npm --tmp #{home}/tmp > npm-run.log 2>&1"
  user node['nodejs']['user']
  action :run
end

#{home}扩展出/home/nodejs和用户nodejs.

如您所见,我将输出重定向到文件到文件> npm-run.log 2>&1.输出文件获取写入它的npm install命令的输出(与命令行不同),最后一件事是:

-- a bunch of 200's and 304s, like this --
npm http 304 http://my.private.npm.amazonaws.com/registry/_design/app/_rewrite/esprima

kerberos@0.0.3 install /home/nodejs/my-app/node_modules/mongoose-q/node_modules/mongoose/node_modules/mongodb/node_modules/kerberos
(node-gyp rebuild 2> builderror.log) || (exit 0)

kerberos是我们依赖的一个模块的依赖,但我们自己并没有使用kerberos.我从其他来源收集到npm正在运行node-gyp来编译在npm服务器上打包的不可用的应用程序版本.

它将在该状态下保持2小时,直到大厨shellout注册超时并显示致命错误.ps -e将显示当Chef-client仍在运行时npm仍在运行,并且中断chef-client将导致npm从进程列表中消失,这表明npm仍然认为它至少仍在进行有意义的工作.(另一方面,当我遇到连接问题时,我倾向于问这个问题.这是npm install另一个问题的潜在问题的可能性很高,但我认为他们需要单独考虑.)

编辑:运行chef-client -l debug并向/var/log/chef/client.log文件中添加少量信息,这基本上确认该npm install命令是挂起之前要执行的最后一个资源:

[2014-01-09T22:49:28+00:00] INFO: Processing execute[npm-install-app] action run (my-app::default line 111)
[2014-01-09T22:49:28+00:00] DEBUG: Platform ubuntu version 12.04 found

我是否正确地认为|| (退出0)抛出主厨ShellOut提供商检测成功退出?我能做些什么吗?

编辑2: Chef刚从带有-l debugset 的运行中超时,但仍然只获得有关超时的日志信息.

[2014-01-10T00:26:56+00:00] ERROR: execute[npm-install-app] (my-app::default line 111) had an error: Mixlib::ShellOut::CommandTimeout: command timed out:
---- Begin output of npm --registry http:my.private.npm.amazonaws.com:5984/registry/_design/app/_rewrite install --cache /home/nodejs/.npm --tmp /home/nodejs/tmp > npm-run.log 2>&1 ----
STDOUT:
STDERR:
---- End output of npm --registry http://ec2-54-221-190-191.compute-1.amazonaws.com:5984/registry/_design/app/_rewrite install --cache /home/nodejs/.npm --tmp /home/nodejs/tmp > npm-run.log 2>&1 ----

但!另一个节点在约5分钟后成功完成并在npm-run.log文件中包含此内容:

> kerberos@0.0.3 install /home/nodejs/spicoli-authorization/node_modules/mongoose-q/node_modules/mongoose/node_modules/mongodb/node_modules/kerberos
> (node-gyp rebuild 2> builderror.log) || (exit 0)

make: Entering directory `/home/nodejs/spicoli-authorization/node_modules/mongoose-q/node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build'
  SOLINK_MODULE(target) Release/obj.target/kerberos.node
  SOLINK_MODULE(target) Release/obj.target/kerberos.node: Finished
  COPY Release/kerberos.node
make: Leaving directory `/home/nodejs/spicoli-authorization/node_modules/mongoose-q/node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build'

我想不出为什么会出现如此巨大的性能差异,两台服务器都运行在亚马逊的小型ec2实例上.也许在工作和损坏的服务器上的主目录之间存在权限差异......我将调查该角度.

1 个回答
  • 好吧,我终于脱掉了我的白痴帽子,在正确的地方寻找原木.命令甚至说2> builderror.log,所以你认为这只是一个提示,只是find为了这个名字的文件,但它仍然没有发生在我身上.这非常令人沮丧,因为node-gyp命令显然内置于kerberos源代码中,它默默地隐藏来自任何调用进程的错误(如Chef或任何其他可能需要自动进行npm安装的构建工具).

    这就是它所说的(一遍又一遍地约为350 MB,因此有趣的小挂!我的厨师食谱是删除每次运行时使用的目录,或者这可能更难以诊断):

    gyp WARN EACCES attempting to reinstall using temporary dev dir "/root/tmp/.node-gyp"
    gyp WARN EACCES user "root" does not have permission to access the dev dir "/root/tmp/.node-gyp/0.10.22"
    

    好奇的是,节点GYP正在与解决此位置的文件:/home/nodejs/my-app/node_modules/mongoose-q/node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/和我的NPM install命令运行的nodejs用户,但它仍然试图写入/rootroot用户!对此有些不妥,因为rootdarn很好地拥有该目录的权限.

    ubuntu@amazonaws:~$ sudo ls -la /
    -- snip --
    drwx------  4 root root  4096 Jan  7 22:50 root
    
    ubuntu@amazonaws:~$ sudo ls -la /root
    total 24
    drwx------  4 root root 4096 Jan  7 22:50 .
    drwxr-xr-x 23 root root 4096 Jan  7 22:46 ..
    -rw-r--r--  1 root root 3106 Apr 19  2012 .bashrc
    drwx------  2 root root 4096 Jan  7 22:50 .cache
    -rw-r--r--  1 root root  140 Apr 19  2012 .profile
    drwx------  2 root root 4096 Jan  7 22:46 .ssh
    

    起初,我认为我只需要修改/home/nodejs目录的权限,但我认为这将需要跟进node-gyp开发人员.

    至少这解释了为什么如果我将npm-install命令作为不同的用户(具有sudo权限)运行,它可以工作.

    更新:我最终解决了这个问题,让npm安装以root身份运行,然后chown" 安装"并chmod安装已安装的文件.我用于此的Chef资源块看起来像这样:

      # Recursively chown and chmod all files just created
      execute "fixup #{home}/#{prefix}#{app} owner" do
        command "find ./ -exec sudo chown #{node[:nodejs][:user]}:#{node[:nodejs][:user]} {} +"
        cwd "#{home}/#{prefix}#{app}"
      end
    
      execute "fixup #{home}/#{prefix}#{app} file permissions" do
        command "find ./ -type f -exec sudo chmod 644 {} +"
        cwd "#{home}/#{prefix}#{app}"
      end
    
      execute "fixup #{home}/#{prefix}#{app} directory permissions" do
        command "find ./ -type d -exec sudo chmod 755 {} +"
        cwd "#{home}/#{prefix}#{app}"
      end
    

    这并没有解决node-gyp在权限部门中的缺点,如果我在这方面得到直接回复,我将继续追求并发布另一个答案.

    2023-02-04 18:21 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有