138 lines
2.6 KiB
Bash
Executable File
138 lines
2.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -e
|
|
#set -x
|
|
|
|
LOCAL_IMAGE=xaicorp/nextcloud
|
|
TAG=16.0-${BUILD_NUMBER:-dev}
|
|
REMOTE_IMAGE=dkregistry.xai-corp.net:5000/${LOCAL_IMAGE}:${TAG}
|
|
STACK_NAME=xaibox
|
|
SERVICE_NAME=app
|
|
APP_NAME=${STACK_NAME}_${SERVICE_NAME}
|
|
|
|
LOG=$(mktemp)
|
|
|
|
export LOCAL_IMAGE
|
|
export REMOTE_IMAGE
|
|
export TAG
|
|
|
|
export DOCKER_HOST=${DOCKER_HOST:-'dkhost:2376'}
|
|
|
|
###
|
|
function deploy() {
|
|
docker pull "$REMOTE_IMAGE"
|
|
|
|
docker stack deploy \
|
|
--with-registry-auth \
|
|
-c docker-compose.prod.yml \
|
|
${STACK_NAME}
|
|
|
|
sleep 2
|
|
docker stack ps ${STACK_NAME}
|
|
|
|
wait_for_completed
|
|
|
|
occ upgrade
|
|
occ app:update --all
|
|
}
|
|
|
|
wait_for_completed() {
|
|
#states supported: "rollback_completed", "updating", "completed"
|
|
state=$(docker service inspect ${APP_NAME} | jq -r .[0].UpdateStatus.State)
|
|
while [ "completed" != "$state" ]; do
|
|
echo "$state"
|
|
sleep 3
|
|
state=$(docker service inspect ${APP_NAME} | jq -r .[0].UpdateStatus.State)
|
|
done
|
|
sleep 5
|
|
}
|
|
|
|
function deploy_test() {
|
|
set -x
|
|
docker ps | grep ${APP_NAME}
|
|
|
|
assertOK https xaibox.xai-corp.net
|
|
|
|
assertNetwork prod_ui
|
|
assertNetwork prod_app
|
|
assertNetwork prod_db
|
|
assertNetwork prod_cache
|
|
|
|
occ check
|
|
occ status
|
|
}
|
|
|
|
function deploy_save() {
|
|
#tag as latest
|
|
docker tag "$REMOTE_IMAGE" "${REMOTE_IMAGE//${TAG}/latest}"
|
|
docker push "${REMOTE_IMAGE//${TAG}/latest}"
|
|
}
|
|
|
|
dc() {
|
|
# shellcheck disable=SC2068
|
|
docker-compose \
|
|
-f docker-compose.yml \
|
|
-f docker-compose.prod.yml \
|
|
$@
|
|
}
|
|
|
|
occ() {
|
|
container=$(docker ps -qn1)
|
|
# shellcheck disable=SC2068
|
|
docker exec -t -u www-data "$container" php occ $@
|
|
}
|
|
|
|
function assertOK() {
|
|
proto=$1
|
|
domain=$2
|
|
set -e
|
|
echo -e "\033[94m${proto}://${domain}\033[39m"
|
|
curl -IskH "Host: ${domain}" "${proto}://dkhost.xai-corp.net" |
|
|
tee "$LOG" | grep -P "200 OK|302 Found|403 Forbidden"
|
|
}
|
|
|
|
function assertNetwork() {
|
|
network=$1
|
|
echo -e "\033[94minspecting network\033[39m $network"
|
|
docker network inspect "$network" | jq -r .[].Containers[].Name | tee "$LOG" | grep ${APP_NAME}
|
|
}
|
|
|
|
function trap_exit() {
|
|
code=$?
|
|
docker service ls | grep "${APP_NAME}"
|
|
if [ $code -gt 0 ]; then
|
|
echo
|
|
cat "$LOG"
|
|
rm "$LOG"
|
|
echo -e "\033[31mFailed to deploy ${REMOTE_IMAGE} \033[39m"
|
|
exit $code
|
|
fi
|
|
|
|
rm "$LOG"
|
|
echo -e "\033[32mSuccess:\033[39m ${REMOTE_IMAGE} successfully deployed"
|
|
}
|
|
trap trap_exit EXIT
|
|
|
|
print_usage() {
|
|
printf "Usage: %s: [-b] [-t] [-s] \n" "$0"
|
|
echo -d deploy
|
|
echo -t smoke tests
|
|
echo -s tag as latest
|
|
echo -h help
|
|
exit 0
|
|
}
|
|
|
|
######
|
|
if [ -z "$1" ]; then
|
|
deploy && deploy_test && deploy_save
|
|
exit
|
|
fi
|
|
|
|
while getopts tdhs name; do
|
|
case $name in
|
|
d) deploy ;;
|
|
t) deploy_test ;;
|
|
s) deploy_save ;;
|
|
*) print_usage ;;
|
|
esac
|
|
done
|