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
View
@@ -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
View
@@ -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])]"
+ }
+ }
+}
View
@@ -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
View
@@ -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);
}
}
View
@@ -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"
View
@@ -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.