Utiliser Git pour gérer plusieurs Moodle

Utiliser Git pour gérer plusieurs Moodle

par Séverin Terrier,
Nombre de réponses : 11
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour,

Depuis des années, je gère mes différentes instances Moodle par téléchargement, et installation dans des dossiers distincts, en mettant à jour les fichiers modifiés. Je n'ai jamais utilisé CVS, dont les serveurs pour Moodle ont été désactivés en début d'année 2013.

Mais depuis quelques temps, il est recommandé d'utiliser Git pour installer/mettre à jour Moodle (cela m'a encore été recommandé il n'y a pas longtemps).

Je veux bien m'y mettre (comme bonne résolution 2013), mais je me pose des questions, même après avoir lu la documentation Git pour administrateur Moodle, la documentation officielle Git en français, et les rares discussions sur les forums Moodle francophone, parlant de l'installation/mise à jour, du changement de version (branche), et du développement avec plusieurs versions.

C'est encore dans cette dernière discussion qu'est abordé mon souci : comment gérer au mieux plusieurs installations de Moodle, avec des versions différentes, et des personnalisations différentes. Mais éventuellement en étant capable aussi de récupérer facilement des éléments communs...

Je trouve dommage d'être obligé de récupérer le dépôt Moodle entier pour chaque Moodle installé, et ne suis pas sur que cela réponde à la problématique d'éléments communs.

Ne serait-il pas possible de ne récupérer qu'une seule fois en local le dépôt Moodle officiel, et de se synchroniser ensuite sur plusieurs éléments distincts, en fonction des versions désirées ?

Si vous avez de bonnes idées, je suis donc preneur.

De même, si vous avez déjà écrit des scripts permettant d'automatiser les mises à jour de Moodle, et/ou des différents plugins installés, cela m'intéresse.

Merci d'avance,
Séverin

Moyenne des évaluations  -
En réponse à Séverin Terrier

Re: Utiliser Git pour gérer plusieurs Moodle

par Joseph Rézeau,
Avatar Développeurs Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Séverin,

Bravo pour cette "bonne résolution".

"Ne serait-il pas possible de ne récupérer qu'une seule fois en local le dépôt Moodle officiel, et de se synchroniser ensuite sur plusieurs éléments distincts, en fonction des versions désirées ?"

D'après ce que j'ai compris, la réponse est non. Voici comment je procède (en version simplifiée) sur mon installation locale de Moodle.

Dans le dossier htdocs vers lequel pointe mon localhost, j'ai un répertoire par version de Moodle:

moodle19, moodle21, moodle 22, moodle23, moodle14 et moodledev (master/2.5).

Dans chacun de ces répertoires, j'ai installé un "clone" complet de Moodle.

Puis, dans le répertoire moodle19 je pointe sur la branche MOODLE_19_STABLE, et idem pour les autres répertoires.

Bien sûr ça donne une impression de gaspillage/redondance, mais c'est l'avantage du système GIT : à tout moment on peut avoir l'historique complet de toutes les versions de Moodle, changer de branche, etc.

Si on fait du développement de modules spécifiques, si on ajoute des plugins tierce partie, ça se complique un peu, mais le principe est le même. Pour "suivre" des plugins tierce partie avec GIT, il faut que ces plugins aient été déposés par leur auteur sur leur GITHUB (c'est mon cas).

Pour gérer le GIT, comme je ne suis pas un adepte de la ligne de commande, j'utilise TortoiseGit (pour Windows) qui a l'avantage d'offrir une belle interface graphique comme je les aimes.

Bon courage,

Joseph

 

 

Annexe 21-01-2013 18-27-13.png
En réponse à Joseph Rézeau

Re: Utiliser Git pour gérer plusieurs Moodle

par Valery Fremaux,
Avatar Développeurs de plugins

C'est un peu le problème e Git : La gestion d'intégration modulaire. Si t'as un truc magique Joseph, je veux bien essayer  :

J'en suis à suivre actuellement à peu près 40 bases de codes d'intégration et de pré-intégration + 6 maharas.

Chacune avec des particularités et des équipements différents et des niveaux de maturité différents. 

J'ai vu que la gestion de "sous packages" indépendants par subtree est franchement pas trivial, que la gestion par sous-module est encore pire...

Je reconnais à Git de grandes vertus pour la partie amont d'un référentiel de distriubtion, lorsqu'il faut fédérer les initiatives collaboratives mais non nécessairement concertées en une intégration finale. Mais par contre, pour ce qui est de la chaine descendante, et en intégration M modules vers N implémentations, je n'ai toujours rien trouvé d'autre que la technique de type CVS/SVN

C'est surtout au niveau de la mise en exploitation ou il est très difficile (à moins d'une preuve du contraire) de procéder à une mise en service modulaire et progressive, module par module. Fonction par fonction, et ce dans n'importe quel ordre (surout pas nécessairement celui des commits).

Le principe de Git étant d'enregistrer dans une "piste" linéaire de modifications (les commits) toutes les petites modifications différentielles successives de l'ensemble du répository, je vois mal comment il peut proposer un pull localisé à un répertoire.

Si les experts Giteux peuvent m'éclairer sur le sujet ? bienvenue !

Je vais essayer TortoiseGit pour voir si certaines de mes questions ont une réponse.... (native ou scriptée) ... j'en suis pour l'instant à Git Bash et Git GUI qui sont très bof....

Valery.

 

 

En réponse à Valery Fremaux

Re: Utiliser Git pour gérer plusieurs Moodle

par Eric Villard,

Salut à vous,

je profite de ce fil de discussion pour vous faire part de mon avancement sur ce sujet.

Les serveurs dont j'ai la charge ont une base linux (Ubuntu).

J'ai créé la structure particulière suivante sous un compte utilisateur (ex : mdluser) :
/home/mdluser
/home/mdluser/config
/home/mdluser/config/main
/home/mdluser/config/sites
/home/mdluser/data
/home/mdluser/plugins
/home/mdluser/theme
/home/mdluser/www

Les éléments de détails importants sont :

  • /home/mdluser/config/main :  est un dépôt GIT paramétré pour accepter des mises à jour en mode 'push' et contient un fichier de configuration config.php qui est un tronc commun à tous les sites. Le routage est basé sur le nom de domaine du site.
  • /home/mdluser/config/sites :  est un dépôt GIT paramétré pour accepter des mises à jour en mode 'push' et contient pour chaque site un sous-dossier dont le nom est le nom de domaine du site. Celui-ci fournit un fichier config.php dynamiquement inclus dans le précédent. Ce fichier de configuration contient les éléments particuliers au site courant (ex : connexion à la base de données)
  • /home/mdluser/data : contient pour chaque site un sous-dossier dont le nom est le nom de domaine du site et qui héberge les données
  • /home/mdluser/plugins : contient un alias vers le fichier /home/mdluser/config/main/config.php et la sous-arborescence des plugins à intégrer comme si ce dossier était le dossier racine de moodle. Chaque dossier d'installation de plugin est un dépôt GIT paramétré pour accepter des mises à jour en mode 'push'
    ex : mod/questionnaire où le dossier questionnaire est un dépôt GIT
  • /home/mdluser/theme : même configuration et même fonctionnement que le dossier plugins.
  • /home/mdluser/www : contient les arborescences de sites Moodle qui sont des dépôt GIT paramétrés pour accepter des mises à jour en mode 'push'.
    Il existe 2 types de sites Moodle :
    • mutualisé : l'arborescence de site est partagée entre plusieurs sites Moodle
    • indépendante : en cas de besoin particulier pour un site

Chaque dossier contient à minima un alias vers le fichier /home/mdluser/config/main/config.php, et peut contenir d'autres liens vers les dossiers d'installation des plugins et des thèmes à intégrer.

Au final j'ai donc les dépôts GIT suivants :

  • 1 pour la configuration commune à tous les sites
  • 1 par serveur pour l'ensemble des configurations particuliaires à chaque site
  • 1 par plugin non contenu dans la distribution Moodle par défaut
  • 1 par thème non contenu dans la distribution Moodle par défaut
  • 1 par arborescence Moodle nécessaire

Inconvénients :

  • plusieurs dépôts à gérer
  • pour le moment pas de fonctionnalités dans Moodle pour gérer facilement les plugins et les thèmes hors arborescence du site

Avantages :

  • facilité de mise à jour car beaucoup de ressources sont partagées entre plusieurs sites
  • granularité du paramétrage, de la configuration et des mises à jours plus fine
  • plus grande facilité d'automatisation de certains processus
  • structure compatible Moodle 1.9.x et 2.x.x.
    Pour moodle 1.9.x, il faut ajouter les dossiers mdluser/plugins-1.9 et mdluser/theme-1.9, le principe reste le même

Actuellement à l'étude :

  • un système de gestion de la configuration plus robuste et gérant la problématique de ligne de commande
  • un plugin pour la gestion des plugins et thèmes hors arborescence Moodle
  • un système de gestion des versions de l'intégralité des sites permettant de revenir à une configuration d'un instant T en conservant la cohérence entre chaque brique du site (site web, plugins, thèmes, configuration, données et base de données)

Pourquoi les dépôts GIT sont-ils paramétrés pour accepter le mode 'push' ?
Simplement parce que je fais d'abord les intégrations sur mon poste de travail et que c'est super pratique ;)
Je souhaite au final centraliser la gestion des mises à jour depuis un serveur d'administration car j'ai en charge plusieurs serveurs Moodle.

En complément un lien vers une problèmatique à laquelle j'ai été confronté lors de changement de branches MOODLE_XX_STABLE : https://moodle.org/mod/forum/discuss.php?d=206340

Voilà pour le moment.

Restant à votre disposition pour tout complément d'information, partage de code...
N'hésitez pas à me faire part de vos remarques.

@+

Eric

 

 

En réponse à Eric Villard

Re: Utiliser Git pour gérer plusieurs Moodle

par Daniel Méthot,
Avatar Moodleurs particulièrement utiles

Ouaaaa

C'est là que je prend conscience de tout ce qui me reste encore à découvrir...rouge

Daniel

En réponse à Eric Villard

Re: Utiliser Git pour gérer plusieurs Moodle

par Valery Fremaux,
Avatar Développeurs de plugins

La démarche est logique et en effet peut bien outiller une gestion de multiples instances. Reste en effet ce problème important des plugins hors tronc.

Les choses qui me gêneraient dans ma pratique avec ce dispositif :

Tisser beaucoup de liens entre de nombreux repositories suppose en suite avoir une parfaite gestion de tous les cas d'intégration. Lorsque des modifications impliquent des changements d'usage importants, il n'est pas toujours possible de mettre à jour de manière uniforme le parc des instances de production (ce cas m'est arrivé souvent), soit parce que l'évolution fonctionnelle n'est pas demandée, soit parce qu'elle ne peut être faite qu'avec un temps important de reprise de contenus existants, soit pour plein d'autre raisons.

Il y aura toujours une différence importante de point de vue des outils entre des intégrateurs "internes" d'une institution, et une position de prestataires : Les deuxièmes ont malheureusement une contrainte assez drastique de budget, doivent être compétitifs et doivent parfois négocier des enveloppes qui limitent les possibilités de construction d'outillage "sur mesure". C'est un autre débat, mais il influe aussi sur le choix de la strcuture des outils et techniques utilisées pour gérer les Moodle.

Aujourdhui, la difficulté MAJEURE que je trouve dans la gestion sous GIT de la chaine aval (chaine aval : des instances de référence vers les copies de production, chaine amont : des versions de développement ou d'intégration vers la version de référence), c'est la difficulté de gérer des modifications tranversales. Soit le cas suivant :

Deux plugins évoluent "normalement" dans leur cycle de vie, en accumulant les améliorations. Une amélioration des pratiques d'architecture faite par ailleurs nécesite la reprise de ces deux plugins pour y intercaler ces améliorations de structure. Les deux opérations s'entrecroisent. à moins de commiter modif par modif, et de tenir une "comptabilité" permanente et ultra pointilleuse de ce qui a été commité ça et là, il est impossible ou très difficile sous Git, de "faire son marché" dans la partie qui va être passée en production (par exemple, passer les évolutions fonctionnelles, mais sans basculer les améliorations transversales.

En gros, et à moins que je me trompe lourdement, Git fait évoluer TOUT le repository d'un commit stable à un autre commit stable, en rejouant toutes les modifs successives faites dans les fichiers du repo. Retrouver là dedans une mise à jour partielle d'un sous-ensemble particuliers de fichiers est quasiment impossible.

C'est là que je m'interroge sur la pertinence de Git pour gérer la chaine aval. Car ce qui compte pragmatiquement, c'est bien l'état immédiat de la base de code qui est présentée en face des utilisateurs. Toute l'histoire qui y a mené et qui intéresse fortement les développeurs, l'exploitant, lui s'en fiche comme de l'an quarante, puisque ce qui importe surtout, c'est de présenter la "meilleure" version du code aux utilisateurs finaux.

Autant je découvre un intérêt effectif de Git dans la chaine amont, avec une très grande souplesse et rapidité de gestion des variantes de développement, autant je n'arrive pas à comprendre sa popularité dans cet usage.

Dans la construction proposée, j'ai l'impression que l'on rejoue le "déplacement du tas de sable", en référence à une époque révolue de la présence militaire française à Berlin, où une activité majeure des conscrits berlinois (souvent envoyés là-bas pour raisons disciplinaires) déplaçaient un tas de sable d'un coin de la caserne à l'autre, puis encore à l'autre, et recommençaient quand ils avaient fait le tour.

Il en va des techniques logicielles, des encodages, des normes et technologies comme du tas de sable : l'innovation prétend toujours trouver la solution miracle alors qu'elle ne fait que déplacer la complexité ailleurs. Elle déplace le tas de sable. en changeant de paradigme par rapport à des techniques antérieures comme CVS ou SVN, Git apporte des nouveaux outils, des nouvelles pratiques, et en élimine ou interdit des anciennes qui étaient tout aussi opérables et efficientes. Il déplace le tas de sable.

La question essentielle n'est plus l'outil, mais bien la pratique de gestion qui supprime la vue et l'attention sur l"objet final (puisque tout se commande à partir des points de départ, et plus de l'arrivée). J'avais concocté un outillage redoutable de multicopie scriptée de plugins à travers toutes les copies de code, avec une configuration ultra-souple des sources et des destinations. Je ne l'utilise preque plus du tout : Je passais mon temps à gérer les exceptions, ou les erreurs de manoeuvre que les configurations "implicites" et sorties de ma mémoire me faisaient faire. Bref, je déplaçais le tas de sable.

....

 

En réponse à Valery Fremaux

Re: Utiliser Git pour gérer plusieurs Moodle

par Eric Villard,

Bonjour à tous,

je suis également toujours en questionnement et en perpétuelle évolution de mes méthodes de travail.


Ce dont je me suis rendu compte avec GIT, c'est l'importance des commits.
Faire un diff entre deux commits permet justement d'extraire uniquement les modifications apportées.
Il faut simplement arriver à trouver un bon équilibre dans leur fréquence, et ce n'est pas simple...


En ce qui concerne la problématique du lien développement/production et du "faire son marché", elle se situe pour moi plus dans la gestion des branches. Et notamment dans la conservation de branches indépendantes et autonomes, comme c'est le cas pour Moodle. C'est le souci que j'évoquais précédemment lors du passage d'une branche MOODLE_N_STABLE à MOODLE_N+1_STABLE.
Un modèle d'organisation qui permet d'éviter en partie cet écueil est le suivant : http://nvie.com/posts/a-successful-git-branching-model/ 
L'extension de comandes GIT permettant de le gérer aisément se trouve ici : https://github.com/nvie/gitflow

En résumé, le principe est de ne garder actives que 2 branches fortement liées :

  • la branche master, extraite par défaut lors de la copie du dépôt, qui propose toujours et uniquement la dernière version stable
  • la branche development, qui est la continuité de la précédente et prépare la prochaine version

Viennent se greffer à cette dernière des branches ponctuelles (corrections de bugs, ajout de fonctionnalités...). 

L'avantage, outre la vision claire de la progression de l'application, est que l'intégration des modifications s'en trouve simplifiée.
La mise en production est basée sur la branche master et la mise à jour d'une version stable à une autre se fait par simple git pull.

En complément voici un autre article qui permet d'affiner et de simplifier ce modèle : http://scottchacon.com/2011/08/31/github-flow.html

D'autre part concernant la possibilité de gérer un site web de manière distante en utilisant GIT, voici une bonne base : http://toroid.org/ams/git-website-howto

Je m'en suis servis pour mettre en place l'architecture décrite précédemment.

@+

Eric

En réponse à Eric Villard

Re: Utiliser Git pour gérer plusieurs Moodle

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour à tou(te)s,

Merci pour vos différentes réponses (notamment les éléments détaillés d'Eric).

Avec Git, il est effectivement recommandé de réaliser de nombreuses branches, et de nombreux "commits", qui restent de petite taille, et "atomiques", chacun n'apportant qu'une petite correction, ou une petite évolution, et pas tout un ensemble de corrections, améliorations d'un coup. Cela permet ensuite de récupérer/intégrer/annuler les éléments souhaités.

Comme Valery, je vois très bien l'intérêt de Git pour les développeurs (la chaine amont comme dit Valery), et la gestion de multiples branches de développement, corrections de bogues, applicables à plusieurs versions (branches) différentes.

J'ai plus de mal à voir comment gérer la chaine avale, utilisée par les administrateurs, qui peuvent avoir besoin d'installer plusieurs versions (différentes), sans forcément faire de développement, hormis peut-être quelques adaptations (et corrections) simples, mais surtout utiliser des plugins (identiques, ou ayant des versions différenciées) dans plusieurs instances.

Il y a la solution de Joseph, avec des dépôts Git totalement indépendants, qui possède l'avantage de l'isolation des données (et évite le risque de casser une autre instance).
Mais cela comporte quelques inconvénients : chaque instance réalise une copie complète du dépôt, ce qui génère une perte de place disque, et une "consommation" réseau supérieure (mises à jour multiples). De plus, chaque plugin utilisé doit-être "tiré" dans chaque dépôt.

A l'inverse, l'organisation complètement découpée décrite par Eric (le 8 février), qui utilise manifestement beaucoup les liens unix, mais que je ne suis pas certain d'avoir complètement appréhendé...

Pour gérer plusieurs Moodle, je me demandais s'il ne faudrait pas avoir un dépôt unique (pour limiter la place disque et l'activité réseau), qui comprenne de nombreuses branches, correspondant à chaque instance, et tous les plugins potentiellement utilisés par chaque instance.
Chaque instance serait ainsi gérée dans ce dépôt unique, et lorsqu'on souhaite apporter une mise à jour, on passerait sur la branche (de l'instance) souhaitée, et il ne resterait qu'à synchroniser (récupérer) son contenu (hormis le dossier .git) dans le dossier réel de cette instance sur le serveur web.

Voila l'état de mes réflexions actuelles.

Séverin

En réponse à Séverin Terrier

Re: Utiliser Git pour gérer plusieurs Moodle - migrer une installation existante

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Et pour ceux qui veulent migrer vers Git une installation existante (réalisée via CVS, ou manuellement), j'ai trouvé cette démarche qui semble intéressante.

En réponse à Séverin Terrier

Re: Utiliser Git pour gérer plusieurs Moodle

par Valery Fremaux,
Avatar Développeurs de plugins

Il y a une lourdeur aussi en développement à laquelle je n'ai pas trouvé de réponse : Si on peut facilement brancher et faire des clones très rapidement d'un dépôt (en tout cas sur des petites unités que sont des plugins), maintenir plusieurs branches de Moodle dans un seul dépôt ne concerne qu'un "dépot central" de code à partir duquel on vient tirer dans des dépots locaux une copie d'une branche pour l'exploitation.

En développement, je vois pas bien  comment les développeurs s'en sortent lorsque chaque checkout est potentiellement lié à un état de la base de données et un état des volumes de fichiers physiques (jeux de test etc.), est-ce à dire que les développeurs mettent aussi dans Git les données pour checkouter une copie intégale de travail ? j'en doute.

Où alors est-ce à dire que les développeur maintiennent, en plus d'un dépot central "branché" des dépots locaux (un par version opérationnelle en fonctionnement avec les données) ?

Si on arrive à ce type de conclusion, j'ai fais mon choix. Quitte à reconstituer sous Git une gestion centralisée, je passe sous SVN ! grand sourire et mes scripts de checkout, fonctionnellement n'ont rien à envier avec un pull Git.  

(p....n ! c'est pas faute pourtant de vouloir faire preuve de bonne volonté clin d’œil )

En réponse à Séverin Terrier

Re: Utiliser Git pour gérer plusieurs Moodle

par Eric Villard,

Bonsoir tout le monde,

@séverin :

en fait c'est en partie ce que je fais.
Sur mon poste de travail j'ai un clone du dépôt moodle officiel dans lequel je fais les intégrations souhaitées sur des branches indépendantes. Ces intégrations se limitent généralement à une simple mise à jour.
Je pousse ensuite ces modifications dans la branche master des dépôts en production paramétrés spécialement pour accepter les requêtes dans ce sens.

La structure que j'ai décrite précédemment est intéressante dans la mesure où il est possible de mutualiser un maximum de ressources pour plusieurs sites moodle hébergés sur le même serveur.
J'ai par exemple 3 sites tournant sur le même tronc moodle 2.3.1.
La mise à jour se fait par un simple git push vers ce dépôt.
J'ai en projet de finir l'upgrade en ligne de commande de manière automatisée pour ne pas avoir à cliquer sur "notifications" dans la partie admin de chaque site.

M'enfin tout n'est pas parfait pour le moment...

@valery :

Pour la partie développement et sa problématique de synchronicité entre les états d'un commit GIT particulier, la base de données et les fichiers de données, je n'ai pour le moment pas trouvé de piste pour ces derniers, compte tenu des volumes à appréhender.

Concernant la partie synchronisation entre GIT et la base de données, je m'intéresse, malheureusement que trop rarement, à liquibase http://www.liquibase.org/ qui semble bien gérer les retours en arrière.
Car finalement le noeud du problème est là : comment revenir à un état antérieur stable et cohérent ?

@+

Eric

En réponse à Joseph Rézeau

Re: Utiliser Git pour gérer plusieurs Moodle

par Didier Jodin,

"[...] une belle interface graphique comme je les aimes."

Attention, événement !
Venant de Joseph, ce post est un "collector" !

(Si ma religion ne m'interdisait pas les smileys, j'en mettrais un.)