Skip to content

Commit

Permalink
Make docker CI test more elaborate
Browse files Browse the repository at this point in the history
Now we are testing not only if it can be built, but also start both
servers and test to see if we get an expected response.
  • Loading branch information
CasperWA committed Jan 30, 2020
1 parent eb95fb3 commit b234f3b
Show file tree
Hide file tree
Showing 5 changed files with 201 additions and 10 deletions.
11 changes: 11 additions & 0 deletions .docker/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/bin/bash
set -ex

if [ "${MAIN}" == "main_index" ]; then
PORT=5001
else
MAIN="main"
PORT=5000
fi

uvicorn optimade.server.$MAIN:app --host 0.0.0.0 --port $PORT
16 changes: 15 additions & 1 deletion .github/workflows/deps_lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,21 @@ jobs:
- uses: actions/checkout@v1

- name: Build the Docker image
run: docker-compose -f ./docker-compose.yml build
run: |
.github/workflows/wait_for_it.sh localhost:3213 -t 120 &
docker-compose -f ./docker-compose.yml up &
- name: Test server
run: |
sleep 15
curl http://localhost:3213/optimade/info > info.json
grep -F "http://example.com" info.json || exit 1
- name: Test index server
run: |
sleep 15
curl http://localhost:3214/optimade/info > info.json
grep -F "http://example.com" info.json || exit 1
deps_static:
runs-on: ubuntu-latest
Expand Down
161 changes: 161 additions & 0 deletions .github/workflows/wait_for_it.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
#!/usr/bin/env bash
# Use this script to test if a given TCP host/port are available

cmdname=$(basename $0)

echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }

usage()
{
cat << USAGE >&2
Usage:
$cmdname host:port [-s] [-t timeout] [-- command args]
-h HOST | --host=HOST Host or IP under test
-p PORT | --port=PORT TCP port under test
Alternatively, you specify the host and port as host:port
-s | --strict Only execute subcommand if the test succeeds
-q | --quiet Don't output any status messages
-t TIMEOUT | --timeout=TIMEOUT
Timeout in seconds, zero for no timeout
-- COMMAND ARGS Execute command with args after the test finishes
USAGE
exit 1
}

wait_for()
{
if [[ $TIMEOUT -gt 0 ]]; then
echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT"
else
echoerr "$cmdname: waiting for $HOST:$PORT without a timeout"
fi
start_ts=$(date +%s)
while :
do
(echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1
result=$?
if [[ $result -eq 0 ]]; then
end_ts=$(date +%s)
echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds"
break
fi
sleep 1
done
return $result
}

wait_for_wrapper()
{
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
if [[ $QUIET -eq 1 ]]; then
timeout $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT &
else
timeout $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT &
fi
PID=$!
trap "kill -INT -$PID" INT
wait $PID
RESULT=$?
if [[ $RESULT -ne 0 ]]; then
echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT"
fi
return $RESULT
}

# process arguments
while [[ $# -gt 0 ]]
do
case "$1" in
*:* )
hostport=(${1//:/ })
HOST=${hostport[0]}
PORT=${hostport[1]}
shift 1
;;
--child)
CHILD=1
shift 1
;;
-q | --quiet)
QUIET=1
shift 1
;;
-s | --strict)
STRICT=1
shift 1
;;
-h)
HOST="$2"
if [[ $HOST == "" ]]; then break; fi
shift 2
;;
--host=*)
HOST="${1#*=}"
shift 1
;;
-p)
PORT="$2"
if [[ $PORT == "" ]]; then break; fi
shift 2
;;
--port=*)
PORT="${1#*=}"
shift 1
;;
-t)
TIMEOUT="$2"
if [[ $TIMEOUT == "" ]]; then break; fi
shift 2
;;
--timeout=*)
TIMEOUT="${1#*=}"
shift 1
;;
--)
shift
CLI="$@"
break
;;
--help)
usage
;;
*)
echoerr "Unknown argument: $1"
usage
;;
esac
done

if [[ "$HOST" == "" || "$PORT" == "" ]]; then
echoerr "Error: you need to provide a host and port to test."
usage
fi

TIMEOUT=${TIMEOUT:-15}
STRICT=${STRICT:-0}
CHILD=${CHILD:-0}
QUIET=${QUIET:-0}

if [[ $CHILD -gt 0 ]]; then
wait_for
RESULT=$?
exit $RESULT
else
if [[ $TIMEOUT -gt 0 ]]; then
wait_for_wrapper
RESULT=$?
else
wait_for
RESULT=$?
fi
fi

if [[ $CLI != "" ]]; then
if [[ $RESULT -ne 0 && $STRICT -eq 1 ]]; then
echoerr "$cmdname: strict mode, refusing to execute subprocess"
exit $RESULT
fi
exec $CLI
else
exit $RESULT
fi
7 changes: 4 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ COPY setup.py README.md ./
COPY optimade ./optimade
RUN pip install -e .[server]

EXPOSE 80
ARG PORT=5000
EXPOSE ${PORT}

COPY run.sh ./
COPY .docker/run.sh ./

CMD ["/app/run.sh", "$MAIN"]
CMD ["/app/run.sh"]
16 changes: 10 additions & 6 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,26 @@ version: '2'

services:

optimade-index:
optimade:
restart: always
build:
context: .
dockerfile: Dockerfile
args:
PORT: 5000
environment:
MAIN: main_index
MAIN: main
ports:
- '3214:5001'
- '3213:5000'

optimade:
optimade-index:
restart: always
build:
context: .
dockerfile: Dockerfile
args:
PORT: 5001
environment:
MAIN: main
MAIN: main_index
ports:
- '3213:5000'
- '3214:5001'

0 comments on commit b234f3b

Please sign in to comment.