Skip to content

Instantly share code, notes, and snippets.

@lilmuckers
Last active April 11, 2016 12:33
Show Gist options
  • Save lilmuckers/d04626adb30cad81de228593c5f6751d to your computer and use it in GitHub Desktop.
Save lilmuckers/d04626adb30cad81de228593c5f6751d to your computer and use it in GitHub Desktop.
A "simple" node.js deployment script - runs npm install, bower install, and gulp build, before starting using a forever config file. Will report the status of the deployment back to slack, as well as posting errors where appropriate.
#!/bin/bash
###### Deploy Vars ######
# The deployment root path
DEPLOYROOT=/home/node/deploy/
FOREVERCONFIG=./forever.json
CURLCHECKURL=http://localhost/
BITBUCKET=https://bitbucket.org/user/repo
MAINURL=http://webhost.com/
ERRORCOLOR="D00000"
SUCCESSCOLOR="006400"
# Slack config
SLACKHOOK=
SLACKCHANNEL=channel_name
SLACKUSERNAME="Deployment Robot"
SLACKEMOJI=musical_score
SLACKERROREMOJI=bangbang
# Run parameters
RUNMODE=production
HOSTNAME=
# Application paths
FOREVERPATH=/usr/local/bin/forever
NPMPATH=/usr/local/bin/npm
BOWERPATH=/usr/local/bin/bower
GULPPATH=/usr/local/bin/gulp
GITPATH=/usr/bin/git
FORTUNEPATH=/usr/games/fortune
CURLPATH=/usr/bin/curl
DATEPATH=/bin/date
GREPPATH=/bin/grep
###### END DEPLOY VARS ######
START=$($DATEPATH +%s.%N)
cd $DEPLOYROOT
$GITPATH remote update
LOCAL=$($GITPATH rev-parse @)
REMOTE=$($GITPATH rev-parse @{u})
BASE=$($GITPATH merge-base @ @{u})
if [[ "$@" != 'force' ]]; then
if [ $LOCAL = $REMOTE ]; then
exit;
elif [ $LOCAL = $BASE ]; then
#do nothing
echo "Proceed with deployment"
elif [ $REMOTE = $BASE ]; then
exit;
else
exit;
fi
fi
#do the thing
$GITPATH pull
LOCALNEW=$($GITPATH rev-parse @)
if [ $LOCALNEW != $REMOTE ]; then
$CURLPATH -X POST --data-urlencode "payload={\"channel\": \"#$SLACKCHANNEL\", \"username\": \"$SLACKUSERNAME\", \"text\": \"*Error Deploying:* <$BITBUCKET/commits/$REMOTE|${REMOTE:0:7}> to <$MAINURL|Production>. Check the server.\", \"icon_emoji\": \":$SLACKERROREMOJI:\"}" $SLACKHOOK
else
# stop the processes
$FOREVERPATH stopall
#get the missing dependancies
MISSINGNPMDEPS=$({ $NPMPATH list > /tmp/deps; } 2>&1 | $GREPPATH 'missing:' | $GREPPATH -Po '(?<=missing: )[^@]+')
$NPMPATH install
MISSINGBOWDEPS=$($BOWERPATH install | $GREPPATH ' install ' | $GREPPATH -Po '(?<=bower )[^ ]+')
$BOWERPATH install
$GULPPATH build
HOST=$HOSTNAME NODE_ENV=$RUNMODE $FOREVERPATH start $FOREVERCONFIG
ATTACHMENTJSON=""
NPMJSON="{}"
BOWJSON="{}"
if [ ! -z "$MISSINGNPMDEPS" ]; then
NPMJSON="{\"title\":\"NPM\",\"value\":\"$MISSINGNPMDEPS\",\"short\":true}"
fi
if [ ! -z "$MISSINGBOWDEPS" ]; then
BOWJSON="{\"title\":\"Bower\",\"value\":\"$MISSINGBOWDEPS\",\"short\":true}"
fi
if [ ! -z "$MISSINGNPMDEPS" ] || [ ! -z "$MISSINGBOWDEPS"]; then
ATTACHMENTJSON=",$NPMJSON, $BOWJSON"
fi
END=$($DATEPATH +%s.%N)
DIFF=$(echo "$END - $START" | bc)
TDIFF=$(printf %.$2f $DIFF)
GITMSG=$($GITPATH log -1 --pretty=%B)
GITCOMMITTER=$($GITPATH log -1 --pretty=%cn)
GITBRANCH=$($GITPATH rev-parse --abbrev-ref HEAD)
BOFHEXCUSE=$($FORTUNEPATH | tail -n 1)
sleep 5s
CURLERR=$($CURLPATH -s -w %{http_code} $CURLCHECKURL -o /dev/null)
COLOR=$SUCCESSCOLOR
CURLATT="{\"title\":\"Curl Check\",\"value\":\"Response code $CURLERR; all good in the hood.\",\"short\":true}"
if [ '200' != $CURLERR ] && [ '302' != $CURLERR ]; then
CURLATT="{\"title\":\"Curl Check\",\"value\":\"Response code $CURLERR; STRANGER DANGER! Check It.\",\"short\":true}"
COLOR=$ERRORCOLOR
fi
$CURLPATH -X POST --data-urlencode "payload={\"channel\": \"#$SLACKCHANNEL\", \"username\": \"$SLACKUSERNAME\", \"text\": \"*Deployed:* <$BITBUCKET/commits/$REMOTE|${REMOTE:0:7}> to <$MAINURL|Production>\", \"icon_emoji\": \":$SLACKEMOJI:\" ,\"attachments\": [{\"fallback\":\"Deployed ${REMOTE:0:7}\",\"color\":\"#$COLOR\",\"fields\":[{\"title\":\"Note\",\"value\":\"$GITMSG\",\"short\":false},{\"title\":\"Committer\",\"value\":\"$GITCOMMITTER\",\"short\":true},{\"title\":\"Time Taken\",\"value\":\"About $TDIFF seconds\",\"short\":true},{\"title\":\"Branch\",\"value\":\"$GITBRANCH\",\"short\":true},$CURLATT$ATTACHMENTJSON,{\"title\":\"Reason it doesn't work\",\"value\":\"$BOFHEXCUSE\",\"short\":false}]}]}" $SLACKHOOK
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment