Wie können Sie Live-Websites mit Codeänderungen aktualisieren?


21

Ich weiß, dass dies eine sehr grundlegende Frage ist. Wenn jemand mich belustigen und mir sagen könnte, wie er damit umgehen würde, wäre ich sehr dankbar.

Ich habe mich dazu entschlossen, dies zu posten, da ich SynchToy installieren werde, um das unten stehende Problem zu beheben. Ich fühle mich etwas unprofessionell, wenn ich ein "Spielzeug" verwende, aber ich kann mir keinen besseren Weg vorstellen.

Wenn ich mich in einer solchen Situation befinde, fehlt mir oft eine schmerzlich offensichtliche Methode, um Dinge zu erledigen - das liegt daran, dass ich der einzige Entwickler im Unternehmen bin.

  • ASP.NET-Webanwendung, die auf meinem Computer bei der Arbeit entwickelt wurde
  • Lösung hat 2 Projekte:
    • Website (Dateien)
    • WebsiteLib (C # / dll)
  • Verwenden eines Git-Repository
  • Bereitgestellt auf einem GoGrid 2008R2-Webserver

Einsatz:

  1. Nehmen Sie Codeänderungen vor.
  2. Push to Git.
  3. Remote Desktop zum Server.
  4. Zieh von Git.
  5. Überschreiben Sie die Live-Dateien per Drag & Drop mit dem Windows Explorer.

In Schritt 5 lösche ich alle Dateien aus dem Stammverzeichnis der Website. Dies kann keine gute Sache sein. Deshalb werde ich SynchToy installieren ...

UPDATE: DANKE für alle nützlichen Antworten. Ich kann nicht auswählen, welche Antwort als Antwort markiert werden soll - zwischen der Verwendung einer Webbereitstellung - es sieht so aus, als hätte ich mehrere nützliche Vorschläge:

  1. Web Project = ganze Site in einer einzigen DLL zusammengefasst - Nachteil für mich ist, dass ich keine einfachen Aktualisierungen vornehmen kann. Als Einzelentwickler in einem Unternehmen mit 50 Mitarbeitern ist dies manchmal einfacher.
  2. Direkt von SCM in das Stammverzeichnis der Website gezogen - ich habe dies ursprünglich nicht aus der Angst heraus getan, dass mein verstecktes SCM-Verzeichnis entlarvt wird, aber die Antworten hier haben mir geholfen, darüber hinwegzukommen (obwohl ich immer noch nicht gerne eines habe) noch etwas zu vergessen, um sicherzustellen, dass es im Laufe der Zeit immer noch wahr ist)
  3. Die Verwendung einer Webfarm und die systematische Bereitstellung auf Knoten - dies ist die ideale Lösung für Ausfallzeiten ohne Ausfallzeiten. Dies ist mir wichtig, da die Site im Wesentlichen eine Echtzeit-Einnahmequelle für mein Unternehmen darstellt. Ich kann sie nur schwer davon überzeugen Verdoppeln Sie jedoch die Kosten für die Server.

-> Schließlich ist die Durchsetzung des Grundsatzes, dass es für die Site eine Bereitstellung mit nur einem Klick geben muss, wahrscheinlich das Nützlichste, was ich aus den Antworten herausbekommen habe.

UPDATE 2: Ich dachte, ich komme darauf zurück und aktualisiere mit der tatsächlichen Lösung, die seit vielen Monaten besteht und perfekt funktioniert (für meine einzelne Webserver-Lösung).

Der Prozess, den ich benutze, ist:

  1. Nehmen Sie Codeänderungen vor
  2. Push to Git
  3. Remote Desktop zum Server
  4. Zieh von Git
  5. Führen Sie das folgende Stapelskript aus:

    cd C: \ Benutzer \ Administrator

    % systemroot% \ system32 \ inetsrv \ appcmd.exe stop site "/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 start site "/site.name:Default Web Site"

Wie Sie sehen, wird die Site dadurch heruntergefahren. Mithilfe von Robocopy werden die geänderten Dateien auf intelligente Weise kopiert und die Site anschließend wieder hochgefahren. Es dauert normalerweise weniger als 2 Sekunden. Da der maximale Datenverkehr auf dieser Site ungefähr 2 Anfragen pro Sekunde beträgt, sind fehlende 4 Anfragen pro Site-Aktualisierung akzeptabel.

Seitdem ich Git besser beherrsche, habe ich festgestellt, dass die ersten vier Schritte als "manueller Prozess" auch akzeptabel sind, obwohl ich mir sicher sein kann, dass ich das Ganze mit einem Klick rollen kann, wenn ich möchte.

Die Dokumentation zu AppCmd.exe finden Sie hier . Die Dokumentation für Robocopy finden Sie hier .


6
Besser geeignet für Serverfehler.
Karl Bielefeldt

Sie sollten in Betracht ziehen, SSH auf Ihrem Server zu installieren, anstatt einen Remotedesktop zu verwenden. Auf diese Weise können Sie bei Bedarf ein Skript für eine Bereitstellung erstellen.
Malfist

5
Ich denke, diese Frage ist in Ordnung, um hier zu bleiben. Das Bereitstellen einer Website scheint mir eher ein Entwicklerproblem als ein Sysadmin-Job zu sein, obwohl ich denke, dass dies von Unternehmen zu Unternehmen unterschiedlich sein kann. Trotzdem sind alle Antworten soweit entwicklerorientiert.
Adam Lear

1
@Malfist - wie genau steckt man ssh in einem Windows Server?
Wyatt Barnett

@Wyatt Durch Ausführen eines SSH-Servers auf dem Remotecomputer (fast genauso) wie auf einer Linux-Box.
Adam Lear

Antworten:


3

Sie sollten die Webbereitstellung von VS 2010 ausprobieren. Wenn GoGrid dies unterstützt, ist das Web-Bereitstellungspaket eine gute Lösung.

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


Wenn Sie die Webbereitstellung verwenden, verlieren Sie die Option zum Hotfix. Ich weiß, dass es viele Leute gibt, die etwas außerhalb des formalen Prozesses nicht tun wollen, aber ich mag die Option für Notfälle ...
Aaron Anodide

Das tust du, guter Punkt. Ich weiß, dass wir in meiner Firma nicht wollen, dass die Leute das tun, weil wir Änderungen nicht verfolgen können. Für persönliche Websites mag ich diese Option allerdings sehr.
Nate

3

Bei meinem früheren Arbeitgeber haben wir zur Bereitstellung von Codeänderungen den Lastenausgleich festgelegtum die Verbindung zu einem Webserver zu beenden. Es kann 20 Minuten dauern, bis die Sitzungen auf dem ersten Webserver abgelaufen sind. Wir aktualisieren den Code auf diesem Webserver, indem wir die ZIP-Datei für die Bereitstellung dekomprimieren. Überprüfen Sie dann, ob alles in Ordnung ist, indem Sie die direkte IP-Adresse für diesen ersten Webserver eingeben. Wenn wir davon überzeugt sind, dass es in Ordnung funktioniert, haben wir den Load Balancer so eingestellt, dass er auf den jetzt aktualisierten Webserver zugreift. Warten Sie, bis die Sitzungen auf einem anderen Server ablaufen, und aktualisieren Sie dann diesen (und so weiter, bis alle aktualisiert wurden). Nachdem sie ausgecheckt hatten, stellten wir den Load Balancer so ein, dass er seine Arbeit wieder ausführt. Dies wurde kompliziert, als wir in der Hauptsaison bis zu 10 Webserver mit dem Load Balancer verbunden hatten (so dass die Aktualisierung nacheinander Stunden dauern konnte, weil wir die Live-Website nicht herunterfahren konnten - Kunden mussten in der Lage sein, diese zu erhalten zum Ort).

Wenn Sie in ASP.NET eine Datei App_Offline.htmim Stammverzeichnis einer Website ablegen, wird diese Website entladen, sodass Sie die DLLS (und was auch immer) aktualisieren können. IIS wird eine Seite mit dem Titel "Application Offline" bereitstellen. Wenn die Datei entfernt, umbenannt oder gelöscht wird, wird die Webanwendung neu gestartet und IIS stellt Webseiten für diese Website bereit. Dies ist, was Visual Studio macht, wenn Sie eine Website aus VS heraus veröffentlichen.


2

Normalerweise behalte ich alles in einem SVN-Repository. Wenn ich mit einigen Änderungen fertig bin, begebe ich mich auf die Entwickler-Site und überprüfe dann die Produktion. Hält alles synchron, es ist schnell und einfach. Wenn das Auschecken zu mühsam ist, können Sie Apache mit WebDAV einrichten, und das erledigt es für Sie.


Machst du dir Sorgen, dass Dinge wie das .svn-Verzeichnis deine Live-Site darstellen?
Aaron Anodide

Nicht wirklich, Apache ist normalerweise so eingerichtet, dass der Zugriff auf diese Ordner verweigert wird.
Malfist

IIS verweigert standardmäßig auch .svn (oder .git oder .hg).
Wyatt Barnett

Wenn ein böswilliger Benutzer Zugriff auf das Verzeichnis erhält, erhält er Zugriff auf den gesamten Code in einem eindeutigen Zustand.
oleksii

5
Wenn ein böswilliger Benutzer Zugriff auf Ihr Dateisystem erhält, müssen Sie sich weitere Sorgen machen.
Malfist

2

Für jede meiner Web-Apps habe ich ein Git-Repository-Setup mit drei Zweigen. Live, Beta, Funktionen. Live ist natürlich die Live-Site. Beta ist die Site, die zur Behebung von Fehlern oder zum endgültigen Testen von Funktionen unmittelbar vor der Implementierung verwendet wird. Dann, wie Sie sagten, mache ich einen einfachen Git-Push, Git-Pull-On-Live, um die Informationen einzuspielen. Features werden für Verbesserungen der "nächsten Version" verwendet.


Das gleiche funktioniert mit fast allen Quellcodeverwaltungssystemen.
Deadalnix

2

Sie versuchen, das Problem der kontinuierlichen Zustellung zu lösen . Zunächst würden Sie mit manuellen Schritten beginnen, aber bald werden Sie die Probleme erkennen. Dies sind die häufigsten:

  1. Code funktioniert auf Ihrem PC und nicht in der Produktion
  2. Neue Änderung bricht den alten Code
  3. Inkrementelle Änderungen machen die Bereitstellung immer schwieriger, Sie erhalten neue Bibliotheken zum Anhängen, Patches zum Anwenden usw.

Schauen Sie sich TeamCity (oder ein ähnliches Tool) an.


2

Verwenden Sie ein automatisiertes Erstellungs- und Bereitstellungsskript

Der beste Weg, dies zu tun, ist die Verwendung eines automatisierten Erstellungs- und Bereitstellungsskripts wie MsBuild oder Nant.

Der Grund dafür ist, dass Sie einfach 1 Befehl eingeben können, um eine Website bereitzustellen, und dann einfach 1 Befehl eingeben können, um sie zurückzusetzen. Und wenn Sie gründlich genug sind, umfasst dies auch die Migrationen Ihres Datenbankschemas. (Migrator.Net)

Einer der Hauptgründe, SVN oder GIT nicht für die Bereitstellung zu verwenden, besteht darin, dass die Umgebung zwischen Produktion und Bereitstellung wechseln kann. In Ihrem NANT-Skript können Sie Ihre .config-Dateien speziell für die Umgebung erstellen lassen, auf die Sie abzielen. Dies erspart das Vergessen, eine Konfigurationseinstellung in der Produktion einzugeben.

Es automatisiert auch den gesamten Prozess, sodass er zu einer Angelegenheit mit einem Befehl wird, und eine beliebige Anzahl manueller Prozesse wird zu einem einfachen Prozess.


1

Zunächst sollten Sie ein Webprojekt verwenden. Was sind die Unterschiede, die Sie fragen?

In einem Webprojekt werden alle C # -Klassendateien (einschließlich Code-Behinds) in einer einzigen DLL zusammengefasst (besser für die Sicherheit und die Tatsache, dass nur eine Datei verschoben werden muss).

Zweitens sollten Sie die Anwendung veröffentlichen und dann können Sie den Remotedesktop weiterhin verwenden, alle Dateien in Ihren Veröffentlichungsordner ziehen und ihn einfach auf Überschreiben einstellen (neue Dateien ersetzen alte Dateien).

Beim Veröffentlichen werden alle für die Anwendung erforderlichen Dateien in einem Ordner abgelegt.


1

Mein jetziger Arbeitgeber setzt Marionetten ein . (Hier finden Sie weitere Softwarepakete , die sich mit demselben Problem befassen.)

Mein früherer Arbeitgeber verwendete ein benutzerdefiniertes Jobkontrollsystem, um Software bereitzustellen, neu zu starten usw. Auch wenn es verfügbar war, war es viel zu viel für Ihre Bedürfnisse.

Der Arbeitgeber, den ich vorher hatte, hatte benutzerdefinierte Skripte, um Daten von Subversion auf Server zu kopieren und einen fortlaufenden Neustart durchzuführen.

Mehrere Orte, die ich zuvor gesehen habe, haben Dateien erstellt, um die Bereitstellung zu verwalten. Sie verwendeten im Allgemeinen die Strategie, die Hälfte der Webserver aus dem Load Balancer zu entfernen, zu warten, diese Hälfte anzuhalten, Code auszurollen, sie neu zu starten, dann den Load Balancer umzudrehen, zu warten, die andere Hälfte anzuhalten, sie neu zu starten und den Load Balancer zurückzubringen oben.

An allen Stellen, an denen ich gearbeitet habe, war das Ausrollen von Code entweder ein einzelner Befehl, oder das Fehlen eines einzelnen Befehls wurde als zu behebendes Problem erkannt.


1

Normalerweise verwenden wir zur Lösung dieses Problems auf unseren Websites ein Tool, das in Systems Internals enthalten ist und als Junction bezeichnet wird.

Mit diesem Tool können wir Links von einem Verzeichnis zu einem anderen erstellen. Das App-Stammverzeichnis auf dem Server enthält 3 Ordner. Rot, Blau, Strom. IIS ist so konfiguriert, dass immer auf Aktuell nach seinen Dateien gesucht wird.

Sie können einen Befehl ausgeben junction current, der angibt, auf welchen Ordner aktuell verwiesen wird. Sagen Sie zum Beispiel, dass es gerade auf Blau zeigt. Wir würden die Dateien in Rot für die neue Bereitstellung in die Warteschlange stellen und sicherstellen, dass die gesamte Konfiguration betriebsbereit ist.

Sobald wir fertig sind, können wir den Befehl absetzen junction current red, damit er den Punkt enthält.

Es gibt zwei Dinge, die diese Lösung so großartig machen

1) Sie haben die ganze Zeit auf der Welt, um Ihre Änderungen in den Ordner einzureihen. Keine Eile und die einzige Ausfallzeit ist, wenn der App-Pool hochfährt. (Es gibt auch eine Möglichkeit, diesen Schritt vorab zu kompilieren.)

2) Wenn bei Ihrer Bereitstellung ein Fehler auftritt, müssen Sie zum Zurücksetzen nur einen Befehl ausgeben, anstatt Änderungen rückgängig zu machen. Der Befehl in unserem Fall wärejunction current blue

Hoffentlich kann unsere Art, Dinge zu tun, etwas Licht in eine neue Lösung für Sie bringen.


0

Was ich getan habe und ich bin nicht sicher, ob Sie den Rahmen dafür haben, aber hier geht. Ein Entwickler checkt Code in eine QA-Niederlassung ein und lädt ihn dann von einem Systemtechniker in eine QA-Umgebung. Sobald er die QA bestanden hat, wird er in die Produktionsniederlassung befördert. In diesem Fall wurden mindestens zwei von jedem Standort mit einem Server verbunden. In diesem Fall wurde einer der beiden Server offline geschaltet, dh der Standort wurde gestoppt, archiviert und der neue Standort zusammen mit bereitgestellt Erforderliche Änderungen werden dann neu gestartet und Sie werden zum nächsten Server weitergeleitet. In unserem Fall wurde dies alles mit C # gescriptet, in der Vergangenheit jedoch mit vb script. Ich hoffe das hilft. Prost

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.