Skip to content

Commit

Permalink
Deploy to Azure Button
Browse files Browse the repository at this point in the history
* Uses ARM template to create a Web App (Free Tier)
* When deploying, choose between `Latest` (deploys code from git repo) or
`Stable` (deploy from latest published npm package).
* Server will be accessible at `<sitename>.azurewebsites.net`
  • Loading branch information
jpoon committed Jan 6, 2016
1 parent 6dac818 commit 51887b2
Show file tree
Hide file tree
Showing 7 changed files with 377 additions and 16 deletions.
8 changes: 6 additions & 2 deletions Readme.md
Expand Up @@ -23,6 +23,10 @@ Read more about the [motivations and history](http://rauchg.com/slackin) behind


[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/rauchg/slackin/tree/0.7.3) [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/rauchg/slackin/tree/0.7.3)


#### Azure

[![Deploy to Azure](http://azuredeploy.net/deploybutton.svg)](https://azuredeploy.net/)

#### OpenShift #### OpenShift


[Follow these instructions.](https://github.com/rauchg/slackin/wiki/OpenShift) [Follow these instructions.](https://github.com/rauchg/slackin/wiki/OpenShift)
Expand Down Expand Up @@ -133,8 +137,8 @@ install the prerequisite node libraries with npm:
$ npm install $ npm install
``` ```


After the libraries install, the postinstall script will run make to invoke After the libraries install, the postinstall script will run `gulp` to invoke
babel on the source. It is important to run make manually after updating any babel on the source. It is important to run `gulp` manually after updating any
files in lib/ to update the versions in node/. files in lib/ to update the versions in node/.


## Credits ## Credits
Expand Down
130 changes: 130 additions & 0 deletions azuredeploy.json
@@ -0,0 +1,130 @@
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"siteName": {
"type": "string",
"metadata": {
"description": "The name of the web app that you wish to create."
}
},
"hostingPlanName": {
"type": "string",
"metadata": {
"description": "The name of the App Service plan to use for hosting the web app."
}
},
"siteLocation": {
"type": "string",
"defaultValue": "West US",
"metadata": {
"description": "The location to use for creating the web app and hosting plan. It must be one of the Azure locations that support web apps."
}
},
"repoURL": {
"type": "string"
},
"branch": {
"type": "string"
},
"slackTeamId" : {
"type": "string",
"metadata": {
"description": "Slack Team ID. (e.g. https://{this}.slack.com)"
}
},
"slackApiToken" : {
"type": "string",
"metadata": {
"description": "Slack API token (find it on https://api.slack.com/web)"
}
},
"slackinRelease" : {
"type": "string",
"allowedValues": [
"stable",
"latest"
],
"defaultValue": "stable",
"metadata": {
"description": "Slackin Release to Deploy (stable/latest)"
}
}
},
"resources": [
{
"apiVersion": "2015-08-01",
"name": "[parameters('hostingPlanName')]",
"type": "Microsoft.Web/serverfarms",
"location": "[parameters('siteLocation')]",
"properties": {
},
"sku": {
"name": "F1"
}
},
{
"apiVersion": "2015-08-01",
"name": "[parameters('siteName')]",
"type": "Microsoft.Web/sites",
"location": "[parameters('siteLocation')]",
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]"
],
"properties": {
"serverFarmId": "[parameters('hostingPlanName')]"
},
"resources": [
{
"apiVersion": "2015-08-01",
"name": "web",
"type": "config",
"dependsOn": [
"[resourceId('Microsoft.Web/Sites', parameters('siteName'))]"
],
"properties": {
"siteProperties": {
"webSocketsEnabled": true
}
}
},
{
"apiVersion": "2015-08-01",
"name": "appsettings",
"type": "config",
"dependsOn": [
"[resourceId('Microsoft.Web/Sites', parameters('siteName'))]"
],
"properties": {
"SLACK_SUBDOMAIN": "[parameters('slackTeamId')]",
"SLACK_API_TOKEN": "[parameters('slackApiToken')]",
"SLACKIN_RELEASE": "[parameters('slackinRelease')]",
"WEBSITE_NPM_DEFAULT_VERSION": "3.3.12",
"WEBSITE_NODE_DEFAULT_VERSION": "5.1.1",
"command": "bash scripts/azuredeploy.sh"
}
},
{
"apiVersion": "2015-08-01",
"name": "web",
"type": "sourcecontrols",
"dependsOn": [
"[resourceId('Microsoft.Web/Sites', parameters('siteName'))]",
"[concat('Microsoft.Web/Sites/', parameters('siteName'), '/config/web')]"
],
"properties": {
"RepoUrl": "[parameters('repoURL')]",
"branch": "[parameters('branch')]",
"IsManualIntegration": true
}
}
]
}
],
"outputs": {
"siteUri": {
"type": "string",
"value": "[concat('https://',reference(resourceId('Microsoft.Web/sites', parameters('siteName'))).hostNames[0])]"
}
}
}
17 changes: 10 additions & 7 deletions bin/slackin
@@ -1,14 +1,14 @@
#!/usr/bin/env node #!/usr/bin/env node


var pkg = require('../package'); var pkg = require('./../package');
var program = require('commander'); var program = require('commander');
var slackin = require('../node').default; var slackin = require('./../node').default;


program program
.version(pkg.version) .version(pkg.version)
.usage('[options] <team-id> <api-token>') .usage('[options] <team-id> <api-token>')
.option('-p, --port <port>', 'Port to listen on [$PORT or 3000]', require('hostenv').PORT || 3000) .option('-p, --port <port>', 'Port to listen on [$PORT or 3000]', require('hostenv').PORT || process.env.PORT || 3000)
.option('-h, --hostname <hostname>', 'Hostname to listen on [$HOSTNAME or 0.0.0.0]', require('hostenv').HOSTNAME || '0.0.0.0') .option('-h, --hostname <hostname>', 'Hostname to listen on [$HOSTNAME or 0.0.0.0]', require('hostenv').HOSTNAME || process.env.WEBSITE_HOSTNAME || '0.0.0.0')
.option('-c, --channels [<chan>]', 'One or more comma-separated channel names to allow single-channel guests [$SLACK_CHANNELS]', process.env.SLACK_CHANNELS) .option('-c, --channels [<chan>]', 'One or more comma-separated channel names to allow single-channel guests [$SLACK_CHANNELS]', process.env.SLACK_CHANNELS)
.option('-c, --channel <chan>', 'Single channel guest invite (deprecated) [$SLACK_CHANNEL]', process.env.SLACK_CHANNEL) .option('-c, --channel <chan>', 'Single channel guest invite (deprecated) [$SLACK_CHANNEL]', process.env.SLACK_CHANNEL)
.option('-i, --interval <int>', 'How frequently (ms) to poll Slack [$SLACK_INTERVAL or 5000]', process.env.SLACK_INTERVAL || 5000) .option('-i, --interval <int>', 'How frequently (ms) to poll Slack [$SLACK_INTERVAL or 5000]', process.env.SLACK_INTERVAL || 5000)
Expand All @@ -18,11 +18,14 @@ program
.option('-c, --css <file>', 'Full URL to a custom CSS file to use on the main page') .option('-c, --css <file>', 'Full URL to a custom CSS file to use on the main page')
.parse(process.argv); .parse(process.argv);


if (program.args.length != 2) { var org = program.args[0] || process.env.SLACK_SUBDOMAIN;
var token = program.args[1] || process.env.SLACK_API_TOKEN;

if (!org || !token) {
program.help(); program.help();
} else { } else {
program.org = program.args[0]; program.org = org;
program.token = program.args[1]; program.token = token;
} }


// support deprecated option // support deprecated option
Expand Down
5 changes: 4 additions & 1 deletion lib/log.js
Expand Up @@ -38,8 +38,11 @@ export default function log(slack, silent){
} }


function out(...args){ function out(...args){
if (args) {
args[0] = `${new Date}${args[0]}`;
}

if (silent) return debug(...args); if (silent) return debug(...args);
args[0] = `${new Date}${args[0]}`;
console.log(...args); console.log(...args);
} }
} }
7 changes: 1 addition & 6 deletions package.json
Expand Up @@ -3,7 +3,7 @@
"version": "0.7.3", "version": "0.7.3",
"description": "", "description": "",
"dependencies": { "dependencies": {
"babel-core": "6.3.15", "babel-core": "6.3.26",
"babel-preset-es2015": "6.3.13", "babel-preset-es2015": "6.3.13",
"babel-polyfill": "6.3.14", "babel-polyfill": "6.3.14",
"body-parser": "1.10.2", "body-parser": "1.10.2",
Expand All @@ -21,11 +21,6 @@
"vd": "0.1.0" "vd": "0.1.0"
}, },
"devDependencies": { "devDependencies": {
"babel-core": "^6.3.15",
"babel-preset-es2015": "^6.3.13",
"gulp": "^3.9.0",
"gulp-babel": "^6.1.1",
"gulp-rimraf": "^0.2.0",
"mocha": "2.2.4", "mocha": "2.2.4",
"nock": "2.17.0", "nock": "2.17.0",
"supertest": "0.15.0" "supertest": "0.15.0"
Expand Down
157 changes: 157 additions & 0 deletions scripts/azuredeploy.sh
@@ -0,0 +1,157 @@
#!/bin/bash

# ----------------------
# Azure KUDU Deployment Script
# Version: 1.0.2
# ----------------------

# 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
# ------------

# Node/NPM versions
#NODE_EXE="$PROGRAMFILES\\nodejs\\5.1.1\\node.exe"
#NPM_CMD="\"$NODE_EXE\" \"$PROGRAMFILES\\npm\\3.3.12\\node_modules\\npm\\bin\\npm-cli.js\""

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
# ----------

# Select node version
selectNodeVersion

echo -n "Using Node: "
"${NODE_EXE}" -v

echo -n "Using npm: "
"${NPM_CMD}" -v

echo Deploying Slackin: $SLACKIN_RELEASE

if [[ "$SLACKIN_RELEASE" == "stable" ]]; then
# Stable
echo Installing from npm

cd "$DEPLOYMENT_TARGET"

# 1. Install latest release of slackin from npm
eval $NPM_CMD install slackin

# 2. Copy to root folder
cp -rv node_modules/slackin/* .

cd - > /dev/null

else
# Latest (from git repo)
echo Installing from git repo

# 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. Install npm packages
if [ -e "$DEPLOYMENT_TARGET/package.json" ]; then
echo npm install
cd "$DEPLOYMENT_TARGET"
eval $NPM_CMD install --production
cd - > /dev/null
fi
fi


# 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."

0 comments on commit 51887b2

Please sign in to comment.