diff --git a/.gitlab-ci.jsonnet b/.gitlab-ci.jsonnet
new file mode 100644
index 0000000000000000000000000000000000000000..215964ff16e17ab414915529ba8d26bf6a6e6983
--- /dev/null
+++ b/.gitlab-ci.jsonnet
@@ -0,0 +1,32 @@
+local jobs = [
+    {name: "pggat", merge: {}},
+];
+local param_job(image,tag_var, merge = {}) = std.mergePatch({
+    stage: 'build',
+    image: {
+      name: 'gcr.io/kaniko-project/executor:debug',
+      entrypoint: [''],
+    },
+    script: [
+        'mkdir -p /kaniko/.docker',
+        @'echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64)\"}}}" > /kaniko/.docker/config.json',
+        std.strReplace(|||
+            /kaniko/executor
+            --context ${CI_PROJECT_DIR}
+            --cache=true
+            --build-arg GOPROXY
+            --cache-repo="${CI_REGISTRY_IMAGE}/kaniko/cache"
+            --dockerfile "${CI_PROJECT_DIR}/Dockerfile"
+            --destination "${CI_REGISTRY_IMAGE}/%(img)s:%(tag_var)s"
+            --destination "${CI_REGISTRY_IMAGE}/%(img)s:latest"
+        ||| % {img: image, tag_var: tag_var}, "\n", " "),
+        ]
+  }, merge);
+{
+  [job.name+"-tag"]: param_job(job.name,"${CI_COMMIT_TAG}",std.mergePatch(job.merge, {only:["tags"]}))
+  for job in jobs
+} + {
+  [job.name]:  param_job(job.name,"${CI_COMMIT_SHORT_SHA}",job.merge)
+  for job in jobs
+}
+
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ea61d0832ff6955f30e386cd875fff60027ae75d
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,38 @@
+jsonnet:
+  stage: build
+  image: alpine:latest
+  script:
+    - apk add -U jsonnet
+    - jsonnet .gitlab-ci.jsonnet > generated-config.yml
+  artifacts:
+    paths:
+      - generated-config.yml
+
+trigger-builds:
+  stage: build
+  needs:
+    - jsonnet
+  trigger:
+    include:
+      - artifact: generated-config.yml
+        job: jsonnet
+    strategy: depend
+
+trigger-deploy:
+  stage: deploy
+  needs:
+    - trigger-builds
+  image:
+    name: bitnami/kubectl:latest
+    entrypoint: ['']
+  variables:
+    APP_NAME: "pggat"
+    IMAGE_NAME: "pggat"
+    RESOURCE: "statefulset"
+  only:
+    variables:
+      - $CI_COMMIT_BRANCH == "master"
+  script:
+    - kubectl config get-contexts
+    - kubectl config use-context etherlands/gitlab-agents:gfxlabs-dev
+    - kubectl patch $RESOURCE $APP_NAME -p '{"spec":{"template":{"metadata":{"labels":{"date":"'$(date +'%s')'","sha":"'${CI_COMMIT_SHA}'"}},"spec":{"containers":[{"name":"'${APP_NAME}'","image":"'${CI_REGISTRY_IMAGE}'/'${IMAGE_NAME}':latest"}]}}}}'