diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a6e281c4fa94f65595038ebdc89398733bccfd86..fca1533976035d8df8ec6a37648616156cc347fb 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -10,10 +10,9 @@ stages:
   - analyze
   - apply
   - integration-test
-  - deploy
+  - build-release
   - .post
 
-
 include:
   - local: '/.gitlab/ci/.build-container.yml'
   - local: '/.gitlab/ci/.code-quality-ci.yml'
@@ -22,4 +21,4 @@ include:
   - local: '/.gitlab/ci/.containerlab-ci.yml'
   - local: '/.gitlab/ci/.integration-test.yml'
   - local: '/.gitlab/ci/.uml-autogen-ci.yml'
-#  - local: '/.gitlab/ci/.deploy-k8s.yml'
+  - local: '/.gitlab/ci/.build-release.yml'
diff --git a/.gitlab/ci/.build-container.yml b/.gitlab/ci/.build-container.yml
index 189e34f47c492cf28bb895130e1882df4e955134..d948433abc50ff82f4abf39ebef2953c0aa4543a 100644
--- a/.gitlab/ci/.build-container.yml
+++ b/.gitlab/ci/.build-container.yml
@@ -19,7 +19,7 @@ build-testing-image:
         TAG: latest
     - if: $CI_COMMIT_BRANCH == "develop"
       variables:
-        TAG: develop
+        TAG: $CI_COMMIT_BRANCH
         BUILDARGS: -race
     - when: always
   script:
@@ -40,7 +40,7 @@ build-image:
       when: never
     - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
       variables:
-        TAG: latest
+        TAG: $CI_DEFAULT_BRANCH
     - if: $CI_COMMIT_BRANCH == "develop"
       variables:
         TAG: develop
@@ -57,5 +57,3 @@ build-image:
       --destination "$GOSDN_IMAGE"
       --destination "$CI_REGISTRY_IMAGE:$TAG"
   <<: *build
-
-      #--build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/"
diff --git a/.gitlab/ci/.build-release.yml b/.gitlab/ci/.build-release.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e671eb527b66ead794eba0bd3f2fa22f7c0fdda2
--- /dev/null
+++ b/.gitlab/ci/.build-release.yml
@@ -0,0 +1,86 @@
+.build-release-docker: &build-release-docker
+  stage: build-release
+  image:
+    name: gcr.io/kaniko-project/executor:debug
+    entrypoint: [ "" ]
+  rules:
+    # TODO: Implement later when we need it
+    #- if: $CI_COMMIT_TAG =~ .+ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    #  variables:
+    #    TAG: $CI_COMMIT_TAG
+    #  when: on_success
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+      variables:
+        TAG: $CI_DEFAULT_BRANCH
+      when: on_success
+    - when: never
+  before_script:
+      # replace all slashes in the tag with hyphen, because slashes are not allowed in tags
+    - TAG=${TAG//\//-}
+    - mkdir -p /kaniko/.docker
+    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"username\":\"$CI_DEPENDENCY_PROXY_USER\",\"password\":\"$CI_DEPENDENCY_PROXY_TOKEN\"}}}" > /kaniko/.docker/config.json
+
+build-release-image:
+  script:
+    - /kaniko/executor
+      --cache=true
+      --context "$CI_PROJECT_DIR"
+      --dockerfile "Dockerfile"
+      --build-arg "GOLANG_VERSION=$GOLANG_VERSION"
+      --build-arg "BUILDARGS=$BUILDARGS"
+      --build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/"
+      --destination "$GOSDN_IMAGE"
+      --destination "$CI_REGISTRY_IMAGE:$TAG"
+    - /kaniko/executor
+      --cache=true
+      --context "$CI_PROJECT_DIR"
+      --dockerfile "Dockerfile"
+      --build-arg "GOLANG_VERSION=$GOLANG_VERSION"
+      --build-arg "BUILDARGS=$BUILDARGS"
+      --build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/"
+      --destination "$GOSDN_IMAGE"
+      --destination "$CI_REGISTRY_IMAGE:latest"
+  <<: *build-release-docker
+
+
+.build-release-binary: &build-release-binary
+  stage: build-release
+  image:
+    name: ${GITLAB_PROXY}golang:$GOLANG_VERSION
+  rules:
+    # TODO: Implement later when we need it
+    #- if: $CI_COMMIT_TAG =~ .+ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    #  variables:
+    #    TAG: $CI_COMMIT_TAG
+    #  when: on_success
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+      variables:
+        TAG: $CI_DEFAULT_BRANCH
+      when: on_success
+    - if: $CI_COMMIT_BRANCH == "develop"
+      variables:
+        TAG: $CI_COMMIT_BRANCH
+      when: on_success
+    - when: never
+
+build-release-linux:
+  script:
+    - GOOS=linux go build ./cmd/gosdn
+    - mv gosdn gosdn-$TAG
+    - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file gosdn-$TAG "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/gosdn/$TAG/gosdn-$TAG-linux"'
+  artifacts:
+    paths:
+      - gosdn-$TAG
+    expire_in: 4 weeks
+  <<: *build-release-binary
+
+build-release-freebsd:
+  script:
+    - GOOS=freebsd go build ./cmd/gosdn
+    - mv gosdn gosdn-$TAG
+    - - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file gosdn-$TAG "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/gosdn/$TAG/gosdn-$TAG-freebsd"'
+  artifacts:
+    paths:
+      - gosdn-$TAG
+    expire_in: 4 weeks
+  <<: *build-release-binary
\ No newline at end of file