Comment mettre à jour des sites Web en direct avec des modifications de code?


21

Je sais que c'est une question très fondamentale. Si quelqu'un pouvait m'humourer et me dire comment il allait gérer ça, je serais reconnaissant.

J'ai décidé de poster ceci parce que je suis sur le point d'installer SynchToy pour remédier au problème ci-dessous, et je me sens un peu peu professionnel en utilisant un "Toy" mais je ne peux pas penser à une meilleure façon.

Plusieurs fois, je trouve que lorsque je suis dans cette situation, il me manque une manière douloureusement évidente de faire les choses - cela vient du fait d'être le seul développeur de l'entreprise.

  • Application web ASP.NET développée sur mon ordinateur au travail
  • La solution a 2 projets:
    • Site Web (fichiers)
    • WebsiteLib (C # / dll)
  • Utiliser un référentiel Git
  • Déployé sur un serveur Web GoGrid 2008R2

Déploiement:

  1. Apportez des modifications au code.
  2. Poussez vers Git.
  3. Bureau à distance au serveur.
  4. Tirez de Git.
  5. Remplacez les fichiers en direct par glisser / déposer avec l'explorateur Windows.

À l'étape 5, je supprime tous les fichiers de la racine du site Web .. cela ne peut pas être une bonne chose à faire. C'est pourquoi je suis sur le point d'installer SynchToy ...

MISE À JOUR: MERCI pour toutes les réponses utiles. Je ne peux pas choisir laquelle répondre - entre l'utilisation d'un déploiement Web - il semble que j'ai plusieurs suggestions utiles:

  1. Projet Web = site entier emballé dans une seule DLL - inconvénient pour moi, je ne peux pas pousser les mises à jour simples - étant un développeur seul dans une entreprise de 50, cela reste quelque chose de plus simple parfois.
  2. Passer directement de SCM à la racine Web du site - je ne l'ai pas fait à l'origine de peur que mon répertoire caché SCM finisse par être exposé, mais les réponses ici m'ont aidé à surmonter cela (bien que je n'aime toujours pas en avoir un) plus de soucis d’oublier de s’assurer que cela est toujours vrai au fil du temps)
  3. Utiliser une batterie de serveurs Web et déployer systématiquement sur des nœuds - c'est la solution idéale pour zéro temps d'arrêt, qui est en fait quelque chose qui m'importe car le site est essentiellement une source de revenus en temps réel pour mon entreprise - je pourrais avoir du mal à les convaincre de doubler le coût des serveurs.

-> enfin, le renforcement du principe de base selon lequel il doit y avoir un déploiement en un seul clic pour le site OU AILLEURS IL Y A QUELQUE CHOSE DE MAL est probablement la chose la plus utile que j'ai tirée des réponses.

MISE À JOUR 2: Je pensais y revenir et mettre à jour la solution réelle qui est en place depuis plusieurs mois maintenant et qui fonctionne parfaitement (pour ma solution de serveur Web unique).

Le processus que j'utilise est:

  1. Apportez des modifications au code
  2. Push to Git
  3. Bureau à distance au serveur
  4. Tirer de Git
  5. Exécutez le script de commandes suivant:

    cd C: \ Users \ Administrateur

    % systemroot% \ system32 \ inetsrv \ appcmd.exe site d'arrêt "/site.name:Default Web Site"

    robocopy Documents \ code \ da \ 1 \ work \ Tree \ LendingTreeWebSite1 c: \ inetpub \ wwwroot / E / XF connectionsconfig Web.config

    % systemroot% \ system32 \ inetsrv \ appcmd.exe site de démarrage "/site.name:Default Web Site"

Comme vous pouvez le voir, cela réduit le site, utilise robocopy pour copier intelligemment les fichiers qui ont été modifiés, puis fait remonter le site. Il s'exécute généralement en moins de 2 secondes. Étant donné que le trafic de pointe sur ce site est d'environ 2 demandes par seconde, il manque 4 demandes par mise à jour de site.

Depuis que je suis devenu plus compétent avec Git, j'ai trouvé que les quatre premières étapes ci-dessus étant un "processus manuel" sont également acceptables, bien que je suis sûr que je pourrais rouler le tout en un seul clic si je le voulais.

La documentation d'AppCmd.exe est ici . La documentation de Robocopy est ici .


6
Mieux adapté aux défauts de serveur.
Karl Bielefeldt

Vous devriez envisager SSHing dans votre serveur au lieu d'utiliser un bureau distant, de cette façon, vous pouvez scripter un déploiement si vous le souhaitez.
Malfist

5
Je pense que cette question est très bien de rester ici. Le déploiement d'un site Web me semble être une préoccupation de développeur plus qu'un travail d'administrateur système, même si je suppose que cela peut varier selon l'entreprise. Pourtant, toutes les réponses sont axées sur les développeurs.
Adam Lear

1
@Malfist - comment exactement on ssh dans un serveur Windows?
Wyatt Barnett

@Wyatt En exécutant un serveur SSH sur la machine distante, (presque le même) que vous le feriez sur une machine Linux.
Adam Lear

Réponses:


3

Vous devriez vérifier le déploiement Web de VS 2010. Si GoGrid le prend en charge, le package de déploiement Web est une bonne solution.

http://weblogs.asp.net/scottgu/archive/2010/07/29/vs-2010-web-deployment.aspx


lorsque vous utilisez le déploiement Web, vous perdez l'option de correctif, non? Je sais qu'il y a beaucoup de gens qui ne veulent pas faire quelque chose d'aussi hors du processus formel mais j'aime avoir la possibilité pour les urgences ...
Aaron Anodide

Vous faites, bon point. Je sais que dans mon entreprise, nous ne voulons pas que les gens fassent cela, car nous ne pouvons pas suivre les changements. Pour les sites personnels, j'aime vraiment vraiment avoir cette option.
Nate

3

Chez mon ancien employeur, pour déployer les modifications de code, nous avions défini l' équilibreur de chargepour arrêter le service à un serveur Web. L'expiration des sessions sur le premier serveur Web peut prendre 20 minutes. Nous mettons à jour le code sur ce serveur Web en décompressant le fichier zip de déploiement, puis vérifions que les choses fonctionnent bien en tapant l'adresse IP directe de ce premier serveur Web. Lorsque nous sommes convaincus que cela fonctionne bien, nous avons alors défini l'équilibreur de charge pour frapper le serveur Web maintenant mis à jour et attendre que les sessions expirent sur un autre serveur, puis mettre à jour celui-ci (et ainsi de suite jusqu'à ce qu'ils soient tous mis à jour). Après avoir vérifié, nous avions configuré l'équilibreur de charge pour qu'il fasse son travail. Cela s'est compliqué lorsque nous avions jusqu'à 10 serveurs Web connectés à l'équilibreur de charge pendant les chargements saisonniers de pointe (donc les mettre à jour un par un pouvait prendre des heures car nous ne pouvions pas fermer le site Web en direct - les clients devaient pouvoir obtenir sur le site).

Dans ASP.NET, si vous déposez un fichier nommé App_Offline.htmdans le répertoire racine d'un site Web, ce site Web se décharge, ce qui vous permettra de mettre à jour le DLLS (et autre). IIS affichera une page intitulée "Application hors ligne". Lorsque le fichier est supprimé, renommé ou supprimé, l'application Web redémarre et IIS fournit des pages Web à ce site Web. C'est ce que fait Visual Studio lorsque vous publiez un site Web depuis VS.


2

En règle générale, je garde tout dans un référentiel SVN. Lorsque j'en ai terminé avec quelques modifications, je m'engage sur le site de développement, puis je vérifie la production. Garde tout synchronisé, c'est rapide et facile. Si la vérification est trop compliquée, vous pouvez configurer Apache avec WebDAV et il le fera pour vous.


vous inquiétez-vous des choses comme le répertoire .svn présenter votre site en direct?
Aaron Anodide

Pas vraiment, apache est généralement configuré pour refuser l'accès à ces dossiers.
Malfist

IIS refuse également .svn (ou .git ou .hg) par défaut.
Wyatt Barnett

Si un utilisateur malveillant accède au répertoire, il / elle aura accès à tout le code en clair.
oleksii

5
Si un utilisateur malveillant accède à votre système de fichiers, vous avez plus de soucis.
Malfist

2

Pour chacune de mes applications Web, j'ai une configuration de référentiel git avec trois branches. Live, Beta, Fonctionnalités. Live est bien sûr le site live. La bêta est le site utilisé pour corriger les bogues ou pour tester les fonctionnalités finales juste avant la mise en œuvre. Ensuite, comme vous l'avez dit, je fais un simple git push, git pull on live pour extraire les informations. Les fonctionnalités sont utilisées pour les améliorations de la "prochaine version".


La même chose fonctionne avec presque tous les systèmes de contrôle de source.
deadalnix

2

Vous essayez de résoudre le problème de la livraison continue . Au début, vous commenciez par des étapes manuelles, mais bientôt vous vous rendrez compte des problèmes. Ce sont les plus courants:

  1. Le code fonctionne sur votre PC, ne fonctionne pas sur la production
  2. Un nouveau changement brise l'ancien code
  3. Les changements incrémentiels rendront le déploiement de plus en plus difficile, vous obtiendrez de nouvelles bibliothèques à attacher, des correctifs à appliquer, etc.

Jetez un œil à TeamCity (ou à tout autre outil similaire).


2

Utiliser un script de construction et de déploiement automatisé

La meilleure façon de le faire est d'utiliser un script de construction et de déploiement automatisé tel que MsBuild ou Nant.

La raison en est que vous pouvez simplement taper 1 commande pour déployer un site Web, puis simplement taper 1 commande pour le restaurer. Et si vous êtes suffisamment approfondi, cela comprendra les migrations de votre schéma de base de données. (Migrator.Net)

L'une des principales raisons de ne pas utiliser SVN ou GIT pour déployer est que l'environnement peut changer entre la production et le transfert. Dans votre script NANT, vous pouvez lui demander de créer vos fichiers .config spécifiquement pour l'environnement que vous ciblez. Cela évite d'oublier d'entrer un paramètre de configuration en production.

Il automatise également l'ensemble du processus afin qu'il devienne une affaire à commande unique, et n'importe quel nombre de processus manuels devient 1 processus simple.


1

Tout d'abord, vous devez utiliser un projet Web. Quelles sont les différences que vous demandez?

Un projet Web combinera tous les fichiers de classe C # (code derrière inclus) en une seule DLL (meilleure pour la sécurité, et le fait que ce soit un fichier à déplacer)

Deuxièmement, vous devez publier l'application et ensuite vous pouvez toujours le bureau à distance, faites glisser tous les fichiers dans votre dossier de publication et définissez-le simplement pour écraser (les nouveaux fichiers remplaceront les anciens fichiers).

La publication mettra tous les fichiers nécessaires à l'application dans un dossier.


1

Mon employeur actuel se déploie à l'aide de marionnettes . (Voici d' autres progiciels qui répondent au même problème.)

Mon ancien employeur utilisait un système de contrôle des tâches personnalisé pour gérer le déploiement de logiciels, le redémarrage, etc. Même s'il était disponible, c'était bien trop pour vos besoins.

L'employeur que j'avais auparavant avait des scripts personnalisés pour copier les données de subversion vers les serveurs et faire un redémarrage continu.

Plusieurs endroits que j'ai vus auparavant avaient créé des fichiers pour gérer le déploiement. Ils ont généralement utilisé une stratégie comme couper la moitié des serveurs Web de l'équilibreur de charge, attendre, arrêter cette moitié, déployer le code, les redémarrer, puis inverser l'équilibreur de charge, attendre, arrêter l'autre moitié, les redémarrer, puis ramener l'équilibreur de charge vers le haut.

Dans tous les endroits où j'ai travaillé, le déploiement de code était soit une commande unique, soit l'absence de commande unique a été reconnue comme un problème à résoudre.


1

Généralement, ce que nous utilisons pour résoudre ce problème avec nos sites Web est un outil inclus avec Systems Internals appelé junction.

En utilisant cet outil, nous pouvons créer des liens d'un répertoire à un autre. La racine de l'application sur le serveur contient 3 dossiers. Rouge, bleu, courant. IIS est configuré pour toujours regarder Current pour ses fichiers.

Vous pouvez lancer une commande junction currentqui vous indiquera le dossier actuellement pointé. Disons par exemple qu'il pointe actuellement sur Blue. Ce que nous ferions serait de mettre les fichiers en file d'attente en rouge pour le nouveau déploiement et de nous assurer que toute la configuration était prête à démarrer.

Une fois que nous sommes prêts, nous pouvons lancer la commande junction current redpour la rediriger.

Il y a deux choses qui rendent cette solution si géniale

1) Vous avez tout le temps du monde pour mettre vos modifications en file d'attente dans le dossier. Pas de précipitation et le seul temps d'arrêt est lorsque le pool d'applications tourne. (Il existe également un moyen de pré-compiler cette étape.)

2) Si quelque chose ne va pas avec votre déploiement, tout ce que vous avez à faire pour revenir en arrière est d'émettre une commande au lieu d'essayer d'annuler les modifications. La commande dans notre cas seraitjunction current blue

J'espère que notre façon de faire peut vous éclairer sur une nouvelle solution pour vous.


0

Ce que j'ai fait et je ne sais pas si vous avez la possibilité de le faire, mais voilà. Un développeur vérifierait le code dans une branche QA, il serait ensuite chargé dans un environnement QA par un ingénieur système, une fois qu'il aura passé le QA, il serait promu dans la branche de production. Il y avait au moins 2 de chaque site connecté à un serveur sur un équilibreur de charge, et dans ce cas, l'un des deux serveurs serait mis hors ligne iis serait arrêté le site serait archivé et le nouveau site serait déployé avec toutes les modifications iis requises iis seraient alors redémarrées et vous passeriez ensuite au serveur suivant. Tout cela a été scripté en utilisant C # dans notre cas, mais cela a été fait dans le passé en utilisant le script vb. J'espère que ça aide. À votre santé

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.