From 564129494c5d4d488156e36729edeb752b2489a0 Mon Sep 17 00:00:00 2001
From: Armand Bahi <armand.bahi@veremes.com>
Date: Mon, 18 Feb 2019 16:36:02 +0100
Subject: [PATCH] =?UTF-8?q?Ajout=20section=20cr=C3=A9ation=20d'une=20appli?=
 =?UTF-8?q?cation?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 gitlab/applications_vitis.md | 659 ++++++++++++++++++++++++++++++++++-
 1 file changed, 654 insertions(+), 5 deletions(-)

diff --git a/gitlab/applications_vitis.md b/gitlab/applications_vitis.md
index de4d9ab..fd04e76 100644
--- a/gitlab/applications_vitis.md
+++ b/gitlab/applications_vitis.md
@@ -55,11 +55,660 @@ Sur **windows** les liens symboliques ne permettent pas leur utilisation dans ce
 
 
 
-## 2. Publier une version
+## 2. Publier une application
+
+La première étape est de créer un dépôt dans Development/vitis_apps/application/[nom de votre application] il sera utile de d'initialiser avec ce dépôt les fichiers traditionnels README.md et .gitignore
+
+### 2.1. Dossier conf
+
+Une fois le dépôt en place nous allons mettre en place les seuls fichiers de code qui seront relatifs à l'application (les autres seront liés à des modules), pour cela créer un dossier conf contenant la structure ci-dessous :
+
+* install/
+    * apache.conf
+    * dependency.xml
+    * fileToDelete.txt
+    * folderToDelete.txt
+* less/
+    * variables.less
+* requires/
+    * config.js
+    * requiresApp.js
+* Gruntfile.js
+* credits.json
+* package.json
+* properties.json
+
+#### install/apache.conf
+Ce fichier sera incorporé en tant qu'alias apache et définira le point d'entrée vers l'application, ci-dessous l'exemple à suivre de l'application FTTH, il suffira de remplacer le nom de l'application sur la première ligne `Alias /ftth[ENV]`
+
+```
+Alias /ftth[ENV] "[APPDIRECTORY]"
+	<Directory "[APPDIRECTORY]">
+		AllowOverride FileInfo
+		Options FollowSymLinks
+		Require all granted
+	</Directory>
+```
+
+#### install/dependency.xml
+Ce fichier est l'**un des plus importants** de l'application car il définit les modules à utiliser ainsi que leurs versions.
+
+Il doit au minimum contenir le framework  vitis, pour cela j'intègre le framework **en utilisant une branche spécifique à mon application app_ftth**.
+
+Il est très important d'utiliser une branche spécifique pour ne pas avoir de conflits avec les autres applications : quand je push sur vitis je ne veux pas impacter l'application GTF du coup j'utilise la branche app_ftth que je merge avec master en temps voulu, de cette manière je contrôle les versions des modules utilisés et je n'empiète pas sur le travail des autres.
+
+```
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Application -->
+<installer>
+	<dependenciesCollection>
+		<dependency>
+			<nature>framework</nature>
+			<name>vitis</name>
+			<version>app_ftth</version>
+		</dependency>
+	</dependenciesCollection>
+</installer>
+```
+
+Une fois vitis déclaré il faudra faire de même pour les modules à utiliser dans mon application, on remarque que pour vitis j'ai utilisé *framework* en tant que nature, la seule différence sera d'utiliser *modules* pour les modules.
+
+```
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Application -->
+<installer>
+	<dependenciesCollection>
+		<dependency>
+			<nature>framework</nature>
+			<name>vitis</name>
+			<version>app_ftth</version>
+		</dependency>
+		<dependency>
+			<nature>modules</nature>
+			<name>module_ftth</name>
+			<version>app_ftth</version>
+		</dependency>
+	</dependenciesCollection>
+</installer>
+```
+
+Dans mon exemple FTTH je n'ai qu'in seul module ftth que j'incorpore à mon XML
+
+#### install/fileToDelete.txt
+Correspond aux fichiers à supprimer une fois l'application compilée, rien à modifier ici, j'utilise les lignes ci-dessous
+```
+package.json
+Gruntfile.js
+```
+
+#### install/folderToDelete.txt
+Correspond aux dossiers à supprimer une fois l'application compilée, rien à modifier ici, j'utilise les lignes ci-dessous
+```
+requires
+```
+
+#### less/variables.less
+Ce fichier est le fichier déterminant le style de l'application : on y définit les couleurs à utiliser et les administrateurs pourront y rajouter leur CSS personnalisé.
+
+**Attention** : ce fichier n'est pas écrasé lors des mises à jour avec VAI.
+
+```
+
+// user colors
+@user-color-theme-1: #23282D;
+@user-color-theme-2: #6F8456;
+
+
+// Veremes colors
+@veremes-gtf-color: #39468A;
+@veremes-majic-color: #CF461F;
+@veremes-qualigeo-color: #832C7A;
+@veremes-wab-color: #198D9F;
+/*@veremes-vmap-color: #CB0650;*/
+@veremes-vmap-color: #198D9F;
+
+@veremes-map-backgroud-color: #020237;
+@veremes-gray-backgroud-color: #3A3A3A;
+@veremes-light-gray-backgroud-color: #9A9A9A;
+
+
+// Application colors
+@application-color-theme: #39468A; // <- Change this color
+
+@application-lighen-color-theme: lighten(@application-color-theme, 20%);
+@application-darken-color-theme: darken(@application-color-theme, 10%);
+
+@application-action-1-color: #337ab7; // blue bootstrap
+@application-action-2-color: #5cb85c; // green bootstrap
+
+// Other variables
+@ui-grid-bg-image: "../images/ui-grid/wbg.gif";
+@font-color-purple: #020237;
+
+// Dimension des vignettes dans les listes.
+@ui-grid-thumbnail-width: 100px;
+@ui-grid-thumbnail-heigth: 60px;
+```
+
+#### requires/config.js
+Permet de lister les fichiers des librairies externes à charger, rien à changer de ce côté, j'utilise les lignes ci-dessous
+
+```
+'use strict';
+
+goog.provide('vitis.application.config');
+
+// Fichiers js et css à charger pour l'application ftth.
+var oApplicationFiles = {
+    'css': [
+        // Vitis
+        'css/lib/bootstrap/css/bootstrap.min.css',
+        'css/lib/jquery/plugins/bootstrap-datepicker/bootstrap-datepicker3.min.css',
+        'css/lib/jquery/plugins/bootstrap-fileinput/css/fileinput.min.css',
+        'css/lib/ui-grid/ui-grid.min.css',
+        'css/lib/jquery/plugins/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css',
+        'css/lib/bootstrap-checkbox/build.css',
+        'css/lib/bootstrap-checkbox/font-awesome.css',
+        'css/lib/jquery/plugins/bootstrap-slider/bootstrap-slider.min.css',
+        'css/lib/jquery/plugins/malihu-custom-scrollbar/jquery.mCustomScrollbar.min.css',
+        'css/lib/ui-grid/plugins/draggable-rows.less',
+        'less/main.less',
+        // App
+        'modules/vitis/less/main.less',
+        'modules/ftth/less/main.less',
+        'css/lib/codemirror/codemirror.css',
+        'css/lib/codemirror/codemirror_foldgutter.css',
+        'css/lib/codemirror/map.css',
+        'css/lib/codemirror/show-hint.css',
+        'css/lib/jquery/plugins/bootstrap-treeview/bootstrap-treeview.min.css',
+        'css/lib/jquery/plugins/bootstrap-tagsinput/bootstrap-tagsinput.css',
+        'css/lib/jquery/plugins/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css',
+        'css/lib/viewer/viewer.min.css'
+    ],
+    'js': {
+        'externs': [
+            // Studio
+            'javascript/externs/bootbox/bootbox.min.js',
+            'javascript/externs/codemirror/codemirror.min.js',
+            'javascript/externs/codemirror/htmlmixed.js',
+            'javascript/externs/codemirror/css.js',
+            'javascript/externs/codemirror/javascript.js',
+            'javascript/externs/codemirror/clike.js',
+            'javascript/externs/codemirror/php.js',
+            'javascript/externs/codemirror/xml.js',
+            'javascript/externs/codemirror/sql.js',
+            'javascript/externs/codemirror/map.js',
+            'javascript/externs/codemirror/show-hint.js',
+            'javascript/externs/codemirror/addon/fold/foldcode.js',
+            'javascript/externs/codemirror/addon/fold/foldgutter.js',
+            'javascript/externs/codemirror/addon/fold/brace-fold.js',
+            'javascript/externs/codemirror/addon/fold/xml-fold.js',
+            'javascript/externs/angular/modules/ui-codemirror/ui-codemirror.min.js',
+            'javascript/externs/tinymce/tinymce.min.js',
+            'javascript/externs/angular/modules/ui-tinymce/tinymce.js',
+            'javascript/externs/jquery/plugins/bootstrap-treeview/bootstrap-treeview.js',
+            'javascript/externs/jquery/plugins/bootstrap-tagsinput/bootstrap-tagsinput.min.js',
+            'javascript/externs/scripts_cryptage.js',
+            'javascript/externs/moment/moment.min.js',
+            'javascript/externs/moment/min/moment-with-locales.min.js',
+            'javascript/externs/jquery/plugins/notify/notify.js',
+            'javascript/externs/jquery/plugins/bootstrap-colorpicker/bootstrap-colorpicker.min.js',
+            'javascript/externs/jquery/plugins/bootstrap-confirmation/bootstrap-confirmation.min.js',
+            'javascript/externs/jquery/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js',
+            'javascript/externs/viewer/viewer.min.js'
+        ]
+    },
+    'vitisModuleDependencies': ['ui.codemirror', 'ui.tinymce', 'ui.grid.draggable-rows']
+};
+```
+
+#### requires/requiresApp.js
+Permet de lister les dépendances JS à charger avec closure, après `goog.provide('vitis.application.requires');` l'incorpore les scritps à inclure des différents modules
+
+```
+/**
+ * Ce fichier permet de charger les fichiers de l'applicaiton
+ * de façon non compilée
+ * @author: Armand Bahi
+ */
+
+goog.provide('vitis.application.requires');
+goog.require('ftth.script_module');
+```
+
+#### Gruntfile.js
+Ce fichier va permettre à closure de savoir quels fichiers utiliser pour la compilation, il faudra ajouter les dossiers contenant les différents modules (lignes 31 et 88) ainsi que modifier les noms des fichiers compilés par le nom de l'application (lignes 56, 62 et 94)
+
+```
+module.exports = function (grunt) {
+
+    var compilerPackage = require('google-closure-compiler');
+    compilerPackage.grunt(grunt);
+
+    var devMode = grunt.option('dev');
+
+    var sHome = '../';
+    if (devMode) {
+        sHome = '../client/';
+    }
+
+    var sClosureDepsHome = '../../../../../';
+
+    // Project configuration.
+    grunt.initConfig({
+        'closure-compiler': {
+            ftth: {
+                files: {
+                    [sHome + '/javascript/ftth.min.js']: [
+                        // Fichiers Vitis
+                        sHome + 'javascript/require/*.js',
+                        sHome + 'javascript/app/**/*.js',
+                        sHome + 'javascript/externs/formReader/**/*.js',
+                        sHome + 'javascript/externs/mapJSON/**/*.js',
+                        sHome + 'modules/vitis/javascript/**/*.js',
+                        // OpenLayers
+                        sHome + 'javascript/externs/openLayers/**/*.js',
+                        // Fichiers ftth
+                        sHome + 'conf/requires/*.js',
+                        sHome + 'modules/ftth/javascript/**/*.js'
+                    ]
+                },
+                options: {
+                    js: [
+                        'node_modules/google-closure-library/closure/goog/**.js',
+                        '!node_modules/google-closure-library/closure/goog/**_test.js'
+                    ],
+                    externs: [
+                        'closure/externs/angular-1.3.js',
+                        'closure/externs/bingmaps.js',
+                        'closure/externs/jquery-1.9.js',
+                        'closure/externs/bootstrap.js',
+                        'closure/externs/geojson.js',
+                        'closure/externs/jspdf.js',
+                        'closure/externs/html2canvas.js'
+                    ],
+                    compilation_level: 'ADVANCED',
+                    manage_closure_dependencies: true,
+                    generate_exports: true,
+                    angular_pass: true,
+                    debug: false,
+                    language_in: 'ECMASCRIPT5',
+                    language_out: 'ECMASCRIPT5',
+                    closure_entry_point: ['vitis'],
+                    create_source_map: sHome + '/javascript/ftth.min.js.map',
+                    output_wrapper: '(function(){\n%output%\n}).call(this)\n//# sourceMappingURL=../javascript/ftth.min.js.map'
+                }
+            },
+            formReader: {
+                files: {
+                    [sHome + '/javascript/externs/formReader/formReader.min.js']: [
+                        // Fichiers FormReader
+                        sHome + 'javascript/externs/formReader/**/*.js'
+                    ]
+                },
+                options: {
+                    compilation_level: 'WHITESPACE_ONLY',
+                    angular_pass: true,
+                    language_in: 'ECMASCRIPT5',
+                    language_out: 'ECMASCRIPT5'
+                }
+            }
+        },
+        'closureDepsWriter': {
+            options: {
+                depswriter: 'closure/depswriter/depswriter.py',
+                root_with_prefix: [
+                    // Fichiers Vitis
+                    '"' + sHome + 'javascript/app ' + sClosureDepsHome + 'javascript/app"',
+                    '"' + sHome + 'modules/vitis/javascript ' + sClosureDepsHome + 'modules/vitis/javascript"',
+                    '"' + sHome + 'javascript/externs/formReader ' + sClosureDepsHome + 'javascript/externs/formReader"',
+                    '"' + sHome + 'javascript/externs/mapJSON ' + sClosureDepsHome + 'javascript/externs/mapJSON"',
+                    '"' + sHome + 'conf/requires ' + sClosureDepsHome + 'conf/requires"',
+                    // OpenLayers
+                    '"' + sHome + 'javascript/externs/openLayers ' + sClosureDepsHome + 'javascript/externs/openLayers"',
+                    // Fichiers ftth
+                    '"' + sHome + 'modules/ftth/javascript ' + sClosureDepsHome + 'modules/ftth/javascript"',
+                    // Closure library
+                    '"' + sHome + 'conf/node_modules/google-closure-library/closure/goog ' + sClosureDepsHome + 'conf/node_modules/google-closure-library/closure/goog"'
+                ]
+            },
+            targetName: {
+                dest: sHome + '/javascript/ftth.deps.js'
+            }
+        }
+    });
+
+    grunt.loadNpmTasks('grunt-closure-tools');
+
+    // Tache par défaut
+    // cmd: grunt
+    grunt.registerTask('default', ['closureDepsWriter', 'closure-compiler:ftth']);
+    // cmd: grunt generate-deps
+    grunt.registerTask('generate-deps', ['closureDepsWriter']);
+    // cmd: grunt formReader minify
+    grunt.registerTask('minify-formReader', ['closure-compiler:formReader']);
+    // cmd: grunt formReader and studio minify
+    grunt.registerTask('minify-libs', ['closure-compiler:formReader']);
+    // cmd: grunt compile
+    grunt.registerTask('compile', ['closure-compiler:ftth']);
+};
+
+```
+
+#### credits.json
+Crédits à intégrer dans l'application
+
+```
+[
+    {
+        "label": "CREDITS_SOFTWARE",
+        "rows": [
+            {
+                "type": "text",
+                "value": "FTTH"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_VERSION",
+        "rows": [
+            {
+                "type": "text",
+                "value": "CREDITS_VERSION_CONTENT"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_DATE",
+        "rows": [
+            {
+                "type": "text",
+                "value": "CREDITS_DATE_CONTENT"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_EDITOR",
+        "rows": [
+            {
+                "type": "link",
+                "value": "Veremes",
+                "url": "http://www.veremes.com"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_AUTHOR",
+        "rows": [
+            {
+                "type": "text",
+                "value": "Armand Bahi"
+            },
+            {
+                "type": "text",
+                "value": "Alexandre Bizien"
+            },
+            {
+                "type": "text",
+                "value": "Anthony Borghi"
+            },
+            {
+                "type": "text",
+                "value": "Frédéric Carretero"
+            },
+            {
+                "type": "text",
+                "value": "Olivier Gayte"
+            },
+            {
+                "type": "text",
+                "value": "Sébastien Legrand"
+            },
+            {
+                "type": "text",
+                "value": "Laurent Panabieres"
+            },
+            {
+                "type": "text",
+                "value": "Yoann Perollet"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_GRAPHICS",
+        "rows": [
+            {
+                "type": "link",
+                "value": "Nematis",
+                "url": "http://www.nematis.com"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_LIBRARIES",
+        "rows": [
+            {
+                "type": "link",
+                "value": "Bootstrap",
+                "url": "http://getbootstrap.com"
+            },
+            {
+                "type": "link",
+                "value": "AngularJS",
+                "url": "https://angularjs.org"
+            },
+            {
+                "type": "link",
+                "value": "Google Closure",
+                "url": "https://developers.google.com/closure"
+            },
+            {
+                "type": "link",
+                "value": "jQuery",
+                "url": "http://jquery.com"
+            },
+            {
+                "type": "link",
+                "value": "Rgraph",
+                "url": "http://www.rgraph.net"
+            },
+            {
+                "type": "link",
+                "value": "CodeMirror",
+                "url": "http://codemirror.net"
+            },
+            {
+                "type": "link",
+                "value": "OpenLayers",
+                "url": "http://openlayers.org"
+            },
+            {
+                "type": "link",
+                "value": "TinyMCE",
+                "url": "https://www.tinymce.com"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_CONTACT",
+        "rows": [
+            {
+                "type": "link",
+                "value": "www.veremes.com",
+                "url": "http://www.veremes.com"
+            },
+            {
+                "type": "link",
+                "value": "www.veremes.com/nous-contacter#1",
+                "url": "http://www.veremes.com/nous-contacter#1"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_LICENSE",
+        "rows": [
+            {
+                "type": "link",
+                "value": "Cecill-B",
+                "url": "http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html"
+            }
+        ]
+    }
+]
+```
+
+#### package.json
+Fichier utilisé par npm lors de la phase de compilation, à utiliser comme ci-dessous
+```
+{
+  "name": "Vitis",
+  "version": "0.1.0"
+}
+```
+
+#### properties.json
+Properties client à intégrer
+
+```
+{
+    "services_alias": "rest[ENV]",
+    "web_server_name": "https://[hostname]:[PORT]/",
+    "version": "[VERSION]",
+	"build": "[BUILD]",
+    "status": "unstable",
+	"month_year": "[MONTH_YEAR]",
+    "application": "extraction",
+    "environment": "[ENV]"
+}
+
+```
+
+Désormais notre application est viable et VAI saura la générer.
+
+### 2.2. Subtrees
+
+Quand on développe sur une application on a souvent à jongler entre les différents modules pour les mêmes fonctionnalités, pour animer cela le développeur peut faire usage de subtrees.
+
+Les subtrees sont une copie à un instant connu d'un dépot à l'intérieur d'un autre, grace à cette fonctionnalité nous pourrons sur notre application inclure les différents modules et les modifier directement depuis l'application.
+
+La première des choses à faire c'est d'inclure le subtree **utils** qui permettra d'automatiser les opérations de maintenance sur les autres subtrees, pour cela exécuter la commande ci-après.
+
+`git subtree add --prefix utils "git@gitlab.veremes.net:Development/vitis_apps/sources/utils.git" master`
+
+Une fois ceci fait un répertoire **utils** apparaît à la racine du projet.
+
+Pour initialiser les subtrees correspondant aux modules déclarés dans dependency.xml il suffira de se rentre dans le dossier utils et de lancer init_subtrees.sh
+
+Vos subtrees sont maintenant initialisés, vous pourrez les mettre à jour en utilisant utils/pull_subtrees.sh écrire dedans en utilisant utils/push_subtrees.sh
+
+Régulièrement j'utilise les fichiers ci-après que je place à la racine pour automatiser les différentes actions de maintenance
+
+**install.bat**
+```
+@echo off
+title Install Vitis App
+echo Install Vitis App
+
+cd utils
+call init_tree.bat
+call copy_hooks.bat
+
+cd ../client/conf
+call npm install grunt --save
+call npm install grunt-cli
+call npm install grunt-closure-tools --save
+call npm install google-closure-compiler@20160911.0.0 --save
+call npm install google-closure-library@20160911.0.0 --save
+call grunt
+
+cd ..
+pause
+```
+
+**install.sh
+```
+#!/bin/bash
+#
+#
+# 	Script d'initialisation d'un dépot vMap versionné sous git
+#	Initislise l'ensemble des dépendances sous forme de subtrees
+#   Crée des symlinks pour re-créer l'arborescence de l'application
+#
+#
+
+if [ `whoami` == "root" ]; then
+    echo "Please, do not run this script as sudo"
+else
+    cd utils/
+    ./init_symlinks.sh
+    ./pull_subtrees.sh
+    ./copy_hooks.sh
+
+    cd ../conf
+    npm install grunt --save
+    npm install grunt-cli
+    npm install grunt-closure-tools --save
+    npm install google-closure-compiler@20160911.0.0 --save
+    npm install google-closure-library@20160911.0.0 --save
+    grunt -dev
+fi
+```
+
+**pull_subtrees.sh
+```
+#!/bin/bash
+#
+#
+# 	Récupère les modifications des modules sur l'application
+#
+#
+
+if [ `whoami` == "root" ]; then
+    echo "Please, do not run this script as sudo"
+else
+    cd utils/
+    ./pull_subtrees.sh
+fi
+```
+
+**push_subtrees.sh**
+```
+#!/bin/bash
+#
+#
+# 	Envoie les modifications de l'application sur les modules
+#
+#
+
+if [ `whoami` == "root" ]; then
+    echo "Please, do not run this script as sudo"
+else
+    cd utils/
+    ./push_subtrees.sh
+fi
+```
+
+**update.bat**
+```
+@echo off
+title Update Vitis App
+echo Update Vitis App
+
+call utils/update_tree.bat
+
+cd client/conf
+call grunt
+
+pause
+```
+
+
+
+## 3. Publier une version
 
 On peut facilement publier une version en 4 étapes à l'aide d'outils automatisés, on distinguera deux types de versions, les **versions mineures** correspondant à des corrections de bugs qui seront taguées en changeant uniquement le dernier nombre (ex: 2018.01.**xx**), les **versions majeures** correspondent à des évolutions apportées au produit, elles seront taguées en changeant le nombre du milieu (ex: 2018.**xx**.00).
 
-### 2.1. Versionner les modules impactés
+### 3.1. Versionner les modules impactés
 
 La première chose à faire c'est de versionner les modules modifiés, pour cela on va envoyer les modifications au module en utilisant **push_subtrees.sh**, puis aller sur la branche impactée pour créer une branche qui portera comme nom le nom **pre-2018.xx.xx**.
 
@@ -70,7 +719,7 @@ Dans notre exemple on veut créer une version mineure, la version en cours est l
 La deuxième chose à faire c'est de versionner l'application, pour cela on créera une branche portant le nom de la version à générer, puis on modifiera le fichier **conf/\_install/dependency.xml** pour utiliser les branches de pre-production et enfin on utilisera **pull_subtrees.sh** pour rapatrier les nouvelles branches sur l'application.
 
 
-### 2.2. Générer une version pre-prod et effectuer les tests
+### 3.2. Générer une version pre-prod et effectuer les tests
 
 Maintenant que la structure est versionnée il faudra générer un setup et effectuer les tests, pour cela il suffit de ce rendre sur http://jenkins.veremes.net/ et lancer un job de type **Generate un and test app**.
 Ce dernier va générer un setup, le poser sur S3, démarrer une machine AWS, installer la version dessus et lancer les tests API-REST.
@@ -91,7 +740,7 @@ Une fois le job terminé vous pouvez récupérer l'url de l'application génér
 **Il est important d'effectuer également des tests en mise à jour**, aucun job n'a été développé pour l'instant donc il faudra effectuer le test manuellement.
 
 
-### 2.3. Créer les tags associés
+### 3.3. Créer les tags associés
 
 Une fois que les tests sont concluants on pourra créer les tags associés pour ceci il faudra sur chacune des branches modifiées appliquer la procédure suivante :
 
@@ -104,7 +753,7 @@ Pour l'application la procédure est légèrement différente :
 1. Utiliser pull_subtrees.sh pour être sur d'avoir intégré toutes les modifications
 1. Créer un tag à partir de la branche pre-prod
 
-### 2.4. Générer une version de production
+### 3.4. Générer une version de production
 
 La dernière étape consiste à rejouer l'étape 2.2 puis récupérer le setup généré sur https://s3.console.aws.amazon.com/s3/buckets/veremes-dev-ressources/builds/
 
-- 
GitLab