|
#!/usr/bin/env bash |
|
|
|
# Expects one argument the name of the production stack file |
|
# |
|
# Requires these environment variables to be set |
|
# |
|
# CLOUDFLARE_DOMAIN - root domain of your app, e.g. example.com |
|
# CLOUDFLARE_KEY - your Cloudflare API key |
|
# CLOUDFLARE_EMAIL - your Cloudflare email address e.g. [email protected] |
|
# PROJECT_NAME - a short name for your project e.g. example |
|
# TUTUM_USERNAME - your Tutum username |
|
# TUTUM_PASSWORD - your Tutum password |
|
# CLUSTER_SIZE - the initial cluster size (default 1) |
|
# |
|
# NB: The script assumes you have a loadbalancer service within your stack called 'lb' |
|
# You should have created a node cluster called ${PROJECT_NAME} |
|
# It is assumed that you normally have one node in the cluster and expand to 2 during deployment. |
|
|
|
set -eu |
|
cd $(dirname $0) |
|
|
|
cluster_normal_size=${CLUSTER_SIZE:-1} |
|
cluster_expanded_size=$(( cluster_normal_size * 2 )) |
|
project=${PROJECT_NAME} |
|
state= |
|
alt_state= |
|
|
|
|
|
if ! which tutum |
|
then |
|
echo "Please install Tutum CLI using 'sudo -H pip install tutum'" |
|
exit 1 |
|
fi |
|
|
|
if ! which cfcli |
|
then |
|
echo "Please install Cloudflare CLI using 'npm install -g cloudflare-cli'" |
|
exit 1 |
|
fi |
|
|
|
|
|
if (( $# == 0)) |
|
then |
|
echo "Usage: $0 <stack-file>" |
|
exit 1 |
|
fi |
|
|
|
echo "Logging in to Tutum" |
|
tutum login -u $TUTUM_USERNAME -p $TUTUM_PASSWORD |
|
|
|
echo "Scaling out for blue/green deployment" |
|
tutum nodecluster scale --sync ${project} ${cluster_expanded_size} |
|
|
|
|
|
if tutum stack list | grep ${project}-blue | grep Running |
|
then |
|
echo "Current state is blue" |
|
state=blue |
|
alt_state=green |
|
else |
|
echo "Current state is green" |
|
state=green |
|
alt_state=blue |
|
fi |
|
|
|
|
|
while tutum stack list | grep ${project}-${alt_state} | grep -v Terminated |
|
do |
|
echo "Terminating exisiting ${alt_state} deployment" |
|
if tutum stack terminate --sync ${project}-${alt_state} |
|
then |
|
echo "Terminated" |
|
else |
|
sleep 20 |
|
fi |
|
done |
|
|
|
echo "Starting new ${alt_state} deployment" |
|
tutum stack up -n ${project}-${alt_state} --sync -f $1 |
|
|
|
echo "Changing DNS" |
|
|
|
#Change DNS |
|
cfcli --token ${CLOUDFLARE_KEY} --email ${CLOUDFLARE_EMAIL} --domain ${CLOUDFLARE_DOMAIN} --type cname -ttl 120 editrecord ${CLOUDFLARE_DOMAIN} lb.${project}-${alt_state}.${TUTUM_USERNAME}.svc.tutum.io |
|
|
|
echo "Awaiting DNS propagation" |
|
#Wait for DNS change over, we use a fixed time here as we have to wait for all cached DNS records to change before continuing |
|
sleep 240 |
|
|
|
|
|
echo "Terminating exisiting ${state} deployment" |
|
tutum stack terminate --sync ${project}-${state} |
|
|
|
echo "Shrinking back cluster after deployment" |
|
tutum nodecluster scale --sync ${project} ${cluster_normal_size} |
|
|