uppy/bin/bootandkill-servers
2017-07-02 07:37:02 -04:00

100 lines
2.9 KiB
Bash
Executable file

#!/usr/bin/env bash
# How to run:
#
# ./bootandkill-servers ./test-acceptance
#
# this will boot hexo & uppy-server, run the script that you provided as an argument,
# and tear down the servers
set -o pipefail
set -o errexit
set -o nounset
set -o xtrace
# Set magic variables for current file & dir
__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
__file="${__dir}/$(basename "${BASH_SOURCE[0]}")"
__base="$(basename ${__file} .sh)"
__root="$(cd "$(dirname "${__dir}")" && pwd)"
if [ ! -f "${__root}/env.sh" ]; then
cp "${__root}/env.example.sh" "${__root}/env.sh"
fi
if [ "${UPPYSERVER_DROPBOX_KEY:-}" = "" ] || [ "${UPPYSERVER_DROPBOX_KEY:-***}" = "***" ]; then
source "${__root}/env.sh"
fi
if [ "${UPPYSERVER_DROPBOX_KEY:-}" = "" ] || [ "${UPPYSERVER_DROPBOX_KEY:-***}" = "***" ]; then
echo "[${__base}] Env var UPPYSERVER_DROPBOX_KEY still had the example value '${UPPYSERVER_DROPBOX_KEY:-}'. "
echo "[${__base}] Please save the actual secrets in '${__root}/env.sh' and try again"
exit 1
fi
function killProcessListeningOnPort () {
local port="${1}"
lsof -n -i4TCP:${port} | awk '/LISTEN/ {print $2}' |xargs --no-run-if-empty kill -9 || true
}
function cleanup_servers () {
echo "[${__base}] --> Killing any server listening on port 4000"
killProcessListeningOnPort 4000 || true
echo "[${__base}] --> Killing any server listening on port 3020"
killProcessListeningOnPort 3020 || true
kill -9 ${tailPid}
}
function waitForPortOpen () {
local port="${1}"
local limit="${2:-100}"
local attempts=0
echo "[${__base}] waiting on port ${port} to open... "
while ! echo exit | nc localhost ${port}; do
let "attempts = attempts + 1"
echo "[${__base}] still waiting on port ${port} to open... (${attempts} / ${limit}) "
sleep 1
if [ "${attempts}" -ge "${limit}" ]; then
echo "[${__base}] --> Port did not open for ${limit} seconds. Aborting. "
exit 1
fi
done
}
echo "[${__base}] --> Killing any server listening on port 4000"
killProcessListeningOnPort 4000 || true
echo "[${__base}] --> Killing any server listening on port 3020"
killProcessListeningOnPort 3020 || true
echo "[${__base}] --> Start webserver and uppy-server in the background"
rm -f nohup.out || true
touch nohup.out
nohup npm run test:serve &
tail -f nohup.out &
tailPid=${!}
trap cleanup_servers EXIT
echo "[${__base}] --> Wait for hexo webserver to be online"
waitForPortOpen 4000
echo "[${__base}] --> Wait for uppy-server to be online"
waitForPortOpen 3020
echo "[${__base}] --> Running acceptance tests"
buildWait=20
if [ "${TRAVIS:-}" = "true" ]; then
buildWait=60
echo "Increasing build wait because Travis has no Hexo build cache"
fi
echo "[${__base}] --> Sleeping ${buildWait}s, because the port may be open, but Hexo may still be injecting/building stuff"
echo "[${__base}] --> and I don't know yet how to check for that"
sleep ${buildWait}
# @todo: Instead of this `sleep` we can wait until the required files are in public : )
${@}