Ist es eine gute Idee, Mercurial auf Ihrem Server zu installieren und zu implementieren?

12

Ich habe gerade einen neuen Job im letzten Monat angefangen und es sieht so aus, als hätten sie KEINE Versionskontrolle für ihren Code. Sie verlassen sich auf die Backups, die ihr Hosting-Anbieter für sie erstellt.

Nachdem ich ein wenig geredet hatte, überzeugte ich meinen Chef, dass wir auf jeden Fall die Quellcodeverwaltung verwenden sollten, und nach einem kurzen Seminar war das gesamte Team an Bord. Sie liebten Mercurial.

Im Moment arbeiten wir also so:

º----------BitBucket
º---------/
º--------/

Ich selbst und die drei anderen Entwickler hg pullvon BitBucket nehmen unsere Änderungen vor und dann hg pushan BitBucket.

Für die Bereitstellung müsste jetzt jemand die neuesten Dateien per FTP auf den Produktionsserver übertragen.

Ich dachte daran, Mercurial auf unserem Server zu installieren und hg clone(später hg pull) die Versionen für die Produktion auf dem neuesten Stand zu halten.

º---push->-----BitBucket----<-pull-----º (production server)
º---push->----/
º---push->---/

Ist das eine gute Idee? Mögliche Fallstricke, die ich möglicherweise nicht sehe? Hat hier jemand etwas ähnliches gemacht? Wie implementieren Sie eine große PHP-Framework-Anwendung (wir verwenden Moodle)?

sergserg
quelle
Es ist eine großartige Idee. Warum hast du Zweifel?
Nikolay Fominyh
Es ist ein Prozess, den viele als "normal" ansehen und den Microsoft jetzt eingebaut hat, um Git-basierte Bereitstellungen (mit hg-Unterstützung in Zukunft möglich) für ihren Azure-Dienst durchzuführen.
Alan Barber

Antworten:

11

Dies ist sicherlich eine gute Idee und eine übliche Methode für die Bereitstellung. Möglicherweise möchten Sie einen stabilen Zweig für Bereitstellungszwecke verwenden und gleichzeitig den Trunk für die laufende Entwicklung beibehalten, damit Sie den stabilen Zweig testen können, bevor Sie ihn in der Produktion bereitstellen.

Das einzige Problem kann auftreten, wenn Ihre Codebasis vertrauliche Informationen enthält (z. B. API-Schlüssel usw.), die Sie nicht auf Server von Drittanbietern hochladen möchten (in Ihrem Fall wäre dies Bitbucket). In diesem Fall wird dieses Problem durch ein einfaches Skript behoben, das ausgeführt wird, sobald Sie die Daten aus dem Repository abgerufen haben, um die vertraulichen Daten an der richtigen Stelle wiederherzustellen.

Cromulent
quelle
10

Beachten Sie, dass diese Bereitstellungsstrategie nicht atomar ist. Es kann vorkommen, dass einige Dateien bereits aktualisiert werden, während sich andere Dateien möglicherweise noch im alten Zustand befinden, während die Anwendung ausgeführt wird. Dies kann zu unerwarteten Nebenwirkungen führen.

Eine Möglichkeit, Atomic Deployments durchzuführen, besteht darin, Symlinks zu verwenden. Erstellen Sie ein Verzeichnis mit den neuen Dateien. Wenn alles fertig ist, ändere einen Symlink für das verwendete Verzeichnis. Wenn Sie die alte Version beibehalten, können Sie auch problemlos ein Rollback durchführen.

johannes
quelle
3
Sie können trotzdem problemlos ein Rollback durchführen, das ist der Punkt von VCS.
Rob
1
nicht unbedingt - dann müssen Sie die Konfiguration oder einige generierte Dateien beibehalten, die möglicherweise versions- und systemabhängig im VCS sind. Außerdem müssten Sie Tags verwenden (was in dem in der Frage beschriebenen Prozess nicht erwähnt wird), um zu einer bekannten Arbeitsversion zurückzukehren.
Johannes
2

Ein anderer (meiner meinung nach besser) Möglichkeit: Verwenden Sie einen Build Server / Continuous Integration Server.

Kurze kurze Erklärung: Dies ist ein Server (kann intern sein, muss nicht im Internet sein), den Sie für die Überwachung Ihrer Repositorys eingerichtet haben, und der Server erstellt Ihren Code, wenn neue Änderungssätze in den Repositorys vorhanden sind ( AFAIK das ist in PHP nicht nötig) , führt Komponententests durch und stellt Ihren Code auf dem Webserver bereit.

Weitere Informationen finden Sie unter folgenden Links:

Es gibt viele verschiedene Produkte für CI , aber das einzige, das ich bisher verwendet habe, ist TeamCity . Sehr einfach einzurichten ... in der Tat, es ist das erste, das ich ausprobiert habe, und es hat mir so gut gefallen, dass ich dabei geblieben bin.


Alternative billige Lösung:

Wenn das Einrichten eines Build-Servers zu aufwändig ist oder Sie mehr Kontrolle darüber haben möchten, wann genau Ihre Site bereitgestellt wird, richten Sie einfach eine Skriptdatei ein (Batch / Powershell unter Windows oder etwas Ähnliches unter Linux / Mac). , die die neueste Version aus Ihrem Repository und FTPs auf dem Produktionsserver.

Grundsätzlich ist es dasselbe wie ein Build-Server, nur einfacher.


Egal wie genau Sie es am Ende lösen ... stellen Sie sicher, dass Sie es irgendwie automatisieren!

Sie möchten in der Lage sein, die Bereitstellung mit einem einzigen Klick / durch Eingabe eines einzigen Befehls durchzuführen, damit JEDER dies tun kann, ohne etwas Besonderes zu wissen und ohne Fehler zu machen - auch im Katastrophenfall oder unter Stress.

Christian Specht
quelle
1

Wir machen das oder ähnliche Dinge. Der von @johannes erwähnte nichtatomare Winkel ist ein Problem, obwohl er realistisch gesehen so schnell abläuft, dass er in Ordnung sein sollte, und es gibt Möglichkeiten, wie er darauf hinweist.

Wahrscheinlich wichtiger als diese Nicht-Atomizität ist "Wie verwalten Sie Datenbankschemaaktualisierungen?" - die Bereitstellung von fehlerhaftem Code auf diese Weise macht das Beheben so einfach. Das große Problem ist, wenn Sie ein Update bereitstellen, das die Datenbank ändert, für die Sie ein Rollback durchführen möchten. Oder wenn Sie fehlerhafte Aktualisierungen vornehmen und Daten beschädigen.

Das andere Problem mit DCVS-Tools (im Gegensatz zur Verwendung von SVN) ist, dass Sie jetzt eine Kopie der gesamten Codebasis auf dem Computer haben, die ein Angreifer möglicherweise abfangen könnte. Und auch, dass diese DCVS-Codebasis ziemlich umfangreich werden kann, was wichtig sein kann, wenn Sie für Speicher und / oder Backup bezahlen. Aus diesen Gründen wird SVN weiterhin für die endgültige Bereitstellung verwendet.

Wyatt Barnett
quelle
1

Es ist eine großartige Idee, beachten Sie jedoch Folgendes:

  • Versuchen Sie, kein Commit auf dem Server durchzuführen (obwohl dies manchmal sinnvoll ist, z. B. Installieren eines Plugins oder Hinzufügen von Inhaltsassets).
  • Verwenden Sie zum Testen einen Staging-Server oder eine sekundäre Repository-Bereitstellung
  • Seien Sie immer vorsichtig, dass hg update -Cdie Produktion nicht beeinträchtigt wird (dh löschen Sie wichtige Dateien)
  • Verfügen Sie über einen Produktions- und einen Entwicklungszweig, stellen Sie nur den Produktionszweig bereit
  • Assets als Backup behandeln (z. B. Bilder für Inhalte) und Benutzerdaten ignorieren (z. B. Anhänge / Uploads, Cache usw.)
  • Immer eine saubere hg statusAusgabe auf dem Server haben (dies hilft Ihnen sicherzustellen, dass Sie Dinge als Cache ignorieren)
  • Stellen Sie das Repository nicht im Webordner bereit. Verwenden Sie Symlinks von außerhalb des öffentlichen Raums (z. B. ln -s / myrepo / src / web / public_html / myapp).
  • Achten Sie darauf, Konfigurationsdateien nicht zu versionieren (insbesondere nicht mit Datenbankkennwörtern oder anderen).
  • Nicht anstelle einer Produktions Sicherung verwenden, ist dies eine Entwicklung Sicherung für die Produktion Code , nicht Produktionsdaten

Schließlich denke ich, das Wertvollste für das Hinzufügen eines DVCS zu Ihrem Bereitstellungsprozess ist, dass dies die Sicherheit Ihrer Bereitstellung erhöht. Manchmal fügen Hacker schädlichen Code in Ihre Inhalte ein und Sie haben wirklich keine Möglichkeit, ihn ohne eine Art Versionskontrolle leicht zu erkennen. speziell verteilt, da der verteilte Aspekt zu VCS es einfacher macht, die Integrität Ihrer Dateien zu überprüfen).

Ich habe einige Websites gehackt ein paar Mal bekommen hat, mit Mercurial hilft ich litterally diese Hacks rückgängig machen , indem nur eine Ausgabe hg update -Cin dem Server (natürlich Sie vielleicht ein tun , um hg statusdie betroffenen Dateien für eine spätere Analyse und bekommen).

dukeofgaming
quelle