diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2f71f65f0fe4baaca54384f0d6690d65d6e4a887
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,39 @@
+stages:
+  - generate-test-env
+  - test
+  - dockerize
+
+variables:
+  # to avoid "fatal: git fetch-pack: expected shallow list"
+  GIT_STRATEGY: clone
+
+pre_test:
+  stage: generate-test-env
+  tags:
+    - shell
+  script:
+    - docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY}"
+    - docker build -t "${CI_REGISTRY_IMAGE}/vospace-test-env" -f src/test/resources/testing-Dockerfile .
+    - docker push "${CI_REGISTRY_IMAGE}/vospace-test-env"
+  only:
+    refs:
+      - ci-test
+    changes:
+      - src/test/resources/testing-Dockerfile
+
+test:
+  stage: test
+  tags:
+    - docker
+  image: "${CI_REGISTRY_IMAGE}/vospace-test-env"
+  variables:
+    FILE_CATALOG_REPO_URL: "https://gitlab-ci-token:${CI_JOB_TOKEN}@www.ict.inaf.it/gitlab/ia2/vospace-file-catalog.git"
+  script:
+    - pwd
+    - ls
+    - git clone ${FILE_CATALOG_REPO_URL}
+    - mvn clean test -Dinit_database_scripts_path=../../vospace-file-catalog
+    - awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print "coverage=" 100*covered/instructions }' target/site/jacoco/jacoco.csv
+  coverage: '/coverage=\d+\.\d+/'
+  only:
+    - ci-test
diff --git a/src/test/resources/testing-Dockerfile b/src/test/resources/testing-Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..62b1efc8e4a5d6b382f15d346644715c6e46d956
--- /dev/null
+++ b/src/test/resources/testing-Dockerfile
@@ -0,0 +1,9 @@
+# Dockerfile for setting up an environment to run tests
+
+FROM git.ia2.inaf.it:5050/ia2/ia2-devops/maven-otj-pg-embedded
+
+USER root
+
+RUN apt-get update && apt-get install -y git
+
+USER postgres