Permalink
Browse files

Deploy to Azure Button

* 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 Dec 7, 2015
1 parent 6dac818 commit 51887b2ec74467aca5077814615da0dde5e86549
Showing with 377 additions and 16 deletions.
  1. +6 −2 Readme.md
  2. +130 −0 azuredeploy.json
  3. +10 −7 bin/slackin
  4. +4 −1 lib/log.js
  5. +1 −6 package.json
  6. +157 −0 scripts/azuredeploy.sh
  7. +69 −0 web.config
@@ -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)

#### Azure

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

#### OpenShift

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

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

## Credits
@@ -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])]"
}
}
}
@@ -1,14 +1,14 @@
#!/usr/bin/env node

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

program
.version(pkg.version)
.usage('[options] <team-id> <api-token>')
.option('-p, --port <port>', 'Port to listen on [$PORT or 3000]', require('hostenv').PORT || 3000)
.option('-h, --hostname <hostname>', 'Hostname to listen on [$HOSTNAME or 0.0.0.0]', require('hostenv').HOSTNAME || '0.0.0.0')
.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 || 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, --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)
@@ -18,11 +18,14 @@ program
.option('-c, --css <file>', 'Full URL to a custom CSS file to use on the main page')
.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();
} else {
program.org = program.args[0];
program.token = program.args[1];
program.org = org;
program.token = token;
}

// support deprecated option
@@ -38,8 +38,11 @@ export default function log(slack, silent){
}

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

if (silent) return debug(...args);
args[0] = `${new Date}${args[0]}`;
console.log(...args);
}
}
@@ -3,7 +3,7 @@
"version": "0.7.3",
"description": "",
"dependencies": {
"babel-core": "6.3.15",
"babel-core": "6.3.26",
"babel-preset-es2015": "6.3.13",
"babel-polyfill": "6.3.14",
"body-parser": "1.10.2",
@@ -21,11 +21,6 @@
"vd": "0.1.0"
},
"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",
"nock": "2.17.0",
"supertest": "0.15.0"
@@ -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."
Oops, something went wrong.

0 comments on commit 51887b2

Please sign in to comment.