From 4e3eb7dd5e38edfae5348718e63ddacad85931a5 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Mon, 10 Apr 2023 14:01:36 +0200 Subject: [PATCH] docker: add test setup --- .dockerignore | 2 + .gitignore | 3 ++ docker/test/Dockerfile | 29 ++++++++++++++ docker/test/docker-compose.yaml | 30 ++++++++++++++ docker/test/docker.env | 28 +++++++++++++ docker/test/entrypoint-master.sh | 41 ++++++++++++++++++++ docker/test/provision/mysql/init/01-user.sql | 1 + 7 files changed, 134 insertions(+) create mode 100644 docker/test/Dockerfile create mode 100644 docker/test/docker-compose.yaml create mode 100644 docker/test/docker.env create mode 100755 docker/test/entrypoint-master.sh create mode 100644 docker/test/provision/mysql/init/01-user.sql diff --git a/.dockerignore b/.dockerignore index bc74dd3..ce4f8b2 100644 --- a/.dockerignore +++ b/.dockerignore @@ -113,7 +113,9 @@ jdav_web/celerybeat-schedule.db # docker development database folder docker/development/db +docker/test/db # docker dev and production media folders docker/development/media docker/production/media +docker/test/media diff --git a/.gitignore b/.gitignore index 6c752a8..7b765bb 100644 --- a/.gitignore +++ b/.gitignore @@ -114,10 +114,13 @@ jdav_web/celerybeat-schedule.db # docker environment variables docker.env +!docker/test/docker.env # docker development database folder docker/development/db +docker/test/db # docker dev and production media folders docker/development/media docker/production/media +docker/test/media diff --git a/docker/test/Dockerfile b/docker/test/Dockerfile new file mode 100644 index 0000000..a4de64d --- /dev/null +++ b/docker/test/Dockerfile @@ -0,0 +1,29 @@ +FROM python:3.9-bullseye + +# install additional dependencies +RUN apt-get update && apt-get install -y gettext texlive texlive-fonts-extra + +# create user +RUN groupadd -g 501 app && useradd -g 501 -u 501 -m -d /app app + +# create static directory and set permissions, when doing this before mounting a named volume +# in docker-compose.yaml, the permissions are inherited during the mount. +RUN mkdir -p /var/www/jdav_web/static && chown -R app:app /var/www/jdav_web/static + +# create static directory and set permissions, when doing this before mounting a named volume +# in docker-compose.yaml, the permissions are inherited during the mount. +RUN mkdir -p /tmp/uwsgi && chown -R app:app /tmp/uwsgi + +WORKDIR /app +USER app + +# add .local/bin to PATH +ENV PATH="/app/.local/bin:$PATH" + +# install requirements +COPY --chown=app:app ./requirements.txt /app/requirements.txt +# we install uwsgi here to check if packages dependencies are resolved, but we don't actually +# need uwsgi in test +RUN pip install coverage uwsgi -r requirements.txt + +COPY --chown=app:app . /app diff --git a/docker/test/docker-compose.yaml b/docker/test/docker-compose.yaml new file mode 100644 index 0000000..e42febf --- /dev/null +++ b/docker/test/docker-compose.yaml @@ -0,0 +1,30 @@ +version: "3.9" + +services: + master: + image: kompass:test + build: + context: ./../../ + dockerfile: docker/test/Dockerfile + env_file: docker.env + depends_on: + - redis + - cache + - db + entrypoint: /app/docker/test/entrypoint-master.sh + + cache: + restart: always + image: memcached:alpine + + redis: + restart: always + image: redis:6-alpine + + db: + restart: always + image: mariadb + volumes: + - ./db:/var/lib/mysql + - ./provision/mysql/init:/docker-entrypoint-initdb.d + env_file: docker.env diff --git a/docker/test/docker.env b/docker/test/docker.env new file mode 100644 index 0000000..2e20f64 --- /dev/null +++ b/docker/test/docker.env @@ -0,0 +1,28 @@ +DJANGO_ALLOWED_HOST='*' +DJANGO_BASE_URL='localhost:8000' +DJANGO_PROTOCOL='http' + +EMAIL_HOST='localhost' +EMAIL_HOST_USER='test' +EMAIL_HOST_PASSWORD='password' +EMAIL_SENDING_ADDRESS='test@localhost' + +DJANGO_DEPLOY=1 +DJANGO_DEBUG=1 + +DJANGO_DATABASE_NAME='kompass' +DJANGO_DATABASE_USER='kompass' +DJANGO_DATABASE_PASSWORD='password' +DJANGO_DATABASE_HOST='db' +DJANGO_DATABASE_PORT=3306 + +MYSQL_ROOT_PASSWORD='secretpassword' +MYSQL_PASSWORD='password' +MYSQL_USER='kompass' +MYSQL_DATABASE='kompass' + +DJANGO_SETTINGS_MODULE='jdav_web.settings' +DJANGO_STATIC_ROOT='/var/www/jdav_web/assets' + +MEMCACHED_URL='cache:11211' +BROKER_URL='redis://redis:6379/0' diff --git a/docker/test/entrypoint-master.sh b/docker/test/entrypoint-master.sh new file mode 100755 index 0000000..d111987 --- /dev/null +++ b/docker/test/entrypoint-master.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +set -o errexit + +mysql_ready() { +cd /app/jdav_web +python << END +import sys + +from django.db import connections +from django.db.utils import OperationalError + +db_conn = connections['default'] + +try: + c = db_conn.cursor() +except OperationalError: + sys.exit(-1) +else: + sys.exit(0) + +END +} + +until mysql_ready; do + >&2 echo 'Waiting for MySQL to become available...' + sleep 1 +done +>&2 echo 'MySQL is available' + +cd /app + +if ! [ -f /tmp/completed_initial_run ]; then + echo 'Initialising kompass master container' + + python jdav_web/manage.py compilemessages --locale de +fi + +cd jdav_web + +coverage run manage.py test startpage finance members -v 2 diff --git a/docker/test/provision/mysql/init/01-user.sql b/docker/test/provision/mysql/init/01-user.sql new file mode 100644 index 0000000..267a42e --- /dev/null +++ b/docker/test/provision/mysql/init/01-user.sql @@ -0,0 +1 @@ +GRANT ALL PRIVILEGES ON test_kompass.* TO 'kompass'@'%';