== Mise à jour de l'application

Une application sans aucun bug et avec toutes les fonctionnalités présentes du premier coup, on n'a jamais vu (sauf peut-être Chuck Norris?). 

Vous serez amenés (souvent?) à faire des mises à jour de votre application.

Les étapes à ne surtout pas oublier sont : 

. La récupération des nouvelles sources
. La mise à jour du schéma de la base de données
. La récupération des (nouveaux) fichiers statiques
. Le redémarrage de gunicorn, puisque les processus précédents devraient encore être en train de tourner - si ce n'est pas le cas, vous aurez sûrement mis une page d'erreur avec une licorne en place ;-)

=== Récupération des sources

Si vous avez suivi ce guide jusqu'ici, vos sources devraient se trouver dans le répertoire `/webapps/gwift` d'un utilisateur. Suivant la sécurité mise en place, vous aurez deux possibilités:

. Soit les sources sont toujours liées au dépôt Git/Mercurial/Whatever 
. Soit, vous devrez télécharger une archive contenant les fichiers.

Dans le premier cas :
 
[source,bash]
----
cd ~/webapps/gwift
git fetch
git checkout <version_number>
----

Dans le second cas :

[source,bash]
----
wget -O ...
unzip / tar xvfz / ... 
chown gwift:webapps ...
----

Et dans les deux cas: 

[source,bash]
----
source ~/.venvs/gwift/bin/activate
python manage.py migrate
python manage.py collectstatic
supervisorctl reload
----


NOTE: j'avais bidouillé un truc avec la documentation de Fabric, mais je pense que je ne l'avais jamais essayé :-)

[source]
----
*****************************
Automatisation du déploiement
*****************************

Pour automatiser le déploiement, il existe `Fabric <http://www.fabfile.org/>`_. 

 * **Problème**: cette librairie n'existe que pour Python2.7. 
 * **Avantage**: on peut écrire du code semblable à `ceci <https://github.com/UrLab/incubator/blob/master/fabfile.py>`_...

.. code-block:: python

    from fabric.api import run, cd
    from fabric.context_managers import prefix


    def deploy():
        code_dir = '/home/www-data/incubator'
        with cd(code_dir), prefix('source ve/bin/activate'):
            run('sudo supervisorctl stop incubator')
            run("./save_db.sh")
            run("git pull")
            run("pip install -r requirements.txt --upgrade -q")
            run("./manage.py collectstatic --noinput -v 0")
            run("./manage.py makemigrations")
            run("./manage.py migrate")
            run('sudo supervisorctl start incubator')

En gros: 

 1. On se place dans le bon répertoire
 2. On arrête le superviseur
 3. On sauve les données de la base de données
 4. On charge la dernière version depuis le dépôt Git
 5. On met les dépendances à jour (en mode silencieux)
 6. On agrège les fichiers statiques
 7. On lance les migrations
 8. Et on relance le superviseur.
 
Avec un peu de chances, l'instance est à jour.
----

IMPORTANT: y'a quand même un truc un peu foireux, c'est que l'utilisateur ci-dessus doit passer par root (ou sudo) pour redémarrer supervisorctl. C'est un peu moyen. Voir s'il n'y a pas un peu mieux comme méthode.
