Last active
April 11, 2016 12:33
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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