Quelle est la meilleure pratique pour mettre à jour le noyau Drupal sans casser le dépôt Git et le site de production

13

J'ai un référentiel Git dans lequel tout mon code est dans la branche principale, et j'ignorais auparavant tous les fichiers Drupal, de sorte que je gardais une séparation stricte entre le code que j'ai écrit (ou modifié ou pourrait modifier) ​​et le code qui pourrait être généré avec Drush ou autre.

Cela semblait être une bonne stratégie jusqu'à ce que je doive mettre à jour Drupal. J'ai réalisé que je voulais pouvoir revenir en arrière si les choses allaient mal, et quel meilleur outil à utiliser que Git pour le faire. Je me suis dit que ce serait la situation parfaite pour une branche de fonctionnalité, alors j'ai créé une drupal-7.14branche, lui ai donné la sienne .gitignorepour ignorer tous mes fichiers de code et de paramètres et faire attention aux seuls fichiers qui font partie de l'installation Drupal que je ne voudrais pas. t toucher. J'ai fait une mise à niveau à la main (télécharger, décompresser, décompresser, copier), triant les cas limites comme robots.txt et .htaccess, et écrasant le .gitignore de Drupal avec le mien. J'ai corrigé certains paramètres qui fonctionnaient avec 7.14 mais pas avec 7.15, pour récupérer d'une erreur 500, puis tout semblait parfait. J'ai renommé la succursale drupal-7.15et j'allais continuer mon chemin avec bonheur.

Jusqu'à ce que je réalise ce que j'avais fait par inadvertance: les fichiers qui n'étaient pas suivis auparavant par ma branche principale mais laissés dans le répertoire de travail étaient maintenant supprimés du répertoire de travail lorsque j'ai extrait master, car ils n'étaient plus des fichiers non suivis! Oh!

Si je fusionne la drupal-7.15branche avec master, je perdrai la séparation du code.

Il existe probablement un moyen de convertir une branche en sous-module. En supposant que c'est possible, cela pourrait être la meilleure stratégie. Je savais avant de faire cela que les sous-modules étaient la «bonne» solution, mais comme je ne me rendais pas compte de l'effet secondaire de l'utilisation de branches pour des fichiers non suivis auparavant, j'ai décidé de couper les coins ronds et de suivre cette voie. (De plus, toutes les approches que j'ai vues pour utiliser des sous-modules avec Drupal supposent que vous démarrez un nouveau projet et Drupal sera la branche principale. Il n'est pas souhaitable pour moi de faire du code de quelqu'un d'autre la branche principale, et j'avais déjà un repo avec une branche master. Il semblait que ce serait inutilement compliqué juste de faire une mise à jour.)

Il y a peut-être une autre solution à laquelle je n'ai pas pensé.

Comment puis-je m'en remettre au mieux avec le moins d'inconvénients possibles?

MISE À JOUR : Ceci est en cours de développement (dans une machine virtuelle Linux sur mon ordinateur portable) et n'est pas encore en production. Au moment où nous irons en production, je prévois de tout emballer dans des modules de fonctionnalités, mais ce n'est pas encore en place.

MISE À JOUR 2 : Les sous - modules peuvent ne pas fonctionner. Selon Pro Git , "les sous-modules vous permettent de conserver un référentiel Git en tant que sous-répertoire d'un autre référentiel Git". Drupal n'offre pas une séparation aussi agréable. Au lieu que tout le code Drupal soit dans un sous-répertoire, la relation est plus ou moins inversée, mais il n'y a toujours pas de séparation nette, car vous pouvez modifier votre .htaccess et robots.txt, donc votre code et le dépôt Drupal sont mélangés. Je recherche une solution à ce problème .

iconoclaste
la source
Votre question concerne vraiment git. Je pense que vous obtiendrez de meilleures réponses en migrant vers un site qui n'est pas spécifique à Drupal. À propos des mises à niveau: je fais toujours des mises à niveau en construisant le fichier make dans un nouveau répertoire, puis en mettant à jour le lien symbolique de l'ancien vers le nouveau répertoire public, ce qui rend les annulations de code triviales.
Letharion
2
@Letharion Je ne suis pas d'accord. Chacun passera par ce processus de mise à niveau de son site de sa version actuelle vers une nouvelle. L'utilisation de git pour mettre à niveau le noyau est assez courante, car il s'agit d'une méthode largement utilisée pour mettre à niveau les modules. Beaucoup de gens auront du mal avec ce problème comme je l'ai déjà fait. Il n'y a actuellement aucune bonne documentation sur le Web qui traite de ce problème et je pense que c'est un bon endroit pour cela.
iStryker
Juste pour clarifier, je pense qu'une question sur "Les meilleures pratiques pour mettre à jour Drupal" serait alors plus appropriée, car cette question est vraiment "Comment réparer une erreur git", qui ne me semble pas appartenir ici. N'ayez pas de sentiments forts sur le sujet, alors je vais en rester là. :)
Letharion
OK très bien. Le problème de Brandon est assez courant. Je devrais peut-être créer une nouvelle question ou réécrire celle-ci (et déplacer le reste vers une autre question). Les premiers 2-3 paragraphes sont courants. Vous créez un dépôt git de 7.x-1.0 et vous souhaitez passer à 7.x-1.1. Les fichiers problématiques sont .gitignore, .htaccess et robot.txt. Parfois, vous voulez qu'ils soient suivis parce qu'ils sont modifiés, parfois vous ne voulez pas qu'ils soient suivis parce qu'ils sont modifiés. Lors de la mise à niveau du référentiel, créez-vous une nouvelle branche de fusion ou mettez-vous simplement à jour le maître. @Letharion Suggestion?
iStryker
@Letharion: J'ai pensé à mettre ceci sur StackOverflow comme une question Git ou ici comme une question Drupal. Si je le mettais là tout le monde se plaindrait et dirait qu'il s'agit vraiment de Drupal, et je pense qu'ils auraient vraiment raison. Même si Git peut être l'outil utilisé pour réparer la situation, la direction prise dépend d'une connaissance de Drupal. Chaque utilisateur Drupal utilise Git (ou ils devraient le faire s'ils ne le font pas), mais seule une infime fraction des utilisateurs Git utilise Drupal. Les personnes qui répondent aux questions sur Git ne comprendront pas le contexte Drupal.
iconoclaste du

Réponses:

10

Il semble d'après la discussion ci-dessus que votre question ne concerne pas la correction de votre dépôt git, mais la maintenance d'un site Drupal dans git, et comment cela fonctionne avec les mises à jour principales.

Je pense que la pratique standard consiste en fait à conserver tous les fichiers dans votre référentiel, y compris le noyau Drupal. La séparation du code Drupal du code personnalisé semble être une bonne idée, mais je ne pense pas que ce soit nécessaire, et je ne vois pas quels avantages cela vous offre. Il semble également supposer que vous ne voudrez jamais patcher le cœur (ou le faire dans le cadre de votre déploiement), ce qui, bien que ce ne soit pas la meilleure pratique, est certainement quelque chose que vous voulez pouvoir faire si quelque chose se casse en production. Garder vos engagements agréables et concentrés aide également à obtenir ce type de séparation.

La solution que j'ai utilisée est de garder tout le code dans le même référentiel, de le mettre autant que possible dans les fonctionnalités ou d'autres types d'export / code / configuration, et de maintenir une liste des correctifs qui doivent être appliqués à l'extérieur du -box core et contrib.

Lorsque vous mettez à jour le core, démarrez dans votre environnement de développement:

  • Assurez-vous que le répertoire de travail est propre
  • Vider la dernière base de données ( drush sql-dump). Faites un commit avec le vidage ou enregistrez-le dans un endroit sûr.
  • Mettre à jour le noyau ( drush up drupal)
  • Validez toutes les modifications.
  • Vérifiez le fichier des correctifs. Si des correctifs doivent être appliqués, appliquez-les et effectuez un autre commit
  • Exécutez update.php si nécessaire (déjà fait si vous avez utilisé drush pour la mise à jour)
  • Testez votre site de développement. Si tout va bien, passez le code en production. Fonctionne drush updben production.
  • S'il y a un problème et que vous devez revenir en arrière, revenez ou réinitialisez votre dépôt ( git reset --hard HEAD~2devrait le faire), ou annulez les deux validations si vous souhaitez conserver l'historique. Remplacez votre base de données par le vidage.

Le vidage de la base de données est nécessaire car vous ne pouvez pas annuler les modifications apportées à la base de données par des mises à jour. Vous pouvez également effectuer la mise à jour dans une branche, auquel cas le retour signifie simplement extraire le maître. Il est légèrement déconseillé si vous travaillez sur un site de développement, car vous ne pouvez pas vraiment revenir au maître et continuer à y travailler en parallèle à cause de la base de données.

L'utilisation de ce flux de travail git-side plus simple vous permettra d'utiliser toute la puissance de git lorsque vous en avez besoin sans la complication des sous-modules, etc. Si cela ne semble pas suffisant, pourriez-vous expliquer pourquoi vous avez besoin d'une séparation supplémentaire du code?

Goron
la source
0

D'après mes commentaires ci-dessus, cette question concerne la maintenance d'un fichier de site Drupal avec git et comment cela fonctionne avec les mises à jour principales. Vous n'avez rien mentionné sur la sauvegarde et la mise à niveau de la base de données. Je vais essayer de ne rien copier de la réponse de Goron.

J'ai créé un article de blog sur ce problème Mise à niveau du noyau Drupal sur votre site Web avec Git

Méthodes alternatives

  1. Exécuter la commande Drush drush up drupal
  2. Appliquez un patch des différences entre les versions. Voir http://drupal.org/node/359234 & http://fuerstnet.de/en/drupal-upgrade-easier

Vous ne l'avez pas déclaré, mais si vous souhaitez suivre les changements entre les versions de Drupal, je le ferais en utilisant des balises au lieu de branches . Une fois que vous avez terminé votre mise à niveau engage à maître , étiquette votre code comme 7.x.

iStryker
la source
Si je comprends bien, vous proposez également que je garde tout le code principal de Drupal dans le même référentiel. Cela semble être le consensus. Je suis réticent, mais je devrai peut-être céder et le faire de cette façon.
iconoclaste du
Oui, tout dans un seul référentiel. J'ai des modules, des profils et des thèmes à l'intérieur du référentiel principal / principal qui sont leurs propres référentiels git. Je ne sais pas si c'est le meilleur moyen, mais c'est le meilleur moyen que je connaisse.
iStryker
cette solution ne fournit aucun moyen de revenir en arrière. ma raison de voter contre.
Andre Baumeier
@Serpiente: Je ne vois pas pourquoi l'absence d'un moyen de revenir en arrière devrait être une raison pour un downvote. Si c'est la meilleure approche, cela suffit. Si vous ne pensez pas que ce soit la meilleure approche, veuillez expliquer pourquoi.
iconoclaste
@iconoclast quelle est la question d'un système de révision si vous ne pouvez pas revenir en arrière dans votre chronologie? par exemple, pensez à une mise à jour échouée - quelle serait la façon de récupérer ici? Une version livrée du logiciel "quel que soit" devrait avoir des dépendances claires, notamment le noyau du framework. Sinon, vous pouvez simplement déposer votre git et recommencer à faire des déploiements FTP. juste mes 2 cents.
Andre Baumeier
0

J'exécute l'installation avec deux branches, tout comme l'OP: une branche avec mon code personnalisé uniquement, et une branche qui contient à la fois mes fichiers personnalisés et principaux. J'ai rencontré la même situation: les fichiers de base ignorés sont supprimés lors du basculement entre les branches.

J'ai fini par avoir deux répertoires git identiques: - un pour travailler sur mon code personnalisé, avec les fichiers core présents mais ignorés, et je ne basculerais jamais vers la branche "full" dans ce répertoire - un pour effectuer des fusions, de sorte que je effectuer le changement de branche et la fusion dans ce répertoire uniquement.

La raison pour laquelle j'ai choisi cette configuration à deux branches est parce que je veux suivre facilement toutes les validations locales dans les fichiers core, il est plus facile d'examiner et de réappliquer les mods core lors de la mise à niveau des fichiers core.

sillyxone
la source