diff --git a/ExerciseChecker/.env.vault b/ExerciseChecker/.env.vault
index 586a52eebe627a6a2bfbeb3343ccd928cba1599b..778640b68e2a672e519a3c195010408bea64e26c 100644
--- a/ExerciseChecker/.env.vault
+++ b/ExerciseChecker/.env.vault
@@ -4,8 +4,11 @@
 #/--------------------------------------------------/
 
 # development
-DOTENV_VAULT_DEVELOPMENT="Au1M8CnhJUGXCLf5E8mKtiOMbDsfBjJv0XOQqHUHooo2R+EaGhcAtrQb6SbgC8DNZE0yTbQob7QpapvLENGyXlrfrM6MPHAeVMJbV9w0EmAvvaKPK3Ri5EOENVPT+IF7L34T+5Tzd5VNMSaVntIYKt7rjyOVMbmr72mtUnyw1ZFCiKPSRUiYlEIfuxgvUZ2hB0GVh0XnUv+yXUAO8GLbbg45xGWYQUu+7SBEmnC9xOVuW0jTgluroTqu8GqWwK3Kiq87h13WPCVewVxWPtPIphdOxCxF8ockXvJ4oDgnMjiCKOYihxj1e25r83kLPpwCguOQr4/PFFKF20AfdNSa9cAZjMrWe5BIgpDCGOC9/q08OzGQfwR+KOQF1+aHWhjwvlA1+M4wuCH5ZSN8jOSsaPrMcEMeF/nHpU/3sGnGxcMo2zAjcPXwgbFqFEuAZyNz1rOJPMyv335p4ZXkpBsnkUy8BQ3sZDnybx+dZETvOYH2/17aNGGGN+eS9A+VWGegqeD1JRYdP6d+hWDWuEgSWDpmcHF4PW9R8xQxZZavhj+nposY+Evcmp1/qnYeERbavVyXh2L49fJfZzy/0rZzcgrMvrN3yOaKtjf5kmvZmHUNi4Y9WcebZXokcAHYrPPvWNq5yXtZVvVAxvLpLTi1DMcT7FqnAVYaqg4DxwIZ6Ny2kEssloi/bvNp0CidCcCovMh4HTjrRWp7IUv4YA9FekCQuf5dk+MZYf9n57Q6AOsI0YllzG5S/FfklhPkhOP7Twqy0LHcBHMjW79gpC1q2ZxM+iHIJVsZZ0LMduNvjLvNWe1c77lIH4eKDsD5Ocz+vECDcl7FFhSYEDHmN2rAJzL72+2IehPGVuHo/AMpyk9VCFk4viVgZNv+Bj15JC6/ioMPTZUCAQ1TD37am70gwVHCfLqfPK+W81MbXOCtuX8U/OStjSOGs9Y+0MF/My2v3XhZLer3Z4OTHAxFBd0B4tT4CxixYuNuD1QBxB4FjTUrbKbsZskMFd+75T9aGCaLsDfWzKrgWgElp6IrXLg4uvg16rIWMOL13YE+3NYYucEE1ZdPW+ZbAr1h8SCdZTXHEdgRQACEyqCiyJs2Xpy01hU59hMto+M8sA935xhAePOPDZ7jD4BqWOtQFP2+evXmsvvlf0lU7ANUT7QIYJKKwGA4rSpP7A=="
+DOTENV_VAULT_DEVELOPMENT="5g8bGHO2gv3YgdpmW5PvpWORmnu6pppW99g16TX37S81eA4Dnl0CfI0ljVAkDQ45u6lUUUFZEGfFE2x9Lgg+zENxfkVvZAkzFj+0rRKaxipqSj97taT/tVJbXq3M5cmlVwQNP9AKJMLF6/+r/+MPdhkGHU/yM/5/ycmZZoPqfHAmt6KRoTyRMBPH3/kR/7PK5lRpxf4iLSewOD5tBz60nI3GF61mpRFhIloTMsnaab65wERGwA32GS6JKU3RRaQVyyLi/d2kUfFTrq3HN7d37ZN0iNqPv556/ZNs9vmHfgjlNR9SYytzVgyVLKzRlvUpp1mz4tDDpA3OgqV5nymwQ8uSKXuvfhVnh5ac4Nf+v6xcgukt6ps2VEU5VR/qn0nwBX1zWR+K0d/lZxuKtQxVAwUq3Qhwfd8xgmm9iDmW9CqcgXp2SOsRnUaWmLcqgrlfPEJle/EVBDDL/OgzVqky/ZU0nZSJf5W9KAHGXm+CbXX7c7HljMACQdU64wvoI4CNhZ/SJvbdjSBuK45Y08FIv0G7hg52+7tA/qx/p8iST6a4Glqtwvh1TOt8ezEM0UATVy+26EnK44WRku7Xv1ZuLAyHEfmLVxsIeXXzyIHft8Iy3A1Lf4Hm4jcNaYap0DvWPREMTwGXb7FkgTSpdUfYCB2ctdl1Ndva7NDWQwuIC38/+fn5JouB6jyHRB6SfLl/YIz9NeNGPSHRofO46qI1HX2LTZ312ns3wv/8+gOsRmgwBtKuqZ2OqvQYqEnc+372n3MdkRTVIPM+QjvEAkInVtIZY9cWT1aSMFfXEyekDAVxxVKrlzYu1cogwbdMleeTz9XU0qzsghp6ftwox79aStcjCcJHiMTOuz+HWm6MVq0lFwsDvZQVSCYgjkoZBUWvS54c6zcumkbBJF5szyOJrVsiU8QCq47zaQ1O+WIKq1QFhgZm6W2vq7sc/lMPH/gDV2U5O3NpVA0NOo3OBRezkmeX3R7ElVmvHYZxnTtTcepep+5XJkdzrDVuSJWdVM8MWzh16YiefFYD5gxWG6tp8QVM+BXLS/5ErBpKc+40ReBGAL+9spiBxAAgwog4WkKt2jklOCKqQWa3dTcKCqi+g5TwvpOGLmgNg9wg2T5ZR5+W+U4A8bKxSbUdFjYlv7Jxje2ipmbfI3o515xFEiFYc0gPgGSBqg=="
 
 # production
-DOTENV_VAULT_PRODUCTION="UYGmmTiLq+yxMucNPc82nYxyvSfH9PMEVF91hN7qcR4KqaJtKIiiUXOwln+sEYf67Ga/8qSdLg67r5oka07sG0DWVMuWZjUq3RCPscFDZkILxcfg2C29o4gKcg6Kp4xDsFHA25I1Gu/6TZML6V5kk59a31TUDY3mA4AjvFANVh7bm90hWkKpa57YcIO6guH2RsDeuAYQEQt0m3o4zT1/QA7+f844Z7szCNa0vQ/U3h7mL16nqLDYzokWE6euIU9BYFMNL+H54odF8wGOnESMq032FYRbsN4nfeA2CvNclkIQnz3zn1zVGTQLNE/kDqTJOvrDA6tc6InM5ow1EoD6/8Do/Z/knB6Y0fo9BDDrsD0NTWFT0u/ukoURG8Eja9kw011S+bQiT3K3L+lpVL6Sy2Z4vK7qicg90BoejAdb9xvQ80zqqe7+jolczJeD+QeGSg1u2l7G0RAbuMiNKS4Rt3imTm3jYcYsE+YEUcDIciHuTtb9a4agZve4JsaQgu5+miLZWsNkPlCcD24L2d8M8rrxphjhsnFgRVqKXX77ec8d/SNt6NpS3DHgmEn3YQBdu1lkijLCVFXLJf0PlFSIRhaoSh/UBr+zcrfWURsZeFpOg5/Ssah2aocZzHJaddHrcWO6iXCEozsiLWeAZf0sxh9qDkcopaQQv7BeTdHMyGBwyDqWv1lbmNzOfXXRQojJRrGt+0QU4oGVGqLXHxoW9ruhmHTry+Vnr5jOjUchaIhrLOEg8GFPJ5PLSugoNpZ24IRrjA=="
+DOTENV_VAULT_PRODUCTION="7aZnWWflHA4gs5ZZHDpwkeHeKvDMDReEkKFaaVknWI1g7V3mBztxc+26BlfLvAhQxNPRTt5Rkqybf6g4B8lvy0sTlR3qQoM4AYXiNZe4L/GGeefozJnGAd5hUBLO9Chqu2C22cU7Xe4dHcHV08Fxnu8aKL9iTwR5a3PvrNlpIeNIIyoBMLDDKpdhhj7ru4Jv/bsj5Jr7+yddkUg5538+gVnFxT34cOoWAEgibXRpAbEdZxeHn1AwoIAz7ToRbDllcwc9QPhpRHLIg+QsubLZ8eLCrzeUmMWJA/VWvOvH7ZowlbewHpc/W5MyIoiUlXztrroTe2MDYySyYgCK2z8aDpvEJ5wm0WPAzz+UTmsIOJ4QD86kKuXrj8BEVkxX6buNbDcl2yJ/1laobsjSLQHjfGReElP241JKhH4wgkcbsEtAgCfX9VzJ+aqHErIVlXlQW4uLHiTNjo3pHJAfvMJ3rzq/OgdX/4s/5eebQieNbvPUKznJyhYzsSmrj2OUL/A9Cl0pz8NvD6Vw0/ujC7hI36HlZHLI09/4dBKzlUS2oRhSnSB0SIwh0TY0I3jHz+PSqv2cUQcbU19ZcT0IvW7jhTb3gWNzYb839OEjs8VYM2sTSOezKswJpu5sV4NqUONwHhvGkJsAHaFZ1IPpW5kyUCHDkjoD9zFiVo5676XLGjt+fhb+XGXoFDnNpVc1OCGCrDsKMtoCRRpC3eOGrE9bvX6oF3BEhhheUefRYG649PjZNbJNvD5wrrprzahhjQvq6bA0rA=="
+
+# test
+DOTENV_VAULT_TEST="slPyHq6uj365knunmDQbHELis6HUmi/5/n2WG6GiRVskNBYYFP1Hh7vMo52K23KHw2DV3cVM3wlDM4OKSCErqN8NOUukB0zIWhjOnio7U6eXzcsZcK0i2cCyH292zfnrKdWjzxecLgI+/nPX8gb5/0iQTr/c1dhLf3t24jfQZO8P4LGBYdvetrgnaMedRy/k6dDzO4Yxl33Oa9sQCwsL0OtUkfF9k6pE6Z89j/GiO3RRGOiM1XrMkUk/XojMYdXQkRpRPm5YW8i9tEpwPiH8QP/cqHfSz8IL3BKBVOeSoYaJb7NbvF4yhxt5d990Ugu1geYISrrLXhw2z4g2oNRS8YK3nraaXJtlMqTYUZJMoAGBtqhwrdfn33VqQJDbwmtaQsDl8lQ94kJvODeThxQdniS90sUe6WYVsUKdKj48I+JiSiTjJfYS29GOhKvPsZz8CszNiVu5ib6IiZgEFtvl6s+/I143HaahQLtGv6ZynYk7bUuRGd0jaiZR+J2o/rzPMeRCdEOxpByEAs302zZjVnxV582IinG1jRGvu27/BqDyn1j5p3jIJNL9AX5ptuoi0cC3kuJMzALWa51MbD8UOv5Tq68lxDnuG1k77f0QaLsrzdzbJwTpqmJPN3MFYzTQWyqBLUSA32eW0bablKR+YXcvfR6/3ikRofDE10bJYVqX5Ene1DaBXMZwQpaesnto46w+QBL0GRqkvAzQcdtWkl2ABuqRYBB4sWnZHMpbopspwsbV/EdwlcXdwNXHQf2z4m5k8f4Uh6toSwzn"
 
diff --git a/ExerciseChecker/.gitlab-ci/00_vars.yml b/ExerciseChecker/.gitlab-ci/00_vars.yml
index 46cb27b058b7ab53199e24bc6288172dcdf94417..1fcea071b2c22d5d88c35c4a42f7515a42949095 100644
--- a/ExerciseChecker/.gitlab-ci/00_vars.yml
+++ b/ExerciseChecker/.gitlab-ci/00_vars.yml
@@ -6,9 +6,14 @@ variables:
     DOCKER_TLS_CERTDIR:
     DOCKER_DRIVER: overlay2
 
+    DOCKER_REGISTRY: docker.io
+    DOCKER_REGISTRY_USER: dojohesso
+    DOCKER_REGISTRY_IMAGE: dojohesso/dojo_exercise_checker
+
     PROJECT_NAME: DojoExerciseChecker
 
     VERSION_DEV_SUFFIX: '-dev'
+    VERSION_TEST_SUFFIX: '-test'
 
     GITLAB_API_PROJECT_URL: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}
 
diff --git a/ExerciseChecker/.gitlab-ci/01_functions.yml b/ExerciseChecker/.gitlab-ci/01_functions.yml
index f0675a514e20658a7d87932f65073487c89cc028..05fe3aec03b9723a1d71575ff6d6412cf57809c5 100644
--- a/ExerciseChecker/.gitlab-ci/01_functions.yml
+++ b/ExerciseChecker/.gitlab-ci/01_functions.yml
@@ -1,7 +1,19 @@
+.get_vars:
+    script:
+        - IS_DEV=$([[ $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_COMMIT_BRANCH != "test" ]] && echo true || echo false)
+        - IS_TEST=$([[ $CI_COMMIT_BRANCH == "test" ]] && echo true || echo false)
+        - |
+            if [[ $IS_TEST == true ]]; then
+                DOCKER_REGISTRY_USER="dojohessotest"
+                DOCKER_REGISTRY_IMAGE="dojohesso/dojo-test_exercise_checker"
+                DOCKER_REGISTRY_PASSWORD=$DOCKER_TEST_REGISTRY_PASSWORD
+                DOTENV_PROD_KEY=$DOTENV_TEST_KEY
+            fi
+
+
 .get_version:
     script:
-        - IS_DEV=$([[ $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH ]] && echo false || echo true)
-        - VERSION=$(jq -r .version $PROJECT_FOLDER/package.json)$([[ $IS_DEV == true ]] && echo $VERSION_DEV_SUFFIX || echo '')
+        - VERSION=$(jq -r .version $PROJECT_FOLDER/package.json)$([[ $IS_TEST == true ]] && echo $VERSION_TEST_SUFFIX || echo '' )$([[ $IS_DEV == true ]] && echo $VERSION_DEV_SUFFIX || echo '')
 
 
 .get_packages_url:
@@ -21,7 +33,7 @@
 
         # Init docker buildx
         - |
-            if [ $CI_COMMIT_REF_PROTECTED == "true" ]; then
+            if [[ $CI_COMMIT_REF_PROTECTED == "true" || $IS_TEST == true ]]; then
                 docker login -u $DOCKER_REGISTRY_USER -p $DOCKER_REGISTRY_PASSWORD $DOCKER_REGISTRY
             fi
         - docker buildx create --use
@@ -41,15 +53,20 @@
         - cd $PROJECT_FOLDER
         - sed -i -r "s/\{\{VERSION\}\}/${VERSION}/g" src/app.ts
         - |
-            if [ $CI_COMMIT_REF_PROTECTED == "true" ]; then
+            if [[ $CI_COMMIT_REF_PROTECTED == "true" || $IS_TEST == true ]]; then
                 echo "Decrypt production env vars"
                 sed -i -r "s/(DOTENV_KEY[ ]*:[ ]*[\'\"\`])[^'\"\`]*([\'\"\`])([ ]*\,)?//g" src/app.ts
                 sed -i -r "s/,[\ \n]*\}/\}/g" src/app.ts
                 npx dotenv-vault local decrypt "${DOTENV_PROD_KEY}" > .env
-            
             fi
         - cd ..
 
+        # Rename executable for test
+        - |
+            if [[ $IS_TEST == true ]]; then
+                sed -i -r "s%dojo_exercise_checker%dojo-test_exercise_checker%g" $DOCKERFILE
+            fi
+
         # Need to build for each platform separately because of multi-stage builds (docker buildx don't use cache same way as docker build)
         - >
             platform_array=$(echo $DOCKER_PLATFORMS | tr "," "\n");
diff --git a/ExerciseChecker/.gitlab-ci/03_stages.yml b/ExerciseChecker/.gitlab-ci/03_stages.yml
index 198b85a3eeb84675229f3459f1457de2b9c2f2f9..a996ecac4ea23db0640d1c6767b1780748aeccbe 100644
--- a/ExerciseChecker/.gitlab-ci/03_stages.yml
+++ b/ExerciseChecker/.gitlab-ci/03_stages.yml
@@ -4,4 +4,7 @@ stages:
     - build
     - clean
     - upload
-    - release
\ No newline at end of file
+    - release
+
+before_script:
+    - !reference [ .get_vars, script ]
\ No newline at end of file
diff --git a/ExerciseChecker/.gitlab-ci/04_stageCodeQuality.yml b/ExerciseChecker/.gitlab-ci/04_stageCodeQuality.yml
index 9fda59d835ec0c91e23548db55a43a1df8d6ab1b..48f2394902f9143be7eee5ca5706ffbd65f3355b 100644
--- a/ExerciseChecker/.gitlab-ci/04_stageCodeQuality.yml
+++ b/ExerciseChecker/.gitlab-ci/04_stageCodeQuality.yml
@@ -8,3 +8,5 @@ code_quality:lint:
         
         - npm install
         - npm run lint
+    rules:
+        -   if: '$CI_COMMIT_TAG =~ "/^$/"'
diff --git a/ExerciseChecker/.gitlab-ci/05_stageTest.yml b/ExerciseChecker/.gitlab-ci/05_stageTest.yml
index a1b564295624124e216ae7bba18ac6950590eccb..ccb013bcc6113315e83da6b2190787d73ee11903 100644
--- a/ExerciseChecker/.gitlab-ci/05_stageTest.yml
+++ b/ExerciseChecker/.gitlab-ci/05_stageTest.yml
@@ -9,4 +9,4 @@ test:build:
     script:
         - !reference [ .build_script, script ]
     rules:
-        -   if: '$CI_COMMIT_TAG =~ "/^$/" && $CI_COMMIT_REF_PROTECTED != "true"'
\ No newline at end of file
+        -   if: '$CI_COMMIT_TAG =~ "/^$/" && $CI_COMMIT_REF_PROTECTED != "true" && $CI_COMMIT_BRANCH != "test"'
\ No newline at end of file
diff --git a/ExerciseChecker/.gitlab-ci/06_stageBuild.yml b/ExerciseChecker/.gitlab-ci/06_stageBuild.yml
index e2acdd1042c77d84b45e63e3b8b2cdaf217d92bc..a0c6ca411fd86c59aa49fd601563bd262e3ef89f 100644
--- a/ExerciseChecker/.gitlab-ci/06_stageBuild.yml
+++ b/ExerciseChecker/.gitlab-ci/06_stageBuild.yml
@@ -12,4 +12,4 @@ build:version:
         # Here docker buildx can use cached images created in previous step
         - docker buildx build --platform $DOCKER_PLATFORMS --file $DOCKERFILE --push --tag $CONTAINER_IMAGE .
     rules:
-        -   if: '$CI_COMMIT_REF_PROTECTED == "true"'
\ No newline at end of file
+        -   if: '$CI_COMMIT_REF_PROTECTED == "true" || $CI_COMMIT_BRANCH == "test"'
\ No newline at end of file
diff --git a/ExerciseChecker/.gitlab-ci/09_stageRelease.yml b/ExerciseChecker/.gitlab-ci/09_stageRelease.yml
index 325d173cd88c4336e573d1dd33f6ffbe7745c653..ad039e9aa41609db7d147f941fdf6bd73aa3a41b 100644
--- a/ExerciseChecker/.gitlab-ci/09_stageRelease.yml
+++ b/ExerciseChecker/.gitlab-ci/09_stageRelease.yml
@@ -12,7 +12,7 @@ release:dockerhub:latest:
         # Push latest tag
         - docker buildx imagetools create $CONTAINER_IMAGE --tag $DOCKER_REGISTRY_IMAGE:latest
     rules:
-        -   if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+        -   if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH == "test"'
 
 
 release:wiki: