Grunt install fails on azure web app deploy through deploy.cmd file

I’m trying to build and package my project using Azure’s Git deployment.

I have created the following files

  • How to delete Windows Azure Git repository?
  • Git Azure deployment missing files from content directory (MVC4 project)
  • Deploying an MVC4 C# application to Azure via GitHub. What should be in my .gitignore?
  • Azure - deploying from Bitbucket
  • Connection issue with Jenkins slave on Windows Azure
  • Exclude Files When Deploying from Git to Azure Websites
    1. .deployment
    2. deploy.cmd
    3. Gruntfile.js
    4. package.json
    5. bower.json

    I’ve followed the blog post by Jay Harris. Below given is the deployment section in deploy.cmd file:

    :: 2. Select node version
    call :SelectNodeVersion
    
    :: 3. Install npm packages
    IF EXIST "%DEPLOYMENT_TARGET%\package.json" (
      pushd "%DEPLOYMENT_TARGET%"
      call :ExecuteCmd !NPM_CMD! install --production
      IF !ERRORLEVEL! NEQ 0 goto error
      popd
    )
    
    :: 4. Install bower packages
    IF EXIST "%DEPLOYMENT_TARGET%\bower.json" (
      call !NPM_CMD! install bower
      IF !ERRORLEVEL! NEQ 0 goto error
      call .\node_modules\.bin\bower install
      IF !ERRORLEVEL! NEQ 0 goto error
    )
    
    :: 4. run grunt
    IF EXIST "%DEPLOYMENT_TARGET%\Gruntfile.js" ( 
      call !NPM_CMD! install grunt-cli  
      call .\node_modules\.bin\grunt --no-color clean common dist
      IF !ERRORLEVEL! NEQ 0 goto error
    )
    

    Deployment fails with below error:

    Selected npm version 3.8.6
    Updating iisnode.yml at D:\home\site\wwwroot\iisnode.yml
    spa@ D:\home\site\wwwroot
    +-- bower@1.7.9  extraneous
    npm WARN grunt-contrib-compass@1.0.4 requires a peer of grunt@>=0.4.0 but none was installed.
    +-- UNMET PEER DEPENDENCY grunt@>=0.4.0
    `-- grunt-cli@1.2.0  extraneous
    
    spa@ D:\home\site\repository
    `-- bower@1.7.9  extraneous
    
    spa@ D:\home\site\repository
    +-- bower@1.7.9  extraneous
    `-- grunt-cli@1.2.0  extraneous
    
    grunt-cli: The grunt command line interface (v1.2.0)
    
    Fatal error: Unable to find local grunt.
    
    If you're seeing this message, grunt hasn't been installed locally to
    your project. For more information about installing and configuring grunt,
    please see the Getting Started guide:
    
    http://gruntjs.com/getting-started
    An error has occurred during web site deployment.
    npm WARN grunt-contrib-compass@1.0.4 requires a peer of grunt@>=0.4.0 but none was installed.\r\nC:\Program Files (x86)\SiteExtensions\Kudu\55.50610.2267\bin\Scripts\starter.cmd deploy.cmd
    

    I’m not sure what else I need to do here to get it installed. Tried to search over the net for similar problem but couldn’t find any concrete solutions for the problem. It would be great if anyone can help me with this.

    My package.json

    {
      "name": "myapp",
      "private": true,
      "devDependencies": {
        "autoprefixer-core": "^5.2.1",
        "grunt": "^0.4.5",
        "grunt-angular-templates": "^0.5.7",
        "grunt-concurrent": "^1.0.0",
        "grunt-contrib-clean": "^0.6.0",
        "grunt-contrib-compass": "^1.0.0",
        "grunt-contrib-concat": "^0.5.0",
        "grunt-contrib-connect": "^0.9.0",
        "grunt-contrib-copy": "^0.7.0",
        "grunt-contrib-cssmin": "^0.12.0",
        "grunt-contrib-htmlmin": "^0.4.0",
        "grunt-contrib-imagemin": "^1.0.0",
        "grunt-contrib-jshint": "^0.11.0",
        "grunt-contrib-uglify": "^0.7.0",
        "grunt-contrib-watch": "^0.6.1",
        "grunt-filerev": "^2.1.2",
        "grunt-google-cdn": "^0.4.3",
        "grunt-jscs": "^1.8.0",
        "grunt-newer": "^1.1.0",
        "grunt-ng-annotate": "^0.9.2",
        "grunt-postcss": "^0.5.5",
        "grunt-svgmin": "^2.0.0",
        "grunt-usemin": "^3.0.0",
        "grunt-wiredep": "^2.0.0",
        "imagemin": "^5.2.1",
        "jasmine-core": "^2.4.1",
        "jit-grunt": "^0.9.1",
        "jshint-stylish": "^1.0.0",
        "karma": "^0.13.22",
        "karma-jasmine": "^1.0.2",
        "karma-phantomjs-launcher": "^1.0.0",
        "phantomjs-prebuilt": "^2.1.7",
        "readable-stream": "^2.1.4",
        "through2": "^2.0.1",
        "time-grunt": "^1.0.0",
        "vinyl-fs": "^2.2.1"
      },
      "engines": {
        "node": ">=0.10.0"
      },
      "scripts": {
        "test": "karma start test\\karma.conf.js"
      }
    }
    

    NOTE: So far no solution found, I’m going to Azure support team to figure out what I can do. I’ll update the question once I find any solution.

  • bower init command error (gitbash) in windows
  • Git philosophy: how to get “master” branch to “production” branch?
  • How do you deploy a website to your webservers?
  • Git push to azure websites with submodule
  • Git requests to Azure Bot Service App in Azure Portal are failing, how do I troubleshoot?
  • How do you keep changes separate and isolated across multiple deployment environments in git?
  • 2 Solutions collect form web for “Grunt install fails on azure web app deploy through deploy.cmd file”

    Most of similar questions (not for azure though) point to:

    npm install grunt --save-dev
    npm install -g grunt --save-dev
    

    (try the global -g install if you are to use grunt from a script)

    This thread mentions grunt should be installed and present in the PATH for azure:

    The problem is not that grunt is not found on the path (“D:\Program Files (x86)\grunt\0.1.13\grunt“). It definitely starts running, but it’s grunt itself that complains.
    If I got to Kudu console and run ‘grunt‘ from the D:\home\site\repository folder, it displays exactly the same thing.

    projectkudu/kudu Issue 1150 confirms:

    this does not happen when running Kudu locally (i.e. outside of Azure).
    So maybe something funky with the runtime env on Azure Websites.

    As seen in grunt issue 1459, check the exit status error code:

    $ echo $?
    99
    

    we will first rename the node_modules/grunt directory, so that grunt-cli will be unable to find local grunt. This should result in error code 99.

    The expected results occur, which make me believe the misleading grunt-cli error message has confused developers into thinking that Grunt itself is returning the wrong error code.

    So in the case of Azure, grunt might be installed and on the path, but not where grunt-cli expects it.

    Control that your package.json has following line.

    "devDependencies": {
        "grunt": "~0.4.5",
     ..
     }
    

    Grunt-cli expects local grunt in your project. This error

    Fatal error: Unable to find local grunt.

    is about this local grunt.Since your script already executes npm install, all you need to do add that “grunt”: “~0.4.5” line to your package.json in dependencies.

    Following command also do same thing, that is adding grunt to devDependencies.

    npm install grunt --save-dev
    
    Git Baby is a git and github fan, let's start git clone.