diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 58e75e3ed747bfed3b4bad9a2f4437e9eaa41b87..347a99eabb82936cb979cb711ac93ecf38b97185 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,7 @@
 stages:
   - test
-  - deploy
+  - build
+  - publish
 
 test:
   stage: test
@@ -24,13 +25,22 @@ test:
     expire_in: 1 week
   rules:
     - if: $CI_PIPELINE_SOURCE == "merge_request_event" &&
-          $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev"
-    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
-      when: never
-    - if: $CI_COMMIT_BRANCH
+          $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
+    - if: $CI_COMMIT_REF_PROTECTED == "true"
 
-prepare:
-  stage: deploy
+docker:
+  stage: build
+  image:
+    name: gcr.io/kaniko-project/executor:debug
+    entrypoint: [""]
+  script:
+    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
+    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:${CI_COMMIT_REF_NAME%+*}
+  rules:
+    - if: $CI_COMMIT_REF_PROTECTED == "true"
+
+release:dry-run:
+  stage: publish
   image: node:alpine
   before_script:
     - apk add --no-cache git openssh openssl curl
@@ -40,7 +50,6 @@ prepare:
     - chmod 700 ~/.ssh
     - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
     - git checkout $CI_COMMIT_REF_NAME
-    - git pull --rebase
     - git remote set-url origin "git@forge.tedomum.net:$CI_PROJECT_PATH.git"
     - git config --global user.name "${GITLAB_USER_LOGIN}"
     - git config --global user.email "${GITLAB_USER_EMAIL}"
@@ -57,27 +66,14 @@ prepare:
   rules:
     - if: $CI_PIPELINE_SOURCE == "merge_request_event" &&
           $CI_MERGE_REQUEST_LABELS =~ /RELEASE/ &&
-          $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev"
+          $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
 
 release:
-  stage: deploy
+  stage: publish
   extends:
-    - prepare
+    - release:dry-run
   script:
     - npx release-it --ci --no-npm
     - GITLAB_TOKEN=${RELEASE_IT_TOKEN} npx release-it --ci --no-git --no-increment --no-npm --gitlab.release
   rules:
     - if: $CI_COMMIT_BRANCH == "main"
-
-docker:
-  stage: deploy
-  image:
-    name: gcr.io/kaniko-project/executor:debug
-    entrypoint: [""]
-  script:
-    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
-    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:${CI_COMMIT_REF_NAME%+*}
-  rules:
-    - if: $CI_COMMIT_TAG && $CI_COMMIT_BRANCH == "main"
-    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
-  needs: ["test"]
diff --git a/.release-it.toml b/.release-it.toml
index 54a5423bc4ee17f752a08830f0142b15c442612d..7894bcd2227a908498647b689336cadacc765771 100644
--- a/.release-it.toml
+++ b/.release-it.toml
@@ -1,9 +1,11 @@
 [git]
 requireCommits = true
+pushArgs = ["-o ci.skip"]
 [plugins]
 [plugins."@release-it/conventional-changelog"]
 infile = "CHANGELOG.md"
   [plugins."@release-it/conventional-changelog".preset]
   name = "conventionalcommits"
 [plugins."@release-it/bumper"]
+  in = ["package.json", "pyproject.toml"]
   out = ["package.json", "pyproject.toml"]
diff --git a/pyproject.toml b/pyproject.toml
index 9fedfaa051844d52c6aa20a81f9667616764d150..fb118b97dafd35cc648b9a20f442644abbc26503 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,8 +1,6 @@
-version = "0.1.0"
-
 [tool.poetry]
 name = "Hiboo"
-version = "0.0.0"
+version = "0.1.0"
 description = "Security framework for small-sized hosting services"
 homepage = "https://forge.tedomum.net/acides/hiboo"
 repository = "https://forge.tedomum.net/acides/hiboo"