2

I've got a MEAN.js application running perfect locally - but it fails when I deploy to Azure. I've modified the deploy.sh file base on this answer by Jay Harris. When the deployment script executes, I just get the (not very helpful) response that "grunt failed". Can someone help me understand how I can troubleshoot the issue to see exactly what is failing so I can hopefully move towards resolving and getting this work?

--Kevin

Here's the 'log' from the azure web view:

command: bash ./deploy.sh
Handling node.js grunt deployment.
Invalid start-up command "grunt" in package.json. Please use the format "node <script relative path>".

... omitted for brevity ...

grunt-cli@0.1.13 node_modules\grunt-cli
├── findup-sync@0.1.3
├── nopt@1.0.10 (abbrev@1.0.5)
└── resolve@0.3.1
An error has occurred during web site deployment.
grunt failed

Here are the contents of package.json (note that I added 'grunt' to the devDependencies based on Micah's comment that grunt may not be installed locally):

{
  "name": "mean",
  "description": "Full-Stack JavaScript with MongoDB, Express, AngularJS, and Node.js",
  "version": "0.0.1",
  "engines": {
    "node": "0.10.x",
    "npm": "1.4.x"
  },
  "scripts": {
    "start": "grunt",
    "test": "grunt test",
    "postinstall": "bower install --config.interactive=false"
  },
  "dependencies": {
    "express": "~4.2.0",
    "express-session": "~1.1.0",
    "body-parser": "~1.2.0",
    "cookie-parser": "~1.1.0",
    "compression": "~1.0.1",
    "method-override": "~1.0.0",
    "morgan": "~1.1.0",
    "connect-mongo": "~0.4.0",
    "connect-flash": "~0.1.1",
    "helmet": "~0.2.1",
    "consolidate": "~0.10.0",
    "swig": "~1.3.2",
    "mongoose": "~3.8.8",
    "passport": "~0.2.0",
    "passport-local": "~1.0.0",
    "passport-facebook": "~1.0.2",
    "passport-twitter": "~1.0.2",
    "passport-linkedin": "~0.1.3",
    "passport-google-oauth": "~0.1.5",
    "lodash": "~2.4.1",
    "forever": "~0.11.0",
    "bower": "~1.3.1",
    "grunt-cli": "~0.1.13",
    "glob": "~3.2.9"
  },
  "devDependencies": {
    "grunt": "^0.4.5",
    "grunt-concurrent": "~0.5.0",
    "grunt-contrib-csslint": "^0.2.0",
    "grunt-contrib-cssmin": "~0.9.0",
    "grunt-contrib-jshint": "~0.10.0",
    "grunt-contrib-uglify": "~0.4.0",
    "grunt-contrib-watch": "~0.6.1",
    "grunt-env": "~0.4.1",
    "grunt-karma": "~0.8.2",
    "grunt-mocha-test": "~0.10.0",
    "grunt-ngmin": "0.0.3",
    "grunt-node-inspector": "~0.1.3",
    "grunt-nodemon": "~0.2.1",
    "karma": "~0.12.0",
    "karma-chrome-launcher": "~0.1.2",
    "karma-coverage": "~0.2.0",
    "karma-firefox-launcher": "~0.1.3",
    "karma-jasmine": "~0.2.1",
    "karma-phantomjs-launcher": "~0.1.2",
    "load-grunt-tasks": "~0.4.0",
    "should": "~3.3.1",
    "supertest": "~0.12.1"
  }
}

Here are the contents of deploy.sh which was modified as stated above:

#!/bin/bash

# ----------------------
# KUDU Deployment Script
# Version: 0.1.11
# ----------------------

# Helpers
# -------

exitWithMessageOnError () {
  if [ ! $? -eq 0 ]; then
    echo "An error has occurred during web site deployment."
    echo $1
    exit 1
  fi
}

# Prerequisites
# -------------

# Verify node.js installed
hash node 2>/dev/null
exitWithMessageOnError "Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment."

# Setup
# -----

SCRIPT_DIR="${BASH_SOURCE[0]%\\*}"
SCRIPT_DIR="${SCRIPT_DIR%/*}"
ARTIFACTS=$SCRIPT_DIR/../artifacts
KUDU_SYNC_CMD=${KUDU_SYNC_CMD//\"}

if [[ ! -n "$DEPLOYMENT_SOURCE" ]]; then
  DEPLOYMENT_SOURCE=$SCRIPT_DIR
fi

if [[ ! -n "$NEXT_MANIFEST_PATH" ]]; then
  NEXT_MANIFEST_PATH=$ARTIFACTS/manifest

  if [[ ! -n "$PREVIOUS_MANIFEST_PATH" ]]; then
    PREVIOUS_MANIFEST_PATH=$NEXT_MANIFEST_PATH
  fi
fi

if [[ ! -n "$DEPLOYMENT_TARGET" ]]; then
  DEPLOYMENT_TARGET=$ARTIFACTS/wwwroot
else
  KUDU_SERVICE=true
fi

if [[ ! -n "$KUDU_SYNC_CMD" ]]; then
  # Install kudu sync
  echo Installing Kudu Sync
  npm install kudusync -g --silent
  exitWithMessageOnError "npm failed"

  if [[ ! -n "$KUDU_SERVICE" ]]; then
    # In case we are running locally this is the correct location of kuduSync
    KUDU_SYNC_CMD=kuduSync
  else
    # In case we are running on kudu service this is the correct location of kuduSync
    KUDU_SYNC_CMD=$APPDATA/npm/node_modules/kuduSync/bin/kuduSync
  fi
fi

# Node Helpers
# ------------

selectNodeVersion () {
  if [[ -n "$KUDU_SELECT_NODE_VERSION_CMD" ]]; then
    SELECT_NODE_VERSION="$KUDU_SELECT_NODE_VERSION_CMD \"$DEPLOYMENT_SOURCE\" \"$DEPLOYMENT_TARGET\" \"$DEPLOYMENT_TEMP\""
    eval $SELECT_NODE_VERSION
    exitWithMessageOnError "select node version failed"

    if [[ -e "$DEPLOYMENT_TEMP/__nodeVersion.tmp" ]]; then
      NODE_EXE=`cat "$DEPLOYMENT_TEMP/__nodeVersion.tmp"`
      exitWithMessageOnError "getting node version failed"
    fi

    if [[ -e "$DEPLOYMENT_TEMP/.tmp" ]]; then
      NPM_JS_PATH=`cat "$DEPLOYMENT_TEMP/__npmVersion.tmp"`
      exitWithMessageOnError "getting npm version failed"
    fi

    if [[ ! -n "$NODE_EXE" ]]; then
      NODE_EXE=node
    fi

    NPM_CMD="\"$NODE_EXE\" \"$NPM_JS_PATH\""
  else
    NPM_CMD=npm
    NODE_EXE=node
  fi
}

##################################################################################################################################
# Deployment
# ----------

#echo Handling node.js deployment.

# 1. KuduSync
#if [[ "$IN_PLACE_DEPLOYMENT" -ne "1" ]]; then
#  "$KUDU_SYNC_CMD" -v 50 -f "$DEPLOYMENT_SOURCE" -t "$DEPLOYMENT_TARGET" -n "$NEXT_MANIFEST_PATH" -p "$PREVIOUS_MANIFEST_PATH" -i ".git;.hg;.deployment;deploy.sh"
#  exitWithMessageOnError "Kudu Sync failed"
#fi

# 2. Select node version
#selectNodeVersion

# 3. Install npm packages
#if [ -e "$DEPLOYMENT_TARGET/package.json" ]; then
#  cd "$DEPLOYMENT_TARGET"
#  eval $NPM_CMD install --production
#  exitWithMessageOnError "npm failed"
#  cd - > /dev/null
#fi


# Deployment
# ----------

echo Handling node.js grunt deployment.

# 1. Select node version
selectNodeVersion

# 2. Install npm packages
if [ -e "$DEPLOYMENT_SOURCE/package.json" ]; then
  eval $NPM_CMD install
  exitWithMessageOnError "npm failed"
fi

# 3. Install bower packages
if [ -e "$DEPLOYMENT_SOURCE/bower.json" ]; then
  eval $NPM_CMD install bower
  exitWithMessageOnError "installing bower failed"
  ./node_modules/.bin/bower install
  exitWithMessageOnError "bower failed"
fi

# 4. Run grunt
if [ -e "$DEPLOYMENT_SOURCE/Gruntfile.js" ]; then
  eval $NPM_CMD install grunt-cli
  exitWithMessageOnError "installing grunt failed"
  ./node_modules/.bin/grunt --no-color clean common dist
  exitWithMessageOnError "grunt failed"
fi

# 5. KuduSync to Target
"$KUDU_SYNC_CMD" -v 500 -f "$DEPLOYMENT_SOURCE/dist" -t "$DEPLOYMENT_TARGET" -n "$NEXT_MANIFEST_PATH" -p "$PREVIOUS_MANIFEST_PATH" -i ".git;.hg;.deployment;deploy.sh"
exitWithMessageOnError "Kudu Sync to Target failed"

##################################################################################################################################

# Post deployment stub
if [[ -n "$POST_DEPLOYMENT_ACTION" ]]; then
  POST_DEPLOYMENT_ACTION=${POST_DEPLOYMENT_ACTION//\"}
  cd "${POST_DEPLOYMENT_ACTION_DIR%\\*}"
  "$POST_DEPLOYMENT_ACTION"
  exitWithMessageOnError "post deployment action failed"
fi

echo "Finished successfully."
Community
  • 1
  • 1
Kevin
  • 895
  • 2
  • 10
  • 21
  • Maybe share more code and less non-relevant output? – Robert Levy Aug 03 '14 at 20:06
  • Robert - that's a fair criticism... however, I just git-cloned, added the mods to deploy.sh and deployed... so the 'code' is just the base MEAN.js code. I wasn't sure if someone would see something particular in the output that would trigger a response. The important thing is that this does not deploy as-is, and I can't see anything more than 'grunt failed' at the end of the log. – Kevin Aug 03 '14 at 20:55
  • Did you intend to install the NPM package [`mean` (mathmetical interval)](https://www.npmjs.org/package/mean) or perhaps something like [`meanio`](https://www.npmjs.org/package/meanio) or one of the [MEAN](https://www.npmjs.org/browse/keyword/mean) stack packages? It also looks like there's an error in your bash script calling grunt: `Invalid start-up command "grunt" in package.json. Please use the format "node – Stennie Aug 04 '14 at 00:59
  • can you share your package.json and deploy.sh? to me it looks like grunt isnt installed when you try to call grunt – Micah Aug 04 '14 at 01:06
  • Stennie & Micah - I tried installing grunt locally, but I'm still getting "Invalid start-up command 'grunt'...". I've posted the deploy.sh and the package.json files for your review. Thank you. – Kevin Aug 04 '14 at 11:48
  • @kevin I have the same problem, did you ever find a solution for this? – Mr. Bungle Feb 13 '17 at 03:43

0 Answers0