From 79a9e20cc62b8b2a31b80622b1fdecebd32f79d3 Mon Sep 17 00:00:00 2001
From: Anthony Borghi <anthony.borghi@veremes.com>
Date: Fri, 3 Mar 2023 16:54:23 +0100
Subject: [PATCH] doc VAI 1er jet

---
 source/index.rst                       |   2 ++
 source/vai/dev.md                      |  19 ++++++++++++++
 source/vai/generation.md               |  33 +++++++++++++++++++++++++
 source/vai/images/pyinstaller-logo.png | Bin 0 -> 16304 bytes
 source/vai/index.rst                   |  21 ++++++++++++++++
 source/vai/presentation.md             |  29 ++++++++++++++++++++++
 6 files changed, 104 insertions(+)
 create mode 100644 source/vai/dev.md
 create mode 100644 source/vai/generation.md
 create mode 100644 source/vai/images/pyinstaller-logo.png
 create mode 100644 source/vai/index.rst
 create mode 100644 source/vai/presentation.md

diff --git a/source/index.rst b/source/index.rst
index c784815..c56ca4b 100644
--- a/source/index.rst
+++ b/source/index.rst
@@ -18,4 +18,6 @@ Cette documentation sert de référence en ce qui concerne les outils et usages
    vscode/index.rst
    git/index.rst
 
+   vai/index.rst
+
    
diff --git a/source/vai/dev.md b/source/vai/dev.md
new file mode 100644
index 0000000..06809ad
--- /dev/null
+++ b/source/vai/dev.md
@@ -0,0 +1,19 @@
+# Préparer le code pour la génération de setup
+
+a
+## Préparer l'application
+
+### Définition de l'arboresence de dépendances
+
+## Préparer les modules
+
+### Définition du fichier de dépendances
+
+## Préparer un module externe
+
+
+# Usages avancés
+
+## Utilisation de template spécifique
+
+## Ajout d'un script de pré/post installation
\ No newline at end of file
diff --git a/source/vai/generation.md b/source/vai/generation.md
new file mode 100644
index 0000000..68e16a8
--- /dev/null
+++ b/source/vai/generation.md
@@ -0,0 +1,33 @@
+# Génération de setup
+
+## Génération d'un setup d'installation pour une application
+
+Il faut passer par [le Jenkins de Veremes](http://jenkins.veremes.net/), et lancer le job **Generate_app_setup_2020**.
+
+Il faut définir l'application à générer (si l'application que vous voulez générer n'est pas dans la liste il faut demander à un administrateur de l'ajouter).
+La référence du commit Git de l'application à générer, la référence du commit pour Le job jenkins et la référence Git pour VAI.
+
+La référence du commit pour Jenkins, est utilisé pour la définition du pipeline et l'AMI  à utilisé pour lancer VAI.
+La référence du commit pour VAI, permet de définir quelle version de VAI on veut lancer pour générer l'installer
+La référence du commit de l'application est utilisé pour généré le app.tgz.
+
+Le job, va lancer une machine AWS d'aprés une AMI Linux avec PyInstaller, ... déjà installer sur la machine. Jenkins, va ensuite se connecter à la machine, cloner les sources de l'application à générer, puis lancer un script qui va permettre la construction du app.tgz. 
+Ce script va d'abord cloner les modules, lancer le script mount_project.sh, installer les dépendances du frontend et le compiler en mode production, puis installer les dépendances pour le backend.
+Il va ensuite télécharger les ressources externes et nettoyer l'arboresence. Pour finir on produit une archive qui va conserver l'arborescence des point de montage comme si c'était des dossiers normaux.
+
+```{Warning}
+  Il peut compiler les moteurs pour vous si le script build_engine.sh est présent cependant je vous le déconseille. La compilation via nexe avec wine présente de gros problème de fonctionnement ensuite sur la version Windows. Il vaut mieux les compiler en amont avec l'autre job jenkins prévu pour et les ajouter comme ressources complémentaires.
+```
+
+Ensuite on lance la production du binaire `installer`, une première fois pour linux sur la machine directement et une seconde fois sur la même machine à travers Wine ce qui permet d'avoir la version Windows du binaire.
+
+Une fois cette étape terminé, Jenkins zip les setups et les envois sur AWS S3 dans le dossier builds du bucket veremes-dev-ressource.
+
+## Génération d'un setup d'installation pour un module externe
+
+Il est aussi possible de générer un setup permettant d'installer un module complémentaire dans une application existante (comme Oxalis ou RisMajic).
+Au niveau de l'utilisation c'est sensiblement la même chose il faut lancer le job **Generate_mod_setup_2020**.
+
+La construction du fichier `mod.tgz` est bien plus rapide vu qu'il n'y a pas de compilation ou de récupération de dépendances supplémentaires.
+La compilation de l'installer est identique. 
+L'archive finale est également généré et envoyé sur AWS S3.
\ No newline at end of file
diff --git a/source/vai/images/pyinstaller-logo.png b/source/vai/images/pyinstaller-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..0b13c15ce6a4ecb0a430074d4bd94da410e519e6
GIT binary patch
literal 16304
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
TlE0FHfq}u()z4*}Q$iB}94wdr

literal 0
HcmV?d00001

diff --git a/source/vai/index.rst b/source/vai/index.rst
new file mode 100644
index 0000000..2f30509
--- /dev/null
+++ b/source/vai/index.rst
@@ -0,0 +1,21 @@
+VAI : Vitis Application Installer
+============================================
+
+.. image:: ./images/pyinstaller-logo.png
+   :width: 250 px
+   :align: center
+   :target: #
+
+
+VAI est l'exécutable permettant d'installer une application basée sur Vitis sur un serveur.
+
+Dans cette documentation je considère que vous savez ce qu'est une application Web basée sur Vitis et que vous connaissez l'architecture de ces application en développement.
+
+============================================
+
+.. toctree::
+   :maxdepth: 2
+
+   presentation.md
+   generation.md
+   dev.md
diff --git a/source/vai/presentation.md b/source/vai/presentation.md
new file mode 100644
index 0000000..82dbb6b
--- /dev/null
+++ b/source/vai/presentation.md
@@ -0,0 +1,29 @@
+# Présentation
+
+VAI s'appuie sur [PyInstaller](https://pyinstaller.org/en/stable/), de générer un executable à partir d'un code python et de l'interpréteur python.
+
+VAI est un script python permettant d'installer une application Web Vitis, c'ets à dire qu'il peut réaliser les taches suivantes : 
+- Vérification des pré-requis sur le serveur :
+  - Espace disque suffisant
+  - OS compatible
+  - Présence de Postgres, Postgis, Apache
+- Exécution de script de pré-installation
+- Sauvegarde des fichiers sensibles
+- Activation d'extension postgres
+- Mise à jour de la base de données
+- Création d'utilisateurs dans la base et/ou l'application
+- Mise à jour du code source de l'application
+- Suppression de fichier de développement
+- Configuration de l'application
+- Configuration d'Apache
+- Installation de ressources et d'exécutables externe
+- Exécution de script de post-installation
+
+Le livrable de VAI que l'on appelle aussi setup ou installer, se compose de plusieurs fichiers : 
+- installer/installer.exe : binaire qui contient Python et le script d'installation
+- app.tgz/mod.tgz : code source et ressources complémentaire à installer
+- dependencies.json : fichier de configuration de l'installation
+- Readme.md : fichier expliquant ce qu'il faut parametrer sur le dependencies.json
+
+Pour installer une application il suffit d'éditer le dependecies.json en fonction de ce qui est demandé pour l'application à installer, et delancer le binaire installer (en sudo ou admin en fonction de l'OS). 
+Suite à l'exécution un fichier de log sera généré contenant ce qui est remonté dans la console pendant l'exécution.
\ No newline at end of file
-- 
GitLab