diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 07648c5824a9aa6c5d34534ca9a2186946474525..4526552a83f85c1affdbda45416e52eb8671913c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -73,6 +73,8 @@ stages:
 #  - dast
   - staging
   - canary
+  - jar
+  - publish
   - production
   - incremental rollout 10%
   - incremental rollout 25%
@@ -127,17 +129,71 @@ trampoline-feedback:
     expire_in: 1 week
 
 checkstyle:
-  stage: test
+#  image: $CI_REGISTRY/$CI_PROJECT_PATH/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHA
   image: wukl/auta-build:0.1.0
+  stage: test
   script:
     - ./gradlew checkstyleMain checkstyleTest
 
 spotbugs:
-  stage: test
+#  image: $CI_REGISTRY/$CI_PROJECT_PATH/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHA
   image: wukl/auta-build:0.1.0
+  stage: test
   script:
     - ./gradlew :spotbugsMain :core:spotbugsMain :worker:spotbugsMain
 
+jar-core:
+#  image: $CI_REGISTRY/$CI_PROJECT_PATH/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHA
+  image: wukl/auta-build:0.1.0
+  stage: jar
+  script:
+    - ./gradlew bootJar
+  artifacts:
+    paths:
+      - core/build/libs/core-*.jar
+    expire_in: 1h
+
+jar-worker:
+#  image: $CI_REGISTRY/$CI_PROJECT_PATH/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHA
+  image: wukl/auta-build:0.1.0
+  stage: jar
+  script:
+    - ./gradlew :worker:jar
+  artifacts:
+    paths:
+      - worker/build/libs/worker-*.jar
+    expire_in: 1h
+
+publish-core:
+  image: registry.gitlab.com/gitlab-org/cluster-integration/auto-build-image/master:stable
+  variables:
+    DOCKER_TLS_CERTDIR: ""
+  services:
+    - docker:19.03.5-dind
+  only:
+    - branches
+  stage: publish
+  dependencies:
+    - jar-core
+  script:
+    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+    - devops/build-slim-image core $CI_COMMIT_REF_NAME
+
+publish-worker:
+  image: registry.gitlab.com/gitlab-org/cluster-integration/auto-build-image/master:stable
+  variables:
+    DOCKER_TLS_CERTDIR: ""
+  services:
+    - docker:19.03.5-dind
+  only:
+    - branches
+  stage: publish
+  dependencies:
+    - jar-worker
+  script:
+    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+    - devops/build-slim-image worker $CI_COMMIT_REF_NAME
+
 # Override DAST job to exclude master branch
 #dast:
 #  except:
diff --git a/devops/build-slim-image b/devops/build-slim-image
new file mode 100755
index 0000000000000000000000000000000000000000..3670308e02fa9f4844389702d5fa7f757fde87c6
--- /dev/null
+++ b/devops/build-slim-image
@@ -0,0 +1,44 @@
+#!/bin/bash
+set -e
+
+COMPONENT=$1
+TAG=$2
+
+if [ -z "$COMPONENT" ] || [ "$COMPONENT" = all ]
+then
+  ./$0 core $TAG
+  ./$0 worker $TAG
+  exit
+fi
+
+if [ -n "$TAG" ]
+then
+  TAG=-$TAG
+fi
+
+VERSION=$(grep -o "    version = '[^']*'" build.gradle | cut -d "'" -f 2 | tr -d '\n')
+
+/bin/echo -e "\033[33;1mReleasing AuTA $COMPONENT v$VERSION$TAG\033[0m"
+
+if [ $COMPONENT = core ]
+then
+  ARGS=
+else
+  ARGS='host=$COREADDRESS name=$WORKERNAME api-token=$APIKEY api-protocol=$APIPROTOCOL api-port=$APIPORT docker-api=$DOCKERAPI'
+fi
+
+docker build --no-cache --pull -t $CI_REGISTRY/$CI_PROJECT_PATH/$COMPONENT -f slim-$COMPONENT.Dockerfile . \
+    --build-arg VERSION=$VERSION --build-arg COMPONENT=$COMPONENT --build-arg ARGS="$ARGS"
+
+if [ "$TAG" = -local ]
+then
+  exit
+fi
+
+if [ "$TAG" = -latest ] || [ "$TAG" = -master ]
+then
+  docker push $CI_REGISTRY/$CI_PROJECT_PATH/$COMPONENT
+else
+  docker tag $CI_REGISTRY/$CI_PROJECT_PATH/$COMPONENT $CI_REGISTRY/$CI_PROJECT_PATH/$COMPONENT:$VERSION$TAG
+  docker push $CI_REGISTRY/$CI_PROJECT_PATH/$COMPONENT:$VERSION$TAG
+fi