node.js app with node-gyp fails to deploy on azure website

杀马特。学长 韩版系。学妹 提交于 2019-12-05 00:29:49
Larry Franks

Limitation of web sites. See the native modules section of http://azure.microsoft.com/en-us/documentation/articles/nodejs-use-node-modules-azure-apps/.

The workaround/resolution is to install all the modules on a Windows dev box and include node_modules as part of the git deployment.

Konstantin

I recently successfully deployed a Node.js app/ Sails app running as an Azure web app that relies on Grunt and therefore needs support for node-gyp as well. At first I struggled with getting node-gyp to run on continuous deployment without including the node_modules folder but finally I succeded with a what you would hopefully call "graceful resolution". The steps that were necessary for me are:

  1. Make sure you use a somewhat up to date version of Node and NPM (as far as Azure allows you to do so: . In my case I used node 5.4.0 and npm 3.3.12. Deploying on Azure there is two ways I know of to do this:

    • Application settings: WEBSITE_NODE_DEFAULT_VERSION 5.4.0 (or whatever)
    • Package.json file: Include the following:

      "engines": {    
          "node": "5.4.0",    
          "npm": "3.3.12"  
      },
      
  2. Change the settings in the config/env/production.js file to give grunt more time to uglify or whatever. The default value of 20s seems to be too low for a lot of applications out there, however there might be better ways to solve this: https://github.com/balderdashy/sails/issues/2691 I put:

    hookTimeout: 60000, // 60 seconds
    
  3. I used a .deployment and deploy.cmd / deploy.sh (depending on your system) file to customize the deployment on the Azure platform. The guide I used was: http://www.cptloadtest.com/2013/12/03/Git-And-Grunt-Deploy-To-Windows-Azure.aspx

    EDIT: looks like my original command to run Grunt from deploy.cmd is incorrect, I am not familiar with bash scripts, sorry. I ended up using the script from this question with some modifications: Deploying a NodeJS App to Azure Websites fails on installing NPM packages from pagages.json from deploy.cmd?
    Using this script my grunt task runs on deployment. Here are the modified parts of my script.
    deploy.cmd:

    :: Setup
    :: -----        
    
    :: ... some default parts omitted
    
    IF NOT DEFINED GRUNT_CMD (
      :: Install grunt
      echo Installing Grunt
      call npm --registry "http://registry.npmjs.org/" install grunt-cli
      IF !ERRORLEVEL! NEQ 0 goto error
    
      :: Locally just running "grunt" would also work
    SET GRUNT_CMD=node "%DEPLOYMENT_SOURCE%\node_modules\grunt-cli\bin\grunt"
    )
    
    goto Deployment
    
    :: Utility Functions
    :: -----------------
    
    :SelectNodeVersion
    
    :: ... some default parts omitted
    
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    :Deployment
    echo Handling node.js deployment.
    echo %DEPLOYMENT_SOURCE%
    
    echo 1. Select node version
    call :SelectNodeVersion
    
    echo 2. Install npm packages dev dependencies
    IF EXIST "%DEPLOYMENT_SOURCE%\package.json" (
      pushd "%DEPLOYMENT_SOURCE%"
      echo Cleaning NPM cache.
      call !NPM_CMD! cache clean
      call !NPM_CMD! install --development
      IF !ERRORLEVEL! NEQ 0 goto error
      popd
    )        
    
    echo 4. Run grunt prod task
    pushd %DEPLOYMENT_SOURCE%
    call !GRUNT_CMD! --no-color prod
    IF !ERRORLEVEL! NEQ 0 goto error
    popd
    
    echo 5. KuduSync
    IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
      call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_SOURCE%" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
      IF !ERRORLEVEL! NEQ 0 goto error
    )
    
    echo 6. Install npm packages production
    IF EXIST "%DEPLOYMENT_TARGET%\package.json" (
      pushd %DEPLOYMENT_TARGET%
      call !NPM_CMD! install --production
      IF !ERRORLEVEL! NEQ 0 goto error
      popd
    )
    
  4. I then ran into this error: ENOTSUP using Grunt which was thankfully recently solved :)
    All that was left for me to do was to change the for deploy.sh given syntax to work in my deploy.cmd. So before running grunt from deploy.cmd I included:

    echo 3. Update erroneous glob dependency in Grunt 
    pushd "%DEPLOYMENT_SOURCE%\node_modules\grunt"
    call :ExecuteCmd !NPM_CMD! install glob@^6.0.4 --save
    IF !ERRORLEVEL! NEQ 0 goto error
    popd
    

I hope this helps some of you out there, although I am aware, that some of the issues I faced might be solved using up to date versions of node and npm. But since Azure does not out of the box provide the latest versions this might still be helpful for some of you.

EDIT:

Regarding:

  1. Node version choice:

    I tried to select the node version by only setting it in Package.json without changing the default settings in the Application settings (default version: 4.2.3) and I still got the following error:

    Node.js versions available on the platform are: 0.6.20, 0.8.2, 0.8.19, 0.8.26, 0.8.27, 0.8.28, 0.10.5, 0.10.18, 0.10.21, 0.10.24, 0.10.26, 0.10.28, 0.10.29, 0.10.31, 0.10.32, 0.10.40, 0.12.0, 0.12.2, 0.12.3, 0.12.6, 4.0.0, 4.1.0, 4.1.2, 4.2.1, 4.2.2, 4.2.3, 4.2.4, 5.0.0, 5.1.1, 5.3.0, 5.4.0, 5.5.0.
    Selected node.js version 5.4.0. Use package.json file to choose a different version.
    Selected npm version 3.3.12
    Updating iisnode.yml at D:\home\site\wwwroot\iisnode.yml
    3. Install npm packages
    npm WARN deprecated lodash@0.9.2: lodash@<2.0.0 is no longer maintained. Upgrade to lodash@^3.0.0
    npm WARN deprecated grunt-lib-contrib@0.7.1: DEPRECATED. See readme: https://github.com/gruntjs/grunt-lib-contrib
    npm WARN deprecated lodash@1.0.2: lodash@<2.0.0 is no longer maintained. Upgrade to lodash@^3.0.0
    > sails@0.11.4 preinstall D:\home\site\wwwroot\node_modules\.staging\sails-bbe9b0ace9f7789c8522238af14fe27a
    > node ./lib/preinstall_npmcheck.js
    
    Sails.js Installation: Checking npm-version successful
    npm WARN prefer global grunt-cli@0.1.13 should be installed with -g
    
    > fibers@1.0.8 install D:\home\site\wwwroot\node_modules\fibers
    > node build.js || nodejs build.js
    
    
    D:\home\site\wwwroot\node_modules\fibers>if not defined npm_config_node_gyp (node "c:\Program Files (x86)\npm\3.3.12\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild --release )  else (node  rebuild --release ) 
    Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
      fibers.cc
      coroutine.cc
    ..\src\fibers.cc : fatal error C1902: Program database manager mismatch; please check your installation [D:\home\site\wwwroot\node_modules\fibers\build\fibers.vcxproj]
    ..\src\coroutine.cc : fatal error C1902: Program database manager mismatch; please check your installation [D:\home\site\wwwroot\node_modules\fibers\build\fibers.vcxproj]
    gyp ERR! build error 
    gyp ERR! stack Error: `msbuild` failed with exit code: 1
    gyp ERR! stack     at ChildProcess.onExit (c:\Program Files (x86)\npm\3.3.12\node_modules\npm\node_modules\node-gyp\lib\build.js:270:23)
    gyp ERR! stack     at emitTwo (events.js:87:13)
    gyp ERR! stack     at ChildProcess.emit (events.js:172:7)
    gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:200:12)
    gyp ERR! System Windows_NT 6.2.9200
    gyp ERR! command "D:\\Program Files (x86)\\nodejs\\4.2.3\\node.exe" "c:\\Program Files (x86)\\npm\\3.3.12\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" "--release"
    gyp ERR! cwd D:\home\site\wwwroot\node_modules\fibers
    gyp ERR! node -v v4.2.3
    gyp ERR! node-gyp -v v3.0.3
    Build failed
    

    Like you can see it first states:

    Selected node.js version 5.4.0. Use package.json file to choose a different version.
    

    according to the Package.json file.
    However, later on in the error message this seems to have changed:

    gyp ERR! node -v v4.2.3
    

    To me it is not obvious why this error occurs since the version in the Package.json file should be overwriting the default in the Application settings. So to be sure just set both settings to a high enough version (not sure when the node-gyp problem was solved, but 5.4.0 seems to be working fine!).

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!