diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d1122bacaff527531930cb45b39caabf80fed89c..9c30766bf84ffe73759e7cda8efab85c72ae3ac4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,11 +4,10 @@ variables:
   POSTGRES_PASSWORD: ""
 
 stages:
-  - logs
-  - new_branch
-  - new_tag
+  - sync
   - test
-  - synchronization
+  - deploy
+  - after_deploy
 
 before_script:
   - apt-get update -yqq > /dev/null
@@ -36,12 +35,8 @@ job_php-8.1:
     - curl --location -s --output /usr/local/bin/phpunit https://phar.phpunit.de/phpunit-9.phar
     - chmod +x /usr/local/bin/phpunit
     - phpunit --coverage-text --colors=never
-  # only:
-  #   - develop
-  # except:
-  #   - schedules
   rules:
-  - if: '$CI_COMMIT_BRANCH =~ /(feat|fix)\/[0-9]{4,5}\/develop/'
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
 
   artifacts:
     paths:
@@ -60,12 +55,8 @@ job_php-8.0:
     - curl --location -s --output /usr/local/bin/phpunit https://phar.phpunit.de/phpunit-9.phar
     - chmod +x /usr/local/bin/phpunit
     - phpunit --coverage-text --colors=never
-  # only:
-  #   - develop
-  # except:
-  #   - schedules
   rules:
-    - if: '$CI_COMMIT_BRANCH =~ /(feat|fix)\/[0-9]{4,5}\/develop/'
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
   artifacts:
     paths:
       - test/unitTests/build/
@@ -83,172 +74,82 @@ job_php-7.4:
     - curl --location -s --output /usr/local/bin/phpunit https://phar.phpunit.de/phpunit-9.phar
     - chmod +x /usr/local/bin/phpunit
     - phpunit --coverage-text --colors=never -c phpunit.xml
-  # only:
-  #   - develop
-  # except:
-  #   - schedules
   rules:
-    - if: '$CI_COMMIT_BRANCH =~ /(feat|fix)\/[0-9]{4,5}\/develop/'
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
   artifacts:
     paths:
       - test/unitTests/build/
     expire_in: 2h
   # coverage: '^\s*Lines:\s*\d+.\d+\%'
 
-commits:
+create_merge_request:
   image: debian:10-slim
-  stage: synchronization
-  only:
-    - develop
-    - "21.03"
-  except:
-    - tags
-    - schedules
+  stage: sync
+  rules:
+    - if: '$CI_COMMIT_BRANCH =~ /(feat|fix)\/[0-9]*/ && $CI_OPEN_MERGE_REQUESTS == null && $CI_COMMIT_BEFORE_SHA == "0000000000000000000000000000000000000000"'
   before_script:
-    # Skip the synchronisation if it is not enabled
-    - if [ $SYNC_ENABLED = "true" ]; then echo "Sync enabled"; else echo "Sync disabled, stopping the job" && exit 0; fi
-    # Configure ssh, with the private key to push to the private repository
-    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
-    - eval $(ssh-agent -s)
-    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
-    - mkdir -p ~/.ssh
-    - chmod 700 ~/.ssh
-    - ssh-keyscan "$GITLAB_URL" >> ~/.ssh/known_hosts
-    - chmod 644 ~/.ssh/known_hosts
-    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" >> ~/.ssh/config'
-    # Install git command
-    - apt install -y git
+    - apt-get update -yqq > /dev/null
+    - apt install -y curl
+    - apt install -y jq
   script:
-    - chmod +x ./ci/commit_synchronization.sh
-    - ./ci/commit_synchronization.sh
+    - chmod +x ./ci/create_mr.sh
+    - ./ci/create_mr.sh
 
-tags:
+end_merge_request:
   image: debian:10-slim
-  stage: synchronization
-  only:
-    - tags
-  except:
-    - schedules
+  stage: sync
+  rules:
+    - if: '$CI_COMMIT_MESSAGE =~ /^Merge branch/ && $CI_PIPELINE_SOURCE != "schedule" && ($CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "2301_releases")'
   before_script:
-    # Skip the synchronisation if it is not enabled
-    - if [ $SYNC_ENABLED = "true" ]; then echo "Sync enabled"; else echo "Sync disabled, stopping the job" && exit 0; fi
-    # Configure ssh, with the private key to push to the private repository
-    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
-    - eval $(ssh-agent -s)
-    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
-    - mkdir -p ~/.ssh
-    - chmod 700 ~/.ssh
-    - ssh-keyscan "$GITLAB_URL" >> ~/.ssh/known_hosts
-    - chmod 644 ~/.ssh/known_hosts
-    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" >> ~/.ssh/config'
-    # Install git and curl command
-    - apt install -y git
+    - apt-get update -yqq > /dev/null
     - apt install -y curl
-    # Install npm
-    - curl -sL https://deb.nodesource.com/setup_14.x | bash -
-    - apt install -y nodejs
+    - apt install -y jq
   script:
-    - git config --global user.email "$CI_EMAIL" && git config --global user.name "$CI_USER"
-    # We will work in another directory, to avoid git conflicts
-    - mkdir tmp
-    - cd tmp
-    # Find the branch name from tag name
-    - VERSION1=$(echo $CI_COMMIT_TAG| cut -d'.' -f 1)
-    - VERSION2=$(echo $CI_COMMIT_TAG| cut -d'.' -f 2)
-    - VERSION="${VERSION1}.${VERSION2}"
-    # Pull the private repository
-    - git init && git remote add origin $PRIVATE_REPOSITORY_URL_SSH
-    - git pull origin $VERSION
-    # Update and push build prod
-    - npm install
-    - npm run build-prod
-    - git status
-    - git add -f dist/
-    - git status
-    - git commit -m "Build prod for tag ${CI_COMMIT_TAG}"
-    - git show-ref
-    - git push origin HEAD:$VERSION
-    - git status
-    # Do the tag on the private repo
-    - git tag $CI_COMMIT_TAG
-    - git status
-    - git push origin --tags
-
+    - chmod +x ./ci/end_mr.sh
+    - ./ci/end_mr.sh
 
-logs:
+check_branch_releases:
   image: debian:10-slim
-  stage: logs
-  except:
-    - schedules
-    - tags
-    - master
+  stage: after_deploy
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "schedule" && $TAG_MODE == "minor"'
   before_script:
-    # Skip the logging if in pro (=> sync disabled)
-    - if [ $SYNC_ENABLED = "true" ]; then echo "Sync enabled"; else echo "Sync disabled, stopping the job" && exit 0; fi
-    - apt-get update -y
+    - apt-get update -yqq > /dev/null
     - apt install -y curl
+    - apt install -y jq
+    - apt install -y git
   script:
-    - |
-      if [[ $CI_COMMIT_MESSAGE == "FEAT"* ]]; then \
-        ISSUE_ID=`echo $CI_COMMIT_MESSAGE | grep -o 'FEAT \#[0-9]*' | grep -o '[0-9]*'`; \
-        echo "found FEAT !"; \
-      else \
-        if [[ $CI_COMMIT_MESSAGE == "FIX"* ]]; then \
-          ISSUE_ID=`echo $CI_COMMIT_MESSAGE | grep -o 'FIX \#[0-9]*' | grep -o '[0-9]*'`; \
-          echo "found FIX !"; \
-        else \
-          echo "no FEAT or FIX found :("; \
-          exit 0; \
-        fi; \
-      fi
-    - echo $ISSUE_ID
-    - NOTE_MESSAGE="Commit ajouté sur la branche **$CI_COMMIT_REF_NAME** de **$CI_PROJECT_NAME**"
-    - COMMIT_URL="$CI_PROJECT_URL/commit/$CI_COMMIT_SHA"
-    - echo $NOTE_MESSAGE
-    - echo "$CI_COMMIT_MESSAGE"
-    - CI_COMMIT_MESSAGE=$(echo $CI_COMMIT_MESSAGE) # Remove the line returns
-    - echo "$CI_COMMIT_MESSAGE"
-    - echo $COMMIT_URL
-    - NOTE="$NOTE_MESSAGE \n $CI_COMMIT_MESSAGE \n $COMMIT_URL"
-    - echo "$NOTE"
-    - BODY="{\"issue\":{\"notes\":\"$NOTE\",\"private_notes\":false}}"
-    - echo "$BODY"
-    - curl -v -H 'Content-Type:application/json' -H "X-Redmine-API-Key:$REDMINE_API_KEY" -d "$BODY" -X PUT https://forge.maarch.org/issues/$ISSUE_ID.json
+    - chmod +x ./ci/check_releases.sh
+    - ./ci/check_releases.sh
 
-new_branch:
-  image: debian:10-slim
-  stage: new_branch
-  only:
-    - branches
+create_minor_tag:
+  image: php:8.1.14-cli
+  stage: deploy
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "schedule" && $TAG_MODE == "minor"'
   before_script:
-    # Install git and curl command
     - apt-get update -yqq > /dev/null
+    - apt install -y git
     - apt install -y curl
     - apt install -y jq
+    - chmod +x ./ci/generate_app_dependencies.sh
+    - ./ci/generate_app_dependencies.sh
   script:
-    - chmod +x ./ci/create_mr.sh
-    - ./ci/create_mr.sh
+    - chmod +x ./ci/new_minor_tag.sh
+    - ./ci/new_minor_tag.sh
 
-new_tag:
-  image: debian:10-slim
-  stage: new_tag
-  only:
-    - tags
+create_major_tag:
+  image: php:8.1.14-cli
+  stage: deploy
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "schedule" && $TAG_MODE == "major"'
   before_script:
-    # Install git and curl command
     - apt-get update -yqq > /dev/null
-    - 'which ssh-agent || ( apt-get install openssh-client -y )'
-    - eval $(ssh-agent -s)
-    - echo "$SSH_PRIVATE_KEY_2" | tr -d '\r' | ssh-add -
-    - mkdir -p ~/.ssh
-    - chmod 700 ~/.ssh
-    - ssh-keyscan "$GITLAB_URL" >> ~/.ssh/known_hosts
-    - chmod 644 ~/.ssh/known_hosts
-    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" >> ~/.ssh/config'
     - apt install -y git
     - apt install -y curl
     - apt install -y jq
+    - chmod +x ./ci/generate_app_dependencies.sh
+    - ./ci/generate_app_dependencies.sh
   script:
-    - chmod +x ./ci/new_tag.sh
-    - ./ci/new_tag.sh
-
+    - chmod +x ./ci/new_major_tag.sh
+    - ./ci/new_major_tag.sh
diff --git a/ci/check_releases.sh b/ci/check_releases.sh
new file mode 100644
index 0000000000000000000000000000000000000000..de25ed15f4b5c29f232865a490c57f6c1bfd2b4c
--- /dev/null
+++ b/ci/check_releases.sh
@@ -0,0 +1,102 @@
+#!/bin/bash
+TAG_BASE="2301"
+EXIST=0
+for row in $(curl --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/branches?search=2301_releases" | jq -r '.[] | @base64'); do
+  _jq() {
+    echo ${row} | base64 --decode | jq -r ${1}
+  }
+  EXIST=$((EXIST + 1))
+done
+
+if [ $EXIST == 1 ]
+then
+  echo "2301_releases already exist, skipping ..."
+else
+  echo "2301_releases branch does not exist, creating ..."
+  
+  # Create 2301_releases branche
+  echo "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/branches?branch=2301_releases&ref=main"
+
+  curl --request POST --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/branches?branch=2301_releases&ref=main"
+
+  # Create 2301_releases mr
+  BODY="{\"id\":\"$CI_PROJECT_ID\",\"source_branch\":\"2301_releases\",\"target_branch\":\"main\",\"title\":\"Next tag release\",\"description\":\"\",\"remove_source_branch\":\"true\",\"squash\":\"false\"}"
+
+  curl -v -H "PRIVATE-TOKEN: $TOKEN_GITLAB" -H "Content-Type: application/json" -X POST -d "$BODY" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/merge_requests"
+
+  FIRST_TAG=0
+
+  for row in $(curl --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/tags?search=^$TAG_BASE" | jq -r '.[] | @base64'); do
+      _jq() {
+          echo ${row} | base64 --decode | jq -r ${1}
+      }
+
+      NAME=$(_jq '.name')
+
+      IS_TMA=$(echo $NAME | grep -o '[.]*_TMA[.]*')
+
+      if [[ -n $IS_TMA ]]; then
+          echo "TMA tag branch : $NAME ! Skipping..."
+      else
+          TAGS+=("$NAME")
+      fi
+  done
+  if [ ${#TAGS[@]} -eq 0 ]; then
+    FIRST_TAG=1
+    LATEST_TAG="$TAG_BASE.0.0"
+    BRANCH_TAG_VERSION=$TAG_BASE
+    MAJOR_TAG_VERSION='0'
+    MINOR_TAG_VERSION='0'
+    NEXT_TAG="$TAG_BASE.0.0"
+    NEXT_NEXT_TAG="$TAG_BASE.0.1"
+  else
+      SORTED_TAGS=($(echo ${TAGS[*]} | tr " " "\n" | sort -Vr))
+      LATEST_TAG=$(echo ${SORTED_TAGS[0]})
+
+      structures=$(echo $LATEST_TAG | tr "." "\n")
+
+      IT=1
+      for item in $structures; do
+          if [ $IT = 1 ]; then
+              BRANCH_TAG_VERSION=$item
+          fi
+
+          if [ $IT = 2 ]; then
+              MAJOR_TAG_VERSION="$item"
+          fi
+
+          if [ $IT = 3 ]; then
+              MINOR_TAG_VERSION=$item
+          fi
+
+          IT=$((IT + 1))
+      done
+  fi
+  if [ $FIRST_TAG == 0 ]; then
+      VERSION=$((MINOR_TAG_VERSION + 1))
+      VERSION_NEXT=$((MINOR_TAG_VERSION + 2))
+      NEXT_TAG="$BRANCH_TAG_VERSION.$MAJOR_TAG_VERSION.$VERSION"
+      NEXT_NEXT_TAG="$BRANCH_TAG_VERSION.$MAJOR_TAG_VERSION.$VERSION"
+  fi
+  # Update files version
+  git config --global user.email "$GITLAB_USER_EMAIL" && git config --global user.name "$GITLAB_USER_NAME" && git config core.fileMode false
+
+  git remote set-url origin "https://gitlab-ci-token:${TOKEN_GITLAB}@${GITLAB_URL}/${CI_PROJECT_PATH}.git"
+
+  git fetch
+  git branch -D $TAG_BASE"_releases"
+  git pull origin $TAG_BASE"_releases"
+  git checkout $TAG_BASE"_releases"
+  cp package.json tmp_package.json
+
+  jq -r ".version |= \"$NEXT_NEXT_TAG\"" tmp_package.json >package.json
+
+  rm tmp_package.json
+
+  git add -f package.json
+
+  git commit -m "Update next tag version files : $NEXT_NEXT_TAG"
+
+  git push
+fi
+
diff --git a/ci/commit_synchronization.sh b/ci/commit_synchronization.sh
deleted file mode 100644
index 394dd31d72d63af6fd5afc7db74c6634b48209b4..0000000000000000000000000000000000000000
--- a/ci/commit_synchronization.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-
-# Synchronize commits to the private repository by merging commits in the public repository to the private one
-
-echo "Synchronizing changes in branch $CI_COMMIT_REF_NAME"
-
-git status
-
-git remote set-url origin $PRIVATE_REPOSITORY_URL_SSH
-git config --global user.email "$CI_EMAIL" && git config --global user.name "$CI_USER"
-
-exists=$(git show-ref refs/heads/$CI_COMMIT_REF_NAME)
-if [ -n "$exists" ]; then
-  git branch -D $CI_COMMIT_REF_NAME
-  echo "Created branch $CI_COMMIT_REF_NAME"
-fi
-
-if [ -d ".git/rebase-apply" ]; then
-  rm -fr .git/rebase-apply
-  echo "Removed rebase lock file .git/rebase-apply"
-fi
-
-echo "Attempt 1 with rebase"
-
-if ! git pull --rebase origin $CI_COMMIT_REF_NAME; then
-  echo "Rebase FAILED !"
-  echo "Attempt 2 by keeping changes from normal repository"
-  echo "/!\ This will override the changes in the private repository !"
-
-  # /!\ theirs will keep the changes in the Pro repository ! ours will keep the changes in the normal one
-  if ! git pull -s recursive -X ours --no-edit origin $CI_COMMIT_REF_NAME; then
-      echo "Pull FAILED !"
-      echo "Attempt 3 by overriding the changes to the private repository"
-      echo "/!\ This will create a merge commit"
-      echo "/!\ Only overriding dist/, if another directory/file needs to be overridden, it should be added in this script"
-
-      git fetch origin
-      git merge --no-commit --no-ff origin/$CI_COMMIT_REF_NAME
-      git reset -- dist/
-      git status
-      git commit -m "Reset dist folder + merge commits"
-  fi
-fi
-
-# Use this pull command if there are merge conflicts during rebase
-# git pull -s recursive -X ours --no-edit origin $CI_COMMIT_REF_NAME
-git checkout -b $CI_COMMIT_REF_NAME
-echo "Pushing changes to private repository..."
-
-if ! git push --set-upstream origin $CI_COMMIT_REF_NAME;  then
-    echo "FAILED to push changes"
-    exit 1
-fi
-
-echo "Changes pushed"
diff --git a/ci/create_mr.sh b/ci/create_mr.sh
index f47deeb849da53b9f268ee2dd3e518b5ccbd8707..59c61997f0eed488cc7bf6f08e49fc883d2120f5 100644
--- a/ci/create_mr.sh
+++ b/ci/create_mr.sh
@@ -27,14 +27,24 @@ do
 done
 
 
-if [[ -z $TRACKER ]] || [[ -z $US ]] || [[ -z $BRANCH ]]
+if [[ -z $TRACKER ]] || [[ -z $US ]]
 then
-    echo "Bad structure to find US ! => [TRACKER]/[US_ID]/[TARGET_BRANCH]"
+    echo "Bad structure to find US ! => [TRACKER]/[US_ID]"
 else
 
     echo $TRACKER
     echo $US
-    echo $BRANCH
+
+    if [[ $TRACKER == "feat" ]]; then
+        TARGET_BRANCH="main";
+      else
+        if [[ $TRACKER == "fix" ]]; then
+            TARGET_BRANCH="2301_releases";
+        else
+          echo "no feat or fix found :(";
+          exit 0;
+        fi;
+    fi
 
     echo "GET https://forge.maarch.org/issues/$US.json"
 
@@ -42,11 +52,17 @@ else
 
     SUBJECT=`cat issue_$US.json | jq -r '.issue.subject'`
 
-    BODY="{\"id\":\"$CI_PROJECT_ID\",\"source_branch\":\"$CI_COMMIT_REF_NAME\",\"target_branch\":\"$BRANCH\",\"title\":\"Draft: [$US] $SUBJECT\",\"description\":\"$SUBJECT\n=> https://forge.maarch.org/issues/$US\",\"remove_source_branch\":\"true\"}"
+    BODY="{\"id\":\"$CI_PROJECT_ID\",\"source_branch\":\"$CI_COMMIT_REF_NAME\",\"target_branch\":\"$TARGET_BRANCH\",\"title\":\"Draft: [$US] $SUBJECT\",\"description\":\"$SUBJECT\n=> https://forge.maarch.org/issues/$US\",\"remove_source_branch\":\"true\",\"squash\":\"false\"}"
 
     echo $BODY
 
     echo "POST https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/merge_requests"
 
-    curl -v -H "PRIVATE-TOKEN: $TOKEN_GITLAB" -H "Content-Type: application/json" -X POST -d "$BODY" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/merge_requests"
-fi
+    curl -H "PRIVATE-TOKEN: $TOKEN_GITLAB" -H "Content-Type: application/json" -X POST -d "$BODY" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/merge_requests"
+
+    # Create comment on forge
+    COMMIT_URL="$CI_PROJECT_URL/commit/$CI_COMMIT_SHA"
+    NOTE="[**CREATION**] MR sur **$TARGET_BRANCH** (**$CI_COMMIT_REF_NAME**) par $CI_COMMIT_AUTHOR\n\n$COMMIT_URL"
+    BODY="{\"issue\":{\"notes\":\"$NOTE\",\"private_notes\":false}}"
+    curl -H 'Content-Type:application/json' -H "X-Redmine-API-Key:$REDMINE_API_KEY" -d "$BODY" -X PUT https://forge.maarch.org/issues/$US.json
+fi
\ No newline at end of file
diff --git a/ci/end_mr.sh b/ci/end_mr.sh
new file mode 100644
index 0000000000000000000000000000000000000000..cf7299844f400a1719daa48d61411cdcb53e0712
--- /dev/null
+++ b/ci/end_mr.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+BRANCH=`echo $CI_COMMIT_MESSAGE | grep -oP "'(.*?)'" | head -1 | tr -d "'"`
+
+ISSUE_ID=`echo $BRANCH | grep -oP "[0-9]*" | head -1`
+
+IT=0
+
+if [[ ! -z $ISSUE_ID ]]
+then
+
+    for row in $(curl --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/merge_requests?state=merged&in=source_branch&search=$ISSUE_ID" | jq -r '.[] | @base64'); do
+        _jq() {
+        echo ${row} | base64 --decode | jq -r ${1}
+        }
+
+        if [ $IT = 0 ]; then
+            URL=$(_jq '.web_url')
+            AUTHOR=$(_jq '.merge_user.name')
+            SOURCE_BRANCH=$(_jq '.source_branch')
+            TARGET_BRANCH=$(_jq '.target_branch')
+
+            NOTE="[**CLOTURE**] MR sur **$TARGET_BRANCH** (**$SOURCE_BRANCH**) par $AUTHOR\n\n$URL"
+        fi
+
+        IT=$((IT+1))
+    done
+
+    BODY="{\"issue\":{\"notes\":\"$NOTE\",\"private_notes\":false}}"
+    
+    echo $BODY
+    
+    curl -H 'Content-Type:application/json' -H "X-Redmine-API-Key:$REDMINE_API_KEY" -d "$BODY" -X PUT https://forge.maarch.org/issues/$ISSUE_ID.json
+else
+    echo "NO US FOUND !"
+fi
diff --git a/ci/generate_app_dependencies.sh b/ci/generate_app_dependencies.sh
new file mode 100644
index 0000000000000000000000000000000000000000..8d4da56342fd11534639f17dc94908a845c6b439
--- /dev/null
+++ b/ci/generate_app_dependencies.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# We need to install dependencies only for Docker
+[[ ! -e /.dockerenv ]] && exit 0
+
+set -xe
+
+apt-get install -y libpq-dev libxml2-dev libxslt1-dev libpng-dev unoconv xpdf-utils imagemagick ghostscript wkhtmltopdf libzip-dev zip \
+&& docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \
+&& docker-php-ext-configure pdo_pgsql --with-pdo-pgsql \
+&& docker-php-ext-install pdo_pgsql pgsql \
+&& docker-php-ext-install xsl soap zip \
+&& docker-php-ext-install gd
+
+php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
+php composer-setup.php
+php -r "unlink('composer-setup.php');"
+mv composer.phar /usr/local/bin/composer
+
+curl -sL https://deb.nodesource.com/setup_18.x | bash - > /dev/null
+apt-get install -y nodejs
+npm install -g n
+n 18
+node -v
+npm -v
\ No newline at end of file
diff --git a/ci/new_major_tag.sh b/ci/new_major_tag.sh
new file mode 100644
index 0000000000000000000000000000000000000000..e9155037d502c2e5e5ade4b4969d4ca50662e3f5
--- /dev/null
+++ b/ci/new_major_tag.sh
@@ -0,0 +1,266 @@
+#!/bin/bash
+
+FIRST_TAG=0
+
+TAGS=()
+
+RESPONSE=$(curl --write-out '%{url_effective} [%{response_code}]' --silent --output /dev/null --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/tags?search=^$TAG_BASE")
+RESPONSE_CODE=$(echo $RESPONSE | grep -o '\[[0-9]*\]$')
+
+if [ $RESPONSE_CODE != '[200]' ]; then
+    echo "Error ! $RESPONSE"
+    exit 1
+fi
+
+for row in $(curl --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/tags?search=^$TAG_BASE" | jq -r '.[] | @base64'); do
+    _jq() {
+        echo ${row} | base64 --decode | jq -r ${1}
+    }
+
+    NAME=$(_jq '.name')
+
+    IS_TMA=$(echo $NAME | grep -o '[.]*_TMA[.]*')
+
+    if [[ -n $IS_TMA ]]; then
+        echo "TMA tag branch : $NAME ! Skipping..."
+    else
+        TAGS+=("$NAME")
+    fi
+done
+
+if [ ${#TAGS[@]} -eq 0 ]; then
+    echo "No Tags available, create de first tag !"
+    FIRST_TAG=1
+    LATEST_TAG="$TAG_BASE.0.0"
+    BRANCH_TAG_VERSION=$TAG_BASE
+    MAJOR_TAG_VERSION='0'
+    MINOR_TAG_VERSION='0'
+    NEXT_TAG="$TAG_BASE.0.0"
+    NEXT_NEXT_TAG_MILESTONE="$BRANCH_TAG_VERSION.1.x"
+
+else
+    SORTED_TAGS=($(echo ${TAGS[*]} | tr " " "\n" | sort -Vr))
+    LATEST_TAG=$(echo ${SORTED_TAGS[0]})
+
+    echo "Latest tag : $LATEST_TAG"
+
+    structures=$(echo $LATEST_TAG | tr "." "\n")
+
+    IT=1
+    for item in $structures; do
+        if [ $IT = 1 ]; then
+            BRANCH_TAG_VERSION=$item
+        fi
+
+        if [ $IT = 2 ]; then
+            MAJOR_TAG_VERSION="$item"
+        fi
+
+        if [ $IT = 3 ]; then
+            MINOR_TAG_VERSION=$item
+        fi
+
+        IT=$((IT + 1))
+    done
+fi
+
+echo "BRANCH : $BRANCH_TAG_VERSION"
+echo "MAJOR TAG : $MAJOR_TAG_VERSION"
+echo "MINOR TAG : $MINOR_TAG_VERSION"
+
+if [[ -z $BRANCH_TAG_VERSION ]] || [[ -z $MAJOR_TAG_VERSION ]] || [[ -z $MINOR_TAG_VERSION ]]; then
+    echo "Bad tag structure ! $LATEST_TAG"
+    exit 1
+fi
+
+if [ $FIRST_TAG == 0 ]; then
+    VERSION=$((MAJOR_TAG_VERSION + 1))
+    VERSION_NEXT=$((MAJOR_TAG_VERSION + 2))
+    NEXT_TAG="$BRANCH_TAG_VERSION.$VERSION.0"
+    NEXT_TAG_MILESTONE="$BRANCH_TAG_VERSION.$VERSION.x"
+    NEXT_NEXT_TAG="$BRANCH_TAG_VERSION.$VERSION_NEXT.0"
+    NEXT_NEXT_TAG_MILESTONE="$BRANCH_TAG_VERSION.$VERSION_NEXT.x"
+    NEXT_MINOR_TAG="$BRANCH_TAG_VERSION.$VERSION.1"
+
+    echo "NEXT TAG : $NEXT_TAG"
+fi
+
+if [ $FIRST_TAG == 1 ]; then
+    BODY="{\"id\":\"$CI_PROJECT_ID\",\"title\":\"$BRANCH_TAG_VERSION.0.1\"}"
+
+    # CREATE FIRST MINOR MILESTONE
+    curl -H 'Content-Type:application/json' -H "PRIVATE-TOKEN:$TOKEN_GITLAB" -d "$BODY" -X POST https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/milestones
+
+    chmod +x ./ci/check_releases.sh
+    ./ci/check_releases.sh
+fi
+
+curl --request POST --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/branches?branch=tmp_$RELEASE_BRANCH&ref=$RELEASE_BRANCH"
+
+git config --global user.email "$GITLAB_USER_EMAIL" && git config --global user.name "$GITLAB_USER_NAME" && git config core.fileMode false
+git remote set-url origin "https://gitlab-ci-token:${TOKEN_GITLAB}@${GITLAB_URL}/${CI_PROJECT_PATH}.git"
+git fetch
+git branch -D tmp_$RELEASE_BRANCH
+git pull origin tmp_$RELEASE_BRANCH
+git checkout tmp_$RELEASE_BRANCH
+
+composer install
+npm run reload-packages
+npm run build-prod
+npm run reload-packages-prod
+
+git add -f dist/
+git add -f node_modules/
+git add -f vendor/
+
+git commit -m "Add packages dependencies"
+
+git push
+
+## CREATE TAG
+curl -w " => %{url_effective} [%{response_code}]" -H 'Content-Type:application/json' -H "PRIVATE-TOKEN:$TOKEN_GITLAB" -X POST "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/tags?tag_name=$NEXT_TAG&ref=tmp_$RELEASE_BRANCH"
+
+curl --request DELETE --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/branches/tmp_$RELEASE_BRANCH"
+
+## CREATE TAG MP PRO SIDE
+curl --request POST --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/215/pipeline_schedules/18/play"
+
+if [ $FIRST_TAG == 0 ]; then
+    ## CLOSE MILESTONE
+    for row in $(curl --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/milestones?search=$NEXT_TAG_MILESTONE" | jq -r '.[] | @base64'); do
+        _jq() {
+            echo ${row} | base64 --decode | jq -r ${1}
+        }
+
+        ID=$(_jq '.id')
+
+        echo $ID
+
+        BODY="{\"id\":\"$ID\",\"state_event\":\"close\"}"
+
+        curl -H 'Content-Type:application/json' -H "PRIVATE-TOKEN:$TOKEN_GITLAB" -d "$BODY" -X PUT https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/milestones/$ID
+
+    done
+fi
+
+BODY="{\"id\":\"$CI_PROJECT_ID\",\"title\":\"$NEXT_NEXT_TAG_MILESTONE\"}"
+
+# CREATE NEXT TAG MILESTONE
+curl -H 'Content-Type:application/json' -H "PRIVATE-TOKEN:$TOKEN_GITLAB" -d "$BODY" -X POST https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/milestones
+
+if [ $FIRST_TAG == 0 ]; then
+    # GENERATE RAW CHANGELOG
+    COMMIT_LOG_FILE="tmp.txt"
+    ISSUES_IDS_FILE="tmp2.txt"
+    SORTED_UNIQUE_ISSUES_IDS="tmp3.txt"
+    FINAL_LOG="tmp4.txt"
+    CONTENT=""
+
+    echo "Set user git : $GITLAB_USER_NAME <$GITLAB_USER_EMAIL>"
+
+    git config --global user.email "$GITLAB_USER_EMAIL" && git config --global user.name "$GITLAB_USER_NAME" && git config core.fileMode false
+
+    git remote set-url origin "https://gitlab-ci-token:${TOKEN_GITLAB}@${GITLAB_URL}/${CI_PROJECT_PATH}.git"
+
+    git fetch
+    git branch -D $RELEASE_BRANCH
+    git pull origin $RELEASE_BRANCH
+    git checkout $RELEASE_BRANCH
+
+    TAGS_COMP="$BRANCH_TAG_VERSION.$MAJOR_TAG_VERSION.0..$NEXT_TAG"
+
+    REF_UPDATED=$(git log $TAGS_COMP --pretty=format:'%s' --grep='Update referential' --all-match)
+
+    git log $TAGS_COMP --pretty=format:'%s' --grep='feat' --grep='Merge' --all-match >$COMMIT_LOG_FILE
+    echo '' >>$COMMIT_LOG_FILE
+
+    while IFS= read -r line; do
+        ISSUE_ID=$(echo $line | grep -o 'feat/[0-9]*' | grep -o '[0-9]*')
+        echo "$ISSUE_ID" >>$ISSUES_IDS_FILE
+    done <"$COMMIT_LOG_FILE"
+
+    git log $TAGS_COMP --pretty=format:'%s' --grep='fix' --grep='Merge' --all-match >$COMMIT_LOG_FILE
+    echo '' >>$COMMIT_LOG_FILE
+
+    while IFS= read -r line; do
+        ISSUE_ID=$(echo $line | grep -o 'fix/[0-9]*' | grep -o '[0-9]*')
+        echo "$ISSUE_ID" >>$ISSUES_IDS_FILE
+    done <"$COMMIT_LOG_FILE"
+
+    sort -u $ISSUES_IDS_FILE >$SORTED_UNIQUE_ISSUES_IDS
+
+    while IFS= read -r line; do
+        echo "=================="
+        echo $line
+        curl -H "X-Redmine-API-Key: ${REDMINE_API_KEY}" -H 'Content-Type: application/json' -X GET https://forge.maarch.org/issues/$line.json >issue_$line.json
+        # echo `cat issue_$line.json`
+        SUBJECT=$(cat issue_$line.json | jq -r '.issue.subject')
+        TRACKER=$(cat issue_$line.json | jq -r '.issue.tracker.name')
+        ID=$(cat issue_$line.json | jq -r '.issue.id')
+        echo ""
+        echo "ID : $ID"
+        echo "TRACKER : $TRACKER"
+        echo "SUBJECT : $SUBJECT"
+        echo "=================="
+
+        if [ ! -z $ID ]; then
+            echo "* **$TRACKER [#$ID](https://forge.maarch.org/issues/$ID)** - $SUBJECT" >>$FINAL_LOG
+        fi
+    done <"$SORTED_UNIQUE_ISSUES_IDS"
+
+    if [[ ! -z $REF_UPDATED ]]; then
+        echo "* **Fonctionnalité** - Mise à jour de la BAN 75" >>$FINAL_LOG
+    fi
+
+    sort -u $FINAL_LOG >>changelog.txt
+
+    while IFS= read -r line; do
+        CONTENT="$CONTENT\n$line"
+    done <"changelog.txt"
+
+    echo $CONTENT
+
+    # Update tag release
+    BODY="{\"description\":\"$CONTENT\",\"tag_name\":\"$NEXT_TAG\", \"milestones\": [\"$NEXT_TAG_MILESTONE\"]}"
+
+    curl -H 'Content-Type:application/json' -H "PRIVATE-TOKEN:$TOKEN_GITLAB" -d "$BODY" -X POST https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/releases
+
+    mkdir -p ci/build/
+    mv $COMMIT_LOG_FILE ci/build/
+    mv $ISSUES_IDS_FILE ci/build/
+    mv $SORTED_UNIQUE_ISSUES_IDS ci/build/
+    mv $FINAL_LOG ci/build/
+
+    # Update files version from branche releases
+    git branch -D $TAG_BASE"_releases"
+    git pull origin $TAG_BASE"_releases"
+    git checkout $TAG_BASE"_releases"
+    cp package.json tmp_package.json
+
+    jq -r ".version |= \"$NEXT_MINOR_TAG\"" tmp_package.json >package.json
+
+    rm tmp_package.json
+
+    git add -f package.json
+
+    git commit -m "Update next tag version files (major tag released) : $NEXT_MINOR_TAG"
+
+    git push
+
+    BODY="{\"id\":\"$CI_PROJECT_ID\",\"title\":\"$NEXT_NEXT_TAG_MILESTONE\"}"
+
+    # EDIT NEXT MINOR TAG MILESTONE
+    for row in $(curl --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/milestones?search=$BRANCH_TAG_VERSION.$MAJOR_TAG_VERSION&state=active" | jq -r '.[] | @base64'); do
+        _jq() {
+            echo ${row} | base64 --decode | jq -r ${1}
+        }
+
+        ID=$(_jq '.id')
+
+        echo $ID
+
+        BODY="{\"id\":\"$ID\",\"title\":\"$NEXT_MINOR_TAG\"}"
+
+        curl -H 'Content-Type:application/json' -H "PRIVATE-TOKEN:$TOKEN_GITLAB" -d "$BODY" -X PUT https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/milestones/$ID
+    done
+fi
diff --git a/ci/new_minor_tag.sh b/ci/new_minor_tag.sh
new file mode 100644
index 0000000000000000000000000000000000000000..0a44a82802303d09883cc32ad8b6bcfe269e2fa1
--- /dev/null
+++ b/ci/new_minor_tag.sh
@@ -0,0 +1,230 @@
+#!/bin/bash
+
+FIRST_TAG=0
+
+TAGS=()
+
+RESPONSE=$(curl --write-out '%{url_effective} [%{response_code}]' --silent --output /dev/null --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/tags?search=^$TAG_BASE")
+RESPONSE_CODE=$(echo $RESPONSE | grep -o '\[[0-9]*\]$')
+
+if [ $RESPONSE_CODE != '[200]' ]; then
+    echo "Error ! $RESPONSE"
+    exit 1
+fi
+
+
+MR_ID=`echo $CI_OPEN_MERGE_REQUESTS | grep -oP "!(.)*" | tr -d "!"`
+content=$(curl --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/merge_requests/$MR_ID")
+STATUS=$(jq -r '.detailed_merge_status' <<<"$content")
+
+echo $STATUS
+
+if [ $STATUS != 'mergeable' ]; then
+    echo "2301_releases cannot be merge ! Tag Abort"
+    exit 1
+fi
+
+for row in $(curl --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/tags?search=^$TAG_BASE" | jq -r '.[] | @base64'); do
+    _jq() {
+        echo ${row} | base64 --decode | jq -r ${1}
+    }
+
+    NAME=$(_jq '.name')
+
+    IS_TMA=$(echo $NAME | grep -o '[.]*_TMA[.]*')
+
+    if [[ -n $IS_TMA ]]; then
+        echo "TMA tag branch : $NAME ! Skipping..."
+    else
+        TAGS+=("$NAME")
+    fi
+done
+
+if [ ${#TAGS[@]} -eq 0 ]; then
+    echo "No Tags available, create de first tag !"
+    FIRST_TAG=1
+    LATEST_TAG="$TAG_BASE.0.0"
+    BRANCH_TAG_VERSION=$TAG_BASE
+    MAJOR_TAG_VERSION='0'
+    MINOR_TAG_VERSION='0'
+    NEXT_TAG="$TAG_BASE.0.0"
+else
+    SORTED_TAGS=($(echo ${TAGS[*]} | tr " " "\n" | sort -Vr))
+    LATEST_TAG=$(echo ${SORTED_TAGS[0]})
+
+    echo "Latest tag : $LATEST_TAG"
+
+    structures=$(echo $LATEST_TAG | tr "." "\n")
+
+    IT=1
+    for item in $structures; do
+        if [ $IT = 1 ]; then
+            BRANCH_TAG_VERSION=$item
+        fi
+
+        if [ $IT = 2 ]; then
+            MAJOR_TAG_VERSION="$item"
+        fi
+
+        if [ $IT = 3 ]; then
+            MINOR_TAG_VERSION=$item
+        fi
+
+        IT=$((IT + 1))
+    done
+fi
+
+echo "BRANCH : $BRANCH_TAG_VERSION"
+echo "MAJOR TAG : $MAJOR_TAG_VERSION"
+echo "MINOR TAG : $MINOR_TAG_VERSION"
+
+if [[ -z $BRANCH_TAG_VERSION ]] || [[ -z $MAJOR_TAG_VERSION ]] || [[ -z $MINOR_TAG_VERSION ]]; then
+    echo "Bad tag structure ! $LATEST_TAG"
+    exit 1
+fi
+
+if [ $FIRST_TAG == 0 ]; then
+    VERSION=$((MINOR_TAG_VERSION + 1))
+    VERSION_NEXT=$((MINOR_TAG_VERSION + 2))
+    NEXT_TAG="$BRANCH_TAG_VERSION.$MAJOR_TAG_VERSION.$VERSION"
+    NEXT_NEXT_TAG="$BRANCH_TAG_VERSION.$MAJOR_TAG_VERSION.$VERSION_NEXT"
+
+    echo "NEXT TAG : $NEXT_TAG"
+fi
+
+curl --request POST --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/branches?branch=tmp_$RELEASE_BRANCH&ref=$RELEASE_BRANCH"
+
+git config --global user.email "$GITLAB_USER_EMAIL" && git config --global user.name "$GITLAB_USER_NAME" && git config core.fileMode false
+git remote set-url origin "https://gitlab-ci-token:${TOKEN_GITLAB}@${GITLAB_URL}/${CI_PROJECT_PATH}.git"
+git fetch
+git branch -D tmp_$RELEASE_BRANCH
+git pull origin tmp_$RELEASE_BRANCH
+git checkout tmp_$RELEASE_BRANCH
+
+composer install
+npm run reload-packages
+npm run build-prod
+npm run reload-packages-prod
+
+git add -f dist/
+git add -f node_modules/
+git add -f vendor/
+
+git commit -m "Add packages dependencies"
+
+git push
+
+## CREATE TAG
+curl -w " => %{url_effective} [%{response_code}]" -H 'Content-Type:application/json' -H "PRIVATE-TOKEN:$TOKEN_GITLAB" -X POST "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/tags?tag_name=$NEXT_TAG&ref=tmp_$RELEASE_BRANCH"
+
+curl --request DELETE --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/branches/tmp_$RELEASE_BRANCH"
+
+## CREATE TAG MP PRO SIDE
+curl --request POST --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/215/pipeline_schedules/18/play"
+
+if [ $FIRST_TAG == 0 ]; then
+    ## CLOSE MILESTONE
+    for row in $(curl --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/milestones?search=$NEXT_TAG" | jq -r '.[] | @base64'); do
+        _jq() {
+            echo ${row} | base64 --decode | jq -r ${1}
+        }
+
+        ID=$(_jq '.id')
+
+        echo $ID
+
+        BODY="{\"id\":\"$ID\",\"state_event\":\"close\"}"
+
+        curl -H 'Content-Type:application/json' -H "PRIVATE-TOKEN:$TOKEN_GITLAB" -d "$BODY" -X PUT https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/milestones/$ID
+
+    done
+fi
+
+BODY="{\"id\":\"$CI_PROJECT_ID\",\"title\":\"$NEXT_NEXT_TAG\"}"
+
+# CREATE NEXT TAG MILESTONE
+curl -H 'Content-Type:application/json' -H "PRIVATE-TOKEN:$TOKEN_GITLAB" -d "$BODY" -X POST https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/milestones
+
+if [ $FIRST_TAG == 0 ]; then
+    # GENERATE RAW CHANGELOG
+    COMMIT_LOG_FILE="tmp.txt"
+    ISSUES_IDS_FILE="tmp2.txt"
+    SORTED_UNIQUE_ISSUES_IDS="tmp3.txt"
+    FINAL_LOG="tmp4.txt"
+    CONTENT=""
+
+    git branch -D $RELEASE_BRANCH
+    git pull origin $RELEASE_BRANCH
+    git checkout $RELEASE_BRANCH
+
+    TAGS_COMP="$LATEST_TAG..$NEXT_TAG"
+
+    REF_UPDATED=$(git log $TAGS_COMP --pretty=format:'%s' --grep='Update referential' --all-match)
+
+    git log $TAGS_COMP --pretty=format:'%s' --grep='feat' --grep='Merge' --all-match >$COMMIT_LOG_FILE
+    echo '' >>$COMMIT_LOG_FILE
+
+    while IFS= read -r line; do
+        ISSUE_ID=$(echo $line | grep -o 'feat/[0-9]*' | grep -o '[0-9]*')
+        echo "$ISSUE_ID" >>$ISSUES_IDS_FILE
+    done <"$COMMIT_LOG_FILE"
+
+    git log $TAGS_COMP --pretty=format:'%s' --grep='fix' --grep='Merge' --all-match >$COMMIT_LOG_FILE
+    echo '' >>$COMMIT_LOG_FILE
+
+    while IFS= read -r line; do
+        ISSUE_ID=$(echo $line | grep -o 'fix/[0-9]*' | grep -o '[0-9]*')
+        echo "$ISSUE_ID" >>$ISSUES_IDS_FILE
+    done <"$COMMIT_LOG_FILE"
+
+    sort -u $ISSUES_IDS_FILE >$SORTED_UNIQUE_ISSUES_IDS
+
+    while IFS= read -r line; do
+        echo "=================="
+        echo $line
+        curl -H "X-Redmine-API-Key: ${REDMINE_API_KEY}" -H 'Content-Type: application/json' -X GET https://forge.maarch.org/issues/$line.json >issue_$line.json
+        # echo `cat issue_$line.json`
+        SUBJECT=$(cat issue_$line.json | jq -r '.issue.subject')
+        TRACKER=$(cat issue_$line.json | jq -r '.issue.tracker.name')
+        ID=$(cat issue_$line.json | jq -r '.issue.id')
+        echo ""
+        echo "ID : $ID"
+        echo "TRACKER : $TRACKER"
+        echo "SUBJECT : $SUBJECT"
+        echo "=================="
+
+        if [ ! -z $ID ]; then
+            echo "* **$TRACKER [#$ID](https://forge.maarch.org/issues/$ID)** - $SUBJECT" >>$FINAL_LOG
+        fi
+    done <"$SORTED_UNIQUE_ISSUES_IDS"
+
+    if [[ ! -z $REF_UPDATED ]]; then
+        echo "* **Fonctionnalité** - Mise à jour de la BAN 75" >>$FINAL_LOG
+    fi
+
+    sort -u $FINAL_LOG >>changelog.txt
+
+    while IFS= read -r line; do
+        CONTENT="$CONTENT\n$line"
+    done <"changelog.txt"
+
+    echo $CONTENT
+
+    # Update tag release
+    BODY="{\"description\":\"$CONTENT\",\"tag_name\":\"$NEXT_TAG\", \"milestones\": [\"$NEXT_TAG\"]}"
+
+    curl -H 'Content-Type:application/json' -H "PRIVATE-TOKEN:$TOKEN_GITLAB" -d "$BODY" -X POST https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/releases
+
+    mkdir -p ci/build/
+    mv $COMMIT_LOG_FILE ci/build/
+    mv $ISSUES_IDS_FILE ci/build/
+    mv $SORTED_UNIQUE_ISSUES_IDS ci/build/
+    mv $FINAL_LOG ci/build/
+fi
+
+RESPONSE=$(curl --write-out '%{url_effective} [%{response_code}]' --silent --output /dev/null --header "PRIVATE-TOKEN: $TOKEN_GITLAB" -X PUT "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/merge_requests/$MR_ID/merge?squash=false")
+RESPONSE_CODE=$(echo $RESPONSE | grep -o '\[[0-9]*\]$')
+if [ $RESPONSE_CODE != '[200]' ]; then
+    echo "Error ! $RESPONSE"
+    exit 1
+fi
diff --git a/ci/new_tag.sh b/ci/new_tag.sh
deleted file mode 100644
index 11e88bcedfd2cc0fa90870a6a881486ff3f5f125..0000000000000000000000000000000000000000
--- a/ci/new_tag.sh
+++ /dev/null
@@ -1,170 +0,0 @@
-#!/bin/bash
-
-# EXCLUDE TMA BRANCH
-IS_TMA=`echo $CI_COMMIT_TAG | grep -o '[.]*_TMA[.]*'`
-
-if [ -z $IS_TMA ]; then
-
-    tag=$CI_COMMIT_TAG
-
-    echo "tag:$tag"
-
-    structures=$(echo $CI_COMMIT_TAG | tr "." "\n")
-
-    IT=1
-    for item in $structures
-    do
-        if [ $IT = 1 ]; then
-            major_version=$item
-        fi
-
-        if [ $IT = 2 ]; then
-            major_version="$major_version.$item"
-        fi
-
-        if [ $IT = 3 ]; then
-            current_num_tag=$item
-        fi
-
-        IT=$((IT+1))
-    done
-
-    previous_num_tag=$((current_num_tag-1))
-    next_num_tag=$((current_num_tag+1))
-
-    previous_tag="$major_version.$previous_num_tag"
-    next_tag="$major_version.$next_num_tag"
-
-    echo "previoustag:$previous_tag"
-
-    for row in $(curl --header "PRIVATE-TOKEN: $TOKEN_GITLAB" "https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/milestones?search=$previous_tag" | jq -r '.[] | @base64'); do
-        _jq() {
-        echo ${row} | base64 --decode | jq -r ${1}
-        }
-
-        ID=$(_jq '.id')
-
-        echo $ID
-
-        BODY="{\"id\":\"$ID\",\"state_event\":\"close\"}"
-        
-        curl -v -H 'Content-Type:application/json' -H "PRIVATE-TOKEN:$TOKEN_GITLAB" -d "$BODY" -X PUT https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/milestones/$ID
-
-    done
-
-    BODY="{\"id\":\"$CI_PROJECT_ID\",\"title\":\"$next_tag\"}"
-
-    # CREATE NEXT TAG MILESTONE
-    curl -v -H 'Content-Type:application/json' -H "PRIVATE-TOKEN:$TOKEN_GITLAB" -d "$BODY" -X POST https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/milestones
-
-    # GENERATE RAW CHANGELOG
-    file="tmp.txt"
-    file2="tmp2.txt"
-    file3="tmp3.txt"
-    file4="tmp4.txt"
-
-    CONTENT=""
-
-    cd ci
-
-    mkdir tmp
-
-    cd tmp
-
-    echo "Set user git : $GITLAB_USER_NAME <$GITLAB_USER_EMAIL>"
-
-    git config --global user.email "$GITLAB_USER_EMAIL" && git config --global user.name "$GITLAB_USER_NAME"
-
-    git clone $REPOSITORY_URL_SSH -b $major_version .
-
-    git fetch
-
-    echo "git log $previous_tag..$CI_COMMIT_TAG --pretty=format:'%s' --grep='Update referential' --all-match";
-
-    REFUPDATED=`git log $previous_tag..$CI_COMMIT_TAG --pretty=format:'%s' --grep='Update referential' --all-match`
-
-    echo "git log $previous_tag..$CI_COMMIT_TAG --pretty=format:'%s' --grep='FEAT' --all-match";
-
-    git log $previous_tag..$CI_COMMIT_TAG --pretty=format:'%s' --grep='FEAT' --all-match > tmp.txt
-    echo '' >> tmp.txt
-
-    while IFS= read -r line
-    do
-        ISSUE_ID=`echo $line | grep -o 'FEAT #[0-9]*' | grep -o '[0-9]*'`
-        echo "$ISSUE_ID" >> tmp2.txt
-    done <"$file"
-
-    echo "git log $previous_tag..$CI_COMMIT_TAG --pretty=format:'%s' --grep='FIX' --all-match";
-
-    git log $previous_tag..$CI_COMMIT_TAG --pretty=format:'%s' --grep='FIX' --all-match > tmp.txt
-    echo '' >> tmp.txt
-
-    while IFS= read -r line
-    do
-        ISSUE_ID=`echo $line | grep -o 'FIX #[0-9]*' | grep -o '[0-9]*'`
-        echo "$ISSUE_ID" >> tmp2.txt
-    done <"$file"
-
-    sort -u $file2 > tmp3.txt
-
-    while IFS= read -r line
-    do
-        echo "=================="
-        echo $line
-        curl -H "X-Redmine-API-Key: ${REDMINE_API_KEY}" -H 'Content-Type: application/json' -X GET https://forge.maarch.org/issues/$line.json > issue_$line.json
-        # echo `cat issue_$line.json`
-        SUBJECT=`cat issue_$line.json | jq -r '.issue.subject'`
-        TRACKER=`cat issue_$line.json | jq -r '.issue.tracker.name'`
-        ID=`cat issue_$line.json | jq -r '.issue.id'`
-        echo ""
-        echo "ID : $ID"
-        echo "TRACKER : $TRACKER"
-        echo "SUBJECT : $SUBJECT"
-        echo "=================="
-
-        if [ ! -z $ID ]
-        then
-            echo "* **$TRACKER [#$ID](https://forge.maarch.org/issues/$ID)** - $SUBJECT" >> tmp4.txt
-        fi
-    done <"$file3"
-
-    if [[ !  -z  $REFUPDATED  ]]; then
-        echo "* **Fonctionnalité** - Mise à jour de la BAN 75" >> tmp4.txt
-    fi
-
-    sort -u $file4 >> changelog.txt
-
-    while IFS= read -r line
-    do
-        CONTENT="$CONTENT\n$line"
-    done <"changelog.txt"
-
-    echo $CONTENT
-
-    # Update tag release
-    BODY="{\"description\":\"$CONTENT\"}"
-
-    curl -v -H 'Content-Type:application/json' -H "PRIVATE-TOKEN:$TOKEN_GITLAB" -d "$BODY" -X POST https://labs.maarch.org/api/v4/projects/$CI_PROJECT_ID/repository/tags/$CI_COMMIT_TAG/release
-
-
-    # NOTIFY TAG IN SLACK
-    curl -X POST --data-urlencode "payload={\"channel\": \"$CHANNEL_SLACK_NOTIFICATION\", \"username\": \"$USERNAME_SLACK_NOTIFICATION\", \"text\": \"Jalon mis à jour à la version $tag!\nVeuillez rédiger le <$CI_PROJECT_URL/tags/$tag/release/edit|changelog> et définir une date de sortie.\", \"icon_emoji\": \":cop:\"}" $URL_SLACK_NOTIFICATION
-
-    # Update files version
-    cp package.json tmp_package.json
-
-    jq -r ".version |= \"$next_tag\"" tmp_package.json > package.json
-
-    rm tmp_package.json
-
-    git add -f package.json
-
-    # sed -i -e "s/$CI_COMMIT_TAG/$next_tag/g" sql/test.sql
-
-    # git add -f sql/test.sql
-
-    git commit -m "Update next tag version files : $next_tag"
-
-    git push
-
-fi
\ No newline at end of file