diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a5322dd13132c688dbdecb1f9aee199d359de840..9e3ac9177517205ddc9034c3a05eefcd52eebd57 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -8,8 +8,13 @@ variables:
     MACOS_PKG_EXTENSION: '.pkg'
     MACOS_PKG_BIN_NAME: "${BIN_NAME}${MACOS_PKG_EXTENSION}"
 
+    WINDOWS_BIN_EXTENSION: '.exe'
+    WINDOWS_BIN_NAME: "${BIN_NAME}${WINDOWS_BIN_EXTENSION}"
+
     ARTIFACTS_FOLDER: /artifacts
 
+    GITLAB_API_PROJECT_URL: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}
+
     BIN_FOLDER_MACOS: $ARTIFACTS_FOLDER/macOS
     BIN_FOLDER_LINUX: $ARTIFACTS_FOLDER/Linux
     BIN_FOLDER_WINDOWS: $ARTIFACTS_FOLDER/Windows
@@ -23,15 +28,15 @@ variables:
     BIN_PKG_FILE_MACOS_X64: $BIN_FOLDER_MACOS_X64/$MACOS_PKG_BIN_NAME
     BIN_FILE_LINUX_ARM64: $BIN_FOLDER_LINUX/arm64/$BIN_NAME
     BIN_FILE_LINUX_X64: $BIN_FOLDER_LINUX/x64/$BIN_NAME
-    BIN_FILE_WINDOWS_ARM64: $BIN_FOLDER_WINDOWS/arm64/$BIN_NAME.exe
-    BIN_FILE_WINDOWS_X64: $BIN_FOLDER_WINDOWS/x64/$BIN_NAME.exe
+    BIN_FILE_WINDOWS_ARM64: $BIN_FOLDER_WINDOWS/arm64/$WINDOWS_BIN_NAME
+    BIN_FILE_WINDOWS_X64: $BIN_FOLDER_WINDOWS/x64/$WINDOWS_BIN_NAME
 
     VERSION_FILE: $ARTIFACTS_FOLDER/VERSION
     VERSION_DEV_SUFFIX: '-dev'
 
     PROJECT_FOLDER: NodeApp
 
-    PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${BIN_NAME}"
+    PACKAGE_REGISTRY_URL: "${GITLAB_API_PROJECT_URL}/packages/generic/${BIN_NAME}"
 
 
 .get_version:
@@ -47,8 +52,8 @@ variables:
         - PACKAGE_URL_MACOS_X64_PKG="${PACKAGE_REGISTRY_URL}_macOS-pkg-x64/${VERSION}/${MACOS_PKG_BIN_NAME}"
         - PACKAGE_URL_LINUX_ARM64_BIN="${PACKAGE_REGISTRY_URL}_Linux-arm64/${VERSION}/${BIN_NAME}"
         - PACKAGE_URL_LINUX_X64_BIN="${PACKAGE_REGISTRY_URL}_Linux-x64/${VERSION}/${BIN_NAME}"
-        - PACKAGE_URL_WINDOWS_ARM64_BIN="${PACKAGE_REGISTRY_URL}_Windows-arm64/${VERSION}/${BIN_NAME}"
-        - PACKAGE_URL_WINDOWS_X64_BIN="${PACKAGE_REGISTRY_URL}_Windows-x64/${VERSION}/${BIN_NAME}"
+        - PACKAGE_URL_WINDOWS_ARM64_BIN="${PACKAGE_REGISTRY_URL}_Windows-arm64/${VERSION}/${WINDOWS_BIN_NAME}"
+        - PACKAGE_URL_WINDOWS_X64_BIN="${PACKAGE_REGISTRY_URL}_Windows-x64/${VERSION}/${WINDOWS_BIN_NAME}"
 
 .build_cli:
     script:
@@ -86,12 +91,14 @@ variables:
 .clean_release:
     script:
         # Delete release if it already exists
-        - 'curl --request DELETE --header "JOB-TOKEN: $CI_JOB_TOKEN" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/releases/${VERSION}"'
+        - 'curl --request DELETE --header "JOB-TOKEN: $CI_JOB_TOKEN" "${GITLAB_API_PROJECT_URL}/releases/${VERSION}"'
+        # Delete tag if it already exists (use private-token because job-token don't have permission to delete tags)
+        - 'curl --request DELETE --header "PRIVATE-TOKEN: $GITLAB_PROJECT_ACCESS_TOKEN" "${GITLAB_API_PROJECT_URL}/repository/tags/${VERSION}"'
 
 .clean_packages:
     script:
         # Get all packages of the project
-        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages" > gitlabPackages.json'
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "${GITLAB_API_PROJECT_URL}/packages" > gitlabPackages.json'
         # Filter and select packages to delete (based on version)
         - packagesToDelete=`jq -r '.[] | select(.version=="'${VERSION}'") | ._links.delete_api_path' gitlabPackages.json`
         # Delete packages by calling Gitlab API
@@ -103,16 +110,16 @@ variables:
 
 
 stages:
+    - test
     - build
     - sign
-    - clean-same-release
-    - clean-dev-release
+    - clean
     - upload
     - release
 
 
-build:test:
-    stage: build
+test:build:
+    stage: test
     tags:
         - build
     image: node:latest
@@ -122,7 +129,7 @@ build:test:
         - !reference [.get_version, script]
         - !reference [.build_cli, script]
     rules:
-        - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_COMMIT_BRANCH !~ /^v[0-9]+(\.[0-9]+)*$/'
+        - if: '$CI_COMMIT_TAG =~ "/^$/" && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_COMMIT_BRANCH !~ /^v[0-9]+(\.[0-9]+)*$/'
 
 build:version:
     stage: build
@@ -165,7 +172,7 @@ sign:macos:
         - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/'
 
 clean:release:
-    stage: clean-same-release
+    stage: clean
     tags:
         - gitlab_clean
     image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
@@ -176,7 +183,7 @@ clean:release:
         - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/'
 
 clean:packages:
-    stage: clean-same-release
+    stage: clean
     tags:
         - gitlab_clean
     image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
@@ -186,8 +193,8 @@ clean:packages:
     rules:
         - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/'
 
-clean-dev:release:
-    stage: clean-dev-release
+clean:dev:release:
+    stage: clean
     tags:
         - gitlab_clean
     image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
@@ -198,8 +205,8 @@ clean-dev:release:
     rules:
         - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
 
-clean-dev:packages:
-    stage: clean-dev-release
+clean:dev:packages:
+    stage: clean
     tags:
         - gitlab_clean
     image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
@@ -234,7 +241,7 @@ upload:packages:
     rules:
         - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/'
 
-release_job:
+release:gitlab:
     stage: release
     tags:
         - release
@@ -243,9 +250,11 @@ release_job:
         - !reference [.get_version, script]
         - !reference [.get_packages_url, script]
         - echo 'Running release_job'
+        # Extract description from CHANGELOG.md
         - CHANGELOG_LINE_START=`awk '/##\ [0-9]+\.[0-9]+\.[0-9]+/{print NR; exit;}' CHANGELOG.md`
         - CHANGELOG_LINE_END=`awk '/##\ [0-9]+\.[0-9]+\.[0-9]+/{ count++; if(count>1) {print NR; exit;}}' CHANGELOG.md`
         - DESCRIPTION=`awk 'NR > '$CHANGELOG_LINE_START' && NR < '$CHANGELOG_LINE_END'' CHANGELOG.md`
+        # Create Release (can't be done by release_step of gitlab image because it don't have access to env var defined in script_step)
         - >
             RELEASE_DATA=$(jq --null-input --arg version "$VERSION" --arg description "# Changelog (version $VERSION) $DESCRIPTION" --arg tag_name "$VERSION" --arg ref "$CI_COMMIT_SHORT_SHA" '{
                 "name": $version,
@@ -286,6 +295,6 @@ release_job:
             curl --data "${RELEASE_DATA}" \
               --header "Content-Type: application/json" \
               --header "JOB-TOKEN: $CI_JOB_TOKEN" \
-              --request POST "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/releases"
+              --request POST "${GITLAB_API_PROJECT_URL}/releases"
     rules:
         - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /^v[0-9]+(\.[0-9]+)*$/'
\ No newline at end of file