#!/bin/bash -e case $1 in cloud*) DEPLOYHOST="$1" ;; *) echo "Use $0 cloud{nr}|cloud.blender.org" >&2 exit 1 esac echo -n "Deploying to ${DEPLOYHOST}... " if ! ping ${DEPLOYHOST} -q -c 1 -W 2 >/dev/null; then echo "host ${DEPLOYHOST} cannot be pinged, refusing to deploy." >&2 exit 2 fi echo "press [ENTER] to continue, Ctrl+C to abort." read dummy # Deploys the current production branch to the production machine. PROJECT_NAME="blender-cloud" DOCKER_NAME="blender_cloud" CELERY_WORKER_DOCKER_NAME="celery_worker" CELERY_BEAT_DOCKER_NAME="celery_beat" REMOTE_ROOT="/data/git/${PROJECT_NAME}" SSH="ssh -o ClearAllForwardings=yes -o PermitLocalCommand=no ${DEPLOYHOST}" # macOS does not support readlink -f, so we use greadlink instead if [[ `uname` == 'Darwin' ]]; then command -v greadlink 2>/dev/null 2>&1 || { echo >&2 "Install greadlink using brew."; exit 1; } readlink='greadlink' else readlink='readlink' fi ROOT="$(dirname "$($readlink -f "$0")")" cd ${ROOT} # Check that we're on production branch. if [ $(git rev-parse --abbrev-ref HEAD) != "production" ]; then echo "You are NOT on the production branch, refusing to deploy." >&2 exit 1 fi # Check that production branch has been pushed. if [ -n "$(git log origin/production..production --oneline)" ]; then echo "WARNING: not all changes to the production branch have been pushed." echo "Press [ENTER] to continue deploying current origin/production, CTRL+C to abort." read dummy fi function find_module() { MODULE_NAME=$1 MODULE_DIR=$(python <&2 exit 1 fi echo $MODULE_DIR } # Find our modules PILLAR_DIR=$(find_module pillar) ATTRACT_DIR=$(find_module attract) FLAMENCO_DIR=$(find_module flamenco) SVNMAN_DIR=$(find_module svnman) echo "Pillar : $PILLAR_DIR" echo "Attract : $ATTRACT_DIR" echo "Flamenco: $FLAMENCO_DIR" echo "SVNMan : $SVNMAN_DIR" if [ -z "$PILLAR_DIR" -o -z "$ATTRACT_DIR" -o -z "$FLAMENCO_DIR" -o -z "$SVNMAN_DIR" ]; then exit 1 fi # SSH to cloud to pull all files in function git_pull() { PROJECT_NAME="$1" BRANCH="$2" REMOTE_ROOT="/data/git/${PROJECT_NAME}" echo "===================================================================" echo "UPDATING FILES ON ${PROJECT_NAME}" ${SSH} git -C ${REMOTE_ROOT} fetch origin ${BRANCH} ${SSH} git -C ${REMOTE_ROOT} log origin/${BRANCH}..${BRANCH} --oneline ${SSH} git -C ${REMOTE_ROOT} merge --ff-only origin/${BRANCH} } git_pull pillar-python-sdk master git_pull pillar production git_pull attract production git_pull flamenco production git_pull pillar-svnman production git_pull blender-cloud production # Update the virtualenv #${SSH} -t docker exec ${DOCKER_NAME} /data/venv/bin/pip install -U -r ${REMOTE_ROOT}/requirements.txt --exists-action w # RSync the world $ATTRACT_DIR/rsync_ui.sh ${DEPLOYHOST} $FLAMENCO_DIR/rsync_ui.sh ${DEPLOYHOST} $SVNMAN_DIR/rsync_ui.sh ${DEPLOYHOST} ./rsync_ui.sh ${DEPLOYHOST} # Notify Sentry of this new deploy. # See https://sentry.io/blender-institute/blender-cloud/settings/release-tracking/ # and https://docs.sentry.io/api/releases/post-organization-releases/ # and https://sentry.io/api/ echo echo "===================================================================" REVISION=$(date +'%Y%m%d.%H%M%S.%Z') echo "Notifying Sentry of this new deploy of revision ${REVISION}." SENTRY_RELEASE_URL="$(${SSH} python3 -c "\"import sys; sys.path.append('${REMOTE_ROOT}'); import config_local; print(config_local.SENTRY_RELEASE_URL)\"")" curl -vs "$SENTRY_RELEASE_URL" -XPOST -H 'Content-Type: application/json' -d "{\"version\": \"$REVISION\"}" | json_pp echo # Wait for [ENTER] to restart the server echo echo "===================================================================" echo "NOTE: If you want to edit config_local.py on the server, do so now." echo "NOTE: Press [ENTER] to continue and restart the server process." read dummy echo "Gracefully restarting server process" ${SSH} docker exec ${DOCKER_NAME} apache2ctl graceful echo "Server process restarted" echo echo "===================================================================" echo "Restarting Celery worker." ${SSH} docker restart ${CELERY_WORKER_DOCKER_NAME} echo "Celery worker docker restarted" echo "Restarting Celery beat." ${SSH} docker restart ${CELERY_BEAT_DOCKER_NAME} echo "Celery beat docker restarted" echo echo "===================================================================" echo "Clearing front page from Redis cache." ${SSH} docker exec redis redis-cli DEL pwview// echo echo "===================================================================" echo "Deploy of ${PROJECT_NAME} is done." echo "==================================================================="