Question:
Est-ce que l'utilisation de Git pour déployer une mauvaise pratique?
Septagram
2013-11-14 13:37:19 UTC
view on stackexchange narkive permalink

J'ai tendance à utiliser Git pour déployer du code de production sur le serveur Web. Cela signifie généralement que quelque part un référentiel Git maître est hébergé dans un endroit accessible via ssh , et le serveur de production sert ce référentiel cloné, tout en limitant l'accès à .git / et .gitignore . Lorsque j'ai besoin de le mettre à jour, je tire simplement vers le référentiel du serveur à partir du référentiel maître. Cela présente plusieurs avantages:

  1. Si quelque chose ne va pas, il est extrêmement facile de revenir à une révision antérieure - aussi simple que de la vérifier.
  2. Si l'une des sources les fichiers de code sont modifiés, en vérifiant aussi facilement que git status , et si le référentiel du serveur a été modifié, cela deviendra évident la prochaine fois que j'essaierai de tirer.
  3. Il signifie qu'il existe une copie supplémentaire du code source, au cas où de mauvaises choses se produiraient.
  4. La mise à jour et la restauration sont faciles et très rapides.

Cela pourrait en avoir quelques problèmes cependant:

  • Si pour une raison quelconque le serveur Web décide qu'il doit servir le répertoire .git / , tout le code source qui existait et est devenu lisible pour tout le monde . Historiquement, certaines (grandes) entreprises ont commis cette erreur. J'utilise le fichier .htaccess pour restreindre l'accès, donc je ne pense pas qu'il y ait de danger pour le moment. Peut-être qu'un test d'intégration s'assurant que personne ne peut lire le dossier .git / est en ordre?

  • Tous ceux qui obtiennent accidentellement un accès en lecture au dossier y gagnent également accès à toutes les révisions passées du code source qui existaient auparavant. Mais cela ne devrait pas être bien pire que d'avoir accès à la version actuelle. Après tout, ces révisions sont obsolètes par définition.

Cela dit, je pense que l'utilisation de Git pour déployer du code en production est raisonnablement sûre et bien plus facile que rsync , ftp , ou simplement en le copiant. Que pensez-vous?

La pratique standard ne voudrait-elle pas que votre référentiel git existe à un niveau supérieur à partir de votre dossier htdoc afin de ne pas le servir accidentellement?
C'est une bonne suggestion, et je fais juste cela pour un dernier projet personnel. Mais sur un autre projet, le référentiel de mes clients est organisé différemment (htdoc étant à la racine du référentiel), donc la question s'applique toujours.
Comment vous assurer que les modifications apportées après le déploiement pour le test ne seront pas déployées en production?
Jusqu'à présent, je n'ai pas eu la chance de travailler dans une équipe avec un serveur de test dédié et un contrôle qualité (probablement mauvais). Je teste minutieusement sur la machine de développement et ne déploie de nouvelles fonctionnalités que dans des itérations spécifiques. Ensuite, si des corrections de bogues sont nécessaires jusqu'à la prochaine itération, elles sont effectuées sur une branche distincte. Par exemple, la version 0.6 est publiée, le travail a commencé sur 0.7. Le bogue est trouvé sur la version 0.6, le correctif est appliqué dans une branche 0.6 et fusionné dans une branche maître. La production tire alors la branche 0.6. Et jusqu'à ce que 0.7 soit publié, tous les correctifs vont d'abord dans la branche 0.6. Parfois (pas toujours) je crée une branche distincte pour la version de production à l'avance
Dans un environnement d'entreprise traditionnel, cette pratique serait traitée avec mépris. Pourtant, comme vous le dites, il y a peu de problèmes techniques. En fait, l'approche plus générale consistant à se déployer rapidement et souvent gagne du terrain. Il a même son propre mot à la mode: déploiement continu
Est-ce * vraiment * une question de sécurité?
Vous pouvez toujours utiliser une suite de gestionnaire de packages comme Gradle, Maven, Etc pour déployer vos fichiers dans le dossier HTDOCS afin d'ignorer spécifiquement ./git, etc. Mettez à jour votre GIT sur le serveur dans un dossier séparé, puis exécutez votre PM pour le déployerau bon endroit.C'est pourquoi ils existent.
Je suis surpris que le problème de sécurité qui vous préoccupe soit le dossier .git, alors que j'aurais en fait plus peur qu'un tel processus signifie que vos informations d'identification git sont stockées sur le serveur Web et donc, s'il y a une faille dans votre site Web,alors tout le monde peut accéder au dépôt Git (espérons que ces informations d'identification sont en lecture seule)
Sept réponses:
user10211
2013-11-14 18:21:13 UTC
view on stackexchange narkive permalink

J'irais jusqu'à envisager d'utiliser git pour le déploiement très bonne pratique .

Les deux problèmes que vous avez énumérés ont très peu à voir avec l'utilisation de git pour le déploiement lui-même. Remplacez .git / par le fichier de configuration contenant les mots de passe de la base de données et vous rencontrez le même problème. Si j'ai un accès en lecture à votre racine Web, j'ai un accès en lecture à tout ce qui y est contenu. Il s'agit d'un problème de renforcement du serveur dont vous devez discuter avec l'administration de votre système.

git offre des avantages très intéressants en matière de sécurité.

  1. Vous pouvez appliquer un système pour le déploiement en production. Je configurerais même un hook post-receive pour se déployer automatiquement en production chaque fois qu'un commit vers master est effectué. Je suppose bien sûr un workflow similaire à git flow.

  2. git rend extrêmement facile la restauration du code déployé en production vers une version précédente si un problème de sécurité est soulevé. Cela peut être utile pour bloquer l'accès aux failles de sécurité critiques que vous avez besoin de temps pour corriger correctement.

  3. Vous pouvez appliquer un système dans lequel vos développeurs doivent signer les commits qu'ils font. Cela peut aider à localiser qui a déployé quoi en production si une faille de sécurité délibérée est détectée.

Bonne réponse, j'ai vraiment hâte d'utiliser git dans mes serveurs de production! Cependant, je suis réticent à utiliser le push automatique comme vous (et plusieurs autres que j'ai lus) suggéré. Le push automatique peut changer votre serveur de production lorsque vous ne le souhaitez pas et vous pouvez accidentellement laisser votre serveur hors ligne. Peut-être que je manque quelque chose et que les choses sont trop compliquées, mais je préfère l'approche paranoïque de ssh'ing dans le serveur de production, faire un `git fetch origin master`, puis` git diff master origin / master`. Ce n'est qu'alors que je ferais `git merge origin / master --ff-only`. Avez-vous des idées à ce sujet?
@pedromanoel Je souscris à l'école de pensée où tout ce que vous voulez maîtriser doit être prêt pour la production, donc cela ne devrait pas vraiment être un problème. Ce que vous suggérez fonctionne également.
Notre branche principale s'engage à déployer sur le serveur Web de développement. Nous avons une branche QA, Staging et Production qui correspondent à leurs environnements respectifs. Lorsque nous voulons lancer la production, nous devons simplement fusionner le code testé dans la branche de production. Cela a bien fonctionné pour nous. Nous utilisons KUDU pour cela. Je ne sais pas quels autres outils sont disponibles.
@TerryChia Pouvez-vous suggérer des didacticiels / outils pour configurer vos hooks post-réception pour les déploiements automatiques? Nous utilisons Kudu mais j'ai trouvé qu'il était difficile de configurer pour des sites non sûrs (nous avons nos propres serveurs IIS sur site).
Matt Surabian
2013-11-19 19:27:38 UTC
view on stackexchange narkive permalink

Il n'y a rien de mal à déployer à partir d'un dépôt git, en fait c'est une pratique assez courante et, comme vous le dites, beaucoup moins sujette aux erreurs que de copier des fichiers via ftp ou rsync.

Compte tenu des informations que vous avez fournies, je noterais les points suivants:

  • Ne vous contentez pas d'extraire le dernier master. La production doit être déployée à partir d'une étiquette de version. Utilisez git flow ou similaire pour obtenir un peu plus de processus autour du déploiement du code et de la création des balises. Parce que les balises sont une référence immuable à votre code à un moment donné, c'est plus stable que de pointer vers une branche maître qui pourrait être mise à jour par un commit errant.

  • Quant au service du. git, cela ne devrait pas être un gros problème. Redirigez simplement tout ce qui a pour préfixe .git vers un 404 en .htaccess.

  • Votre authentification git doit être basée sur une clé ssh, donc aucun mot de passe de dépôt ne doit être stocké sur le serveur.

Hourra pour les workflows de déploiement git!

siliconrockstar
2018-08-24 21:29:13 UTC
view on stackexchange narkive permalink

Je ne suis pas d'accord avec l'opinion populaire ici. Git est pour le contrôle de version, ce n'est pas pour le déploiement / CI.

Les méthodes que les gens préconisent ici sont bien pour les petits projets, mais en général, ne s'adaptent pas très bien.

... ce qui ne veut pas dire que vous ne devriez pas continuer à faire ce que vous faites. Gardez simplement à l'esprit, au fur et à mesure que votre carrière progresse, que les projets sur lesquels vous travaillez dépasseront probablement un flux de travail de déploiement purement basé sur git.

Le principal changement de paradigme est d'arrêter de penser au déploiement de branches, et Commencez à penser au déploiement des résultats de compilation et à l'injection de dépendances d'environnement pour découpler votre infrastructure de votre stratégie de branchement.

Par exemple, pour utiliser le paradigme ci-dessus concernant le «déploiement de fichiers» et la restauration. Si vous étiez déployer des fichiers, vous pourriez conserver plusieurs versions de l'application sur le serveur de production, et si vous avez besoin de revenir en arrière, vous pouvez faire pointer votre serveur Web vers une version plus ancienne en recentrant la racine Web. Deux commandes shell, des microsecondes de temps d'arrêt, moins de marge d'erreur que l'utilisation de git.

Un autre exemple - vous avez le workflow maître standard dev branch> staging branch> master, avec un serveur pour chacun. Vous avez des éléments prêts à être utilisés en développement, mais d'autres éléments sur la préparation ont échoué au contrôle qualité. Vous devez donc effectuer des opérations horribles - supprimer les mauvais commits de la scène, redéployer l'étape, et également supprimer ou corriger les mauvais commits en développement, et espérer que le développement et la mise en scène ne se désynchroniseront pas.

Au lieu de cela, que se passe-t-il si vous coupez une branche de version hors maître, fusionnez les éléments qui sont prêts à entrer dans cette branche de publication et générez le résultat, créez un serveur de test sur AWS et y déployez le résultat, exécutez votre contrôle qualité et tests par rapport à ce serveur intermédiaire temporaire, puis a poussé ce même résultat vers le cluster de production et l'a déployé? Ensuite, désactivez la boîte de transfert temporaire que vous avez créée, fusionnez la version dans le maître et balisez le maître avec un numéro de version.

Ce sont évidemment des exemples extrêmes. Habituellement, ce n'est pas si propre, même si nous voulons que ce soit le cas - vous devez probablement exécuter certains processus de construction dans l'environnement cible, car vous devez apporter des modifications à la base de données. Et si vous avez des mods de base de données non idempotents entre les versions, eh bien, la restauration ne sera pas aussi simple quelle que soit la méthode que vous utilisez, car vous devrez restaurer la base de données (en général, essayez de déployer une base de données idempotente modifications, puis supprimez les bits de base de données obsolètes dans une version ultérieure, une fois que vous êtes sûr qu'ils ne sont plus dans le flux de l'application.

Quoi qu'il en soit, je suppose que je veux en venir, c'est ma réponse à 'Est-ce que l'utilisation de git pour le déploiement est une mauvaise pratique?' est, d'une manière générale, «Oui», de la même manière que l'utilisation de roues d'entraînement est mauvaise pour le vélo. C'est une amélioration par rapport au fait de se casser le cul sur le béton à plusieurs reprises, mais j'espère que vous le dépasserez éventuellement.

Je serais également d’accord avec cela.Je ne pense pas nécessairement que ce soit mauvais, mais il y a d'autres sujets de préoccupation. 1. Il met * tout * en production 2. `git checkout` n'est pas transactionnel.Cela signifie que pendant le déploiement, votre système peut être dans un état incohérent lorsque des fichiers individuels sont écrits Comme l'a noté @siliconrockstar, git est un système SCM, pas un système de déploiement.Ils résolvent deux problèmes différents.
@siliconrickstar avez-vous d'autres lectures ou ressources à ce sujet?J'ai déjà utilisé ce processus, mais j'aimerais voir quelques guides de bonnes pratiques.Exemple, en utilisant Gitlab, votre pipeline CI regrouperait-il l'application _entire_ dans un zip et la rsynchroniserait-elle en production?Dépendances et tout (comme le fournisseur, node_modules, etc.) ou seraient-ils résolus sur le serveur (je suppose que le premier, car vous avez alors un instantané _entire_ de l'application dans un répertoire, et le serveur prod ne fait aucun "travail"sauf un échange de lien symbolique)
@Chris J'aurais aimé avoir des ressources «faisant autorité» pour vous, mais les détails réels varient considérablement en fonction du projet et de la pile.Je travaille principalement avec Magento ces jours-ci et même leur flux de déploiement `` officiel '' en utilisant Magento Cloud fait quelques choses étranges qui ne sont probablement pas les meilleures pratiques (le couplage des branches et des environnements vient immédiatement à l'esprit).Dans Magentoland, en ce qui concerne les dépendances, Magento actuel utilise composer et npm, et l'OMI il est généralement prudent de laisser ces outils faire leur travail sur la ou les cibles de déploiement, au lieu de copier tout le fournisseur / chaque déploiement.
Cool cool, merci @siliconrockstar!
Brendon
2013-11-21 00:56:15 UTC
view on stackexchange narkive permalink

Vous pouvez utiliser l'argument --separate-git-dir = <git dir> lors de l'appel de git clone. Cela placera un lien symbolique dans le répertoire .git (symbolique pour Git, je ne pense pas que ce soit un lien symbolique vers votre système d'exploitation), et vous pouvez spécifier le <git dir> quelque part en dehors de la racine du document.

russdot
2016-03-29 20:02:23 UTC
view on stackexchange narkive permalink

Une autre approche que j'ai adoptée auparavant est quelque chose de similaire au commentaire de Terry Chia concernant les hooks post-receive.

Git a un certain nombre de hooks qui peuvent être utilisés pour effectuer toutes sortes de tâches avant / pendant / après plusieurs actions différentes.

Créez un référentiel nu ailleurs que dans votre dossier Web. Le dépôt nu peut ensuite être utilisé comme à distance pour pousser vers, et un hook post-réception peut être déclenché pour extraire le nouveau code dans un répertoire spécifié.

Cette approche a quelques avantages: L'emplacement de déploiement agit comme une rue «à sens unique» où le code doit passer par le contrôle de code source pour se retrouver en production. Vous pouvez déployer différentes branches / versions vers différents emplacements (tous à partir du même dépôt nu). Il fournit également un moyen simple et agréable de revenir en arrière à l'aide de git checkout standard.Cependant, une mise en garde / conséquence est que les changements de code sur le serveur ne seront pas reflétés dans git (les dépôts nus n'ont pas de répertoires de travail) donc vous auriez pour exécuter manuellement git --work-tree = / path / to / code status pour voir les changements (mais vous ne devriez pas changer le code de production de toute façon, non?)

Je ne pense pas que vous ayez besoin de ce paragraphe d'introduction.Il tente seulement de signaler votre message pour suppression.Mieux vaut travailler sur une bonne réponse.
En tant que lecteur, lorsque je vois des réponses de type «censé être un commentaire», je les écarte normalement comme inutiles et je ne les lis pas.Vous avez du contenu utile dans cet article.Je construirais là-dessus.Lavez, rincez et répétez jusqu'à ce que vous ayez suffisamment de réputation pour laisser des commentaires.
Merci pour les commentaires!J'ai supprimé la première phrase et élargi ma réponse.Cela a fini par être trop long pour un commentaire de toute façon.
Thibault
2016-09-16 18:04:23 UTC
view on stackexchange narkive permalink

Je suis d'accord avec Terry Chia pour dire que c'est une très bonne pratique. Il garantit:

  • que la révision en place est la bonne,
  • avec tous les fichiers nécessaires et vérifie l'exhaustivité de la version,
  • rendre la procédure de déploiement rapide et facile

Mais, je dois ajouter qu'il y a des mises en garde que j'ai envie de partager.

Habituellement, dans un dépôt git, vous mettez:

  • code,
  • docs,
  • tests unitaires,
  • scripts de déploiement,
  • outils d'intégration,
  • .deb archives,
  • patchs sql
  • ou des trucs comme ça, et peut-être un tas d'autres trucs

Eh bien, en production, vous voulez juste le code!

Parce que les documents, les tests unitaires, les outils ou les archives .deb peuvent prendre beaucoup d'espace disque et n'ont rien à voir en production .

Avec Subversion (avant la version 1.7), vous pouviez extraire uniquement le répertoire src / et vous avez tous les avantages, mais avec Subversion> 1.7 et avec Git, vous ne pouvez pas faire cela.

Une alternative serait d'utiliser des sous-modules git pour créer ce type d'archiecture: project repo | - doc | - src -> sous-module vers le repo project-src. \ tests Mais alors votre projet / tests et le code de projet-src ne seraient pas synchronisés et cela serait vraiment nul.

La solution serait alors d'utiliser "sparse checkout", voir: https://stackoverflow.com/questions/600079/how-do-i-clone-a-subdirectory-only-of-a-git-repository

Vous pouvez donc utiliser git , mais faites attention à ces inconvénients.

Je dirais que l'introduction de sous-modules \ extractions spéciales \ autres choses étranges devrait être examinée très attentivement avant de prendre des décisions.Habituellement, vos "autres trucs" ne sont pas si gros que cela pourrait être un problème.Beaucoup mieux lorsque le développeur peut simplement cloner tout le dépôt et commencer instantanément à travailler dessus sans faire de danses magiques en configurant tout. P.S.Et bien sûr, vous ne devriez pas du tout stocker des objets blob binaires dans votre dépôt.
Zamicol
2014-11-15 04:18:37 UTC
view on stackexchange narkive permalink

Voici le script que j'utilise pour créer git to push to prod.

https://gist.github.com/Zamicol/f160d05dd22c9eb25031

Cela suppose que tout ce qui est poussé vers la branche master est prêt pour la production. Toutes les autres branches poussées sont ignorées. Vous pouvez modifier ce script de hook en fonction de vos besoins.

En ce qui vous concerne, je place mon répertoire git sous / var / git et mes fichiers de production ailleurs (comme / var / www) et restreint l'accès à ces répertoires.

Vous pouvez également avoir votre dépôt git sur un serveur distinct de votre serveur de production, puis utiliser quelque chose comme scp et ssh dans le script ci-dessus pour déplacer vos fichiers du serveur git vers le serveur de production. Cela vous permettrait de continuer à utiliser git pour pousser à produire tout en gardant votre code séparé de votre production.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...