diff --git a/.deployment b/.deployment new file mode 100644 index 0000000000000000000000000000000000000000..f7d466ea5a64453616a9d85b9cad4e5ec33be1cf --- /dev/null +++ b/.deployment @@ -0,0 +1,2 @@ +[config] +command = bash ./tasks/azure-deploy.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index bf0b3b178ece16d97752df9ff2e651c7f4ac7d04..6d16258783466cede603e7c5199ef53be9fc4174 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +### Azure Deployment Integration + +* Added Azure / Kudu deployment scripts which is triggered by kudus continuous deployment Github webhook. + ## 0.6.0 (September 25, 2016) ### Build Dependency (`react-scripts`) diff --git a/server.js b/server.js new file mode 100644 index 0000000000000000000000000000000000000000..1f08c988a8201704927bc4963afbbbfa4b527afe --- /dev/null +++ b/server.js @@ -0,0 +1,9 @@ +var express = require('express'); +var server = express(); + +server.use(express.static(__dirname)); + +var port = process.env.PORT || 1337; +server.listen(port, function() { + console.log('listening on port ' + port); +}); \ No newline at end of file diff --git a/tasks/azure-deploy.sh b/tasks/azure-deploy.sh new file mode 100644 index 0000000000000000000000000000000000000000..acd1fb9bdb6dfb3b910ed4ef7f4e3fd4bbb6ac70 --- /dev/null +++ b/tasks/azure-deploy.sh @@ -0,0 +1,148 @@ +#!/bin/bash + +# ---------------------- +# KUDU Deployment Script +# Version: 0.2.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 + +WEB_CONFIG=$DEPLOYMENT_SOURCE/template/Web.config + +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 +# ------------ + +selectNodeVersion () { + echo Selecting Node Version + 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 +# ---------- + +echo Handling custom node.js deployment. + +touch server.js + +selectNodeVersion + +if [ -e "$DEPLOYMENT_SOURCE/package.json" ]; then + echo Installing Create React App Package + eval $NPM_CMD install -g create-react-app + exitWithMessageOnError "create react app install failed" + + echo Installing NPM Packages + eval $NPM_CMD install + exitWithMessageOnError "npm failed" + + echo Building React App + eval $NPM_CMD run build + exitWithMessageOnError "react build failed" + + cd - > /dev/null +fi + +if [ -e "$WEB_CONFIG" ]; then + echo Copying $WEB_CONFIG over to the build folder + cp $WEB_CONFIG build/ + exitWithMessageOnError "Unable to copy $WEB_CONFIG over to build" +fi + +if [[ "$IN_PLACE_DEPLOYMENT" -ne "1" ]]; then + echo Syncing Files + "$KUDU_SYNC_CMD" -v 50 -f "$DEPLOYMENT_SOURCE/build" -t "$DEPLOYMENT_TARGET" -n "$NEXT_MANIFEST_PATH" -p "$PREVIOUS_MANIFEST_PATH" -i ".git;.hg;.deployment;deploy.sh" + exitWithMessageOnError "Kudu Sync failed" +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." diff --git a/template/Web.config b/template/Web.config new file mode 100644 index 0000000000000000000000000000000000000000..1de7d323daa29a8c02f9e0c743df18c20fc9195d --- /dev/null +++ b/template/Web.config @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + This configuration file is required if iisnode is used to run node processes behind + IIS or IIS Express. For more information, visit: + + https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config +--> + +<configuration> + <system.webServer> + <handlers> + <clear /> + <add + name="StaticFile" + path="*" verb="*" + modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" + resourceType="Either" + requireAccess="Read" /> + </handlers> + <staticContent> + <mimeMap fileExtension=".*" mimeType="application/octet-stream" /> + </staticContent> + </system.webServer> +</configuration>