diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2c13426dc3e0500cc7d53391b846d43c0cb745fc..99a23ebb141f5d2eeab52202a0ea9e4b96c475eb 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -17,4 +17,25 @@ build:
     - docker tag "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME/polls:${CI_COMMIT_SHORT_SHA}" "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME/polls:latest"
     - docker push "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME/polls:${CI_COMMIT_SHORT_SHA}"
   tags:
-    - k8s
\ No newline at end of file
+    - k8s
+
+deploy:
+  stage: deploy
+  image: registry-gitlab.pasteur.fr/dsi-tools/docker-images:docker_kubernetes_image
+  variables:
+    NAMESPACE: ${GITLAB_USER_LOGIN}-${CI_PROJECT_NAME}
+  environment:
+    name: ${GITLAB_USER_LOGIN}-${CI_PROJECT_NAME}
+    url: https://${GITLAB_USER_LOGIN}-${CI_PROJECT_NAME}.k8s-dev.pasteur.fr
+  script:
+    - kubectl delete secret registry-gitlab -n ${NAMESPACE} --ignore-not-found=true
+    - kubectl create secret docker-registry -n ${NAMESPACE} registry-gitlab --docker-server=registry-gitlab.pasteur.fr --docker-username=${DEPLOY_USER} --docker-password=${DEPLOY_TOKEN} --docker-email=kubernetes@pasteur.fr
+    - envsubst < postgresql.yaml | kubectl apply -n ${NAMESPACE} -f -
+    - kubectl wait --for=condition=available --timeout=600s deployment/postgresql
+    - kubectl delete job polls-migrations -n ${NAMESPACE} --ignore-not-found=true
+    - envsubst < job.yaml | kubectl apply -n ${NAMESPACE} -f -
+    - kubectl wait --for=condition=complete --timeout=600s job/polls-migrations
+    - envsubst < polls.yaml | kubectl apply -n ${NAMESPACE} -f -
+    - kubectl patch deployment polls -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"
+  tags:
+    - k8s