diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2d2a6d117389615cee55e5c39b0a7fba55f9fcec..fe1c4269cf4ec2860f9126f541afee1d17644c64 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,12 @@
 variables:
   DOCKER_TLS_CERTDIR: ""
 
+stages:
+  - build
+  - test
+  - publish
+
+
 build-master:
   image: docker:latest
   stage: build
@@ -66,3 +72,31 @@ build:
     - docker push "$IMAGE:$CI_COMMIT_REF_NAME"
   except:
     - master
+test:
+  image: docker:latest
+  stage: test
+  variables:
+    BUCKET_NAME: pvs_testing
+  services:
+    - docker:dind
+  before_script:
+    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
+  script:
+    - apk add --update py-pip
+    - pip install -r requirements.txt
+    - pytest
+    - chmod +x env_setup.sh wait_for_container.sh
+    - ./env_setup.sh
+    - docker swarm init
+    - docker stack deploy -c docker-compose.vhr18.yml -c docker-compose.vhr18.dev.yml vhr18-pvs
+    - ./wait_for_container.sh
+    - docker ps
+    - docker ps -qf "name=vhr18-pvs_renderer"
+    # - docker exec -it $(docker ps -qf "name=vhr18-pvs_renderer") python3 /var/www/pvs/dev/pvs_instance/manage.py id list
+  # after_script:
+  #   - docker stack rm vhr18-pvs
+  #   - docker volume rm vhr18-pvs_db-data
+  #   - docker volume rm vhr18-pvs_redis-data
+  #   - docker volume rm vhr18-pvs_traefik-data
+  #   - docker volume rm vhr18-pvs_cache-db
+        
\ No newline at end of file
diff --git a/env_setup.sh b/env_setup.sh
new file mode 100644
index 0000000000000000000000000000000000000000..c106611e745a46536afd6e2995c8a60a63cb9317
--- /dev/null
+++ b/env_setup.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+cat $vhr18_db > ./env/vhr18_db.env
+cat $vhr18_django > ./env/vhr18_django.env
+cat $vhr18_obs > ./env/vhr18_obs.env
+
+cat $emg_db > ./env/emg_db.env
+cat $emg_django > ./env/emg_django.env
+cat $emg_obs > ./env/emg_obs.env
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..55b033e901cdda93a26ac64b418f260224260a39
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1 @@
+pytest
\ No newline at end of file
diff --git a/sample_test.py b/sample_test.py
new file mode 100644
index 0000000000000000000000000000000000000000..752a1541587eb23edd930e2ed7d9d27454d750eb
--- /dev/null
+++ b/sample_test.py
@@ -0,0 +1,6 @@
+def func(x):
+    return x + 1
+
+
+def test_answer():
+    assert func(3) == 4
\ No newline at end of file
diff --git a/wait_for_container.sh b/wait_for_container.sh
new file mode 100644
index 0000000000000000000000000000000000000000..0e83021322c441e32afa098d80ead0cdb6054643
--- /dev/null
+++ b/wait_for_container.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+
+while [ -z $(docker ps -qf "name=vhr18-pvs_renderer")]; do
+    >&2 echo "Container is unavailable - sleeping"
+    sleep 15
+  done
\ No newline at end of file