Frage:
Ist die Verwendung von Git für die Bereitstellung einer schlechten Praxis?
Septagram
2013-11-14 13:37:19 UTC
view on stackexchange narkive permalink

Ich verwende Git normalerweise zum Bereitstellen von Produktionscode auf dem Webserver. Dies bedeutet normalerweise, dass irgendwo ein Master-Git-Repository an einem Ort gehostet wird, auf den über ssh zugegriffen werden kann, und der Produktionsserver dieses geklonte Repository bedient, während der Zugriff auf .git / und eingeschränkt wird .gitignore . Wenn ich es aktualisieren muss, ziehe ich einfach vom Master-Repository zum Repository des Servers. Dies hat mehrere Vorteile:

  1. Wenn jemals etwas schief geht, ist es extrem einfach, auf eine frühere Version zurückzugreifen - so einfach wie das Auschecken.
  2. Wenn eine der Quellen vorhanden ist Codedateien werden geändert und so einfach wie der git-Status überprüft. Wenn das Repository des Servers geändert wurde, wird dies beim nächsten Versuch offensichtlich.
  3. bedeutet, dass es eine weitere Kopie des Quellcodes gibt, falls schlechte Dinge passieren.
  4. Das Aktualisieren und Zurücksetzen ist einfach und sehr schnell.
  5. ol>

    Dies kann einige haben Probleme jedoch:

  • Wenn der Webserver aus irgendeinem Grund entscheidet, dass er das Verzeichnis .git / bereitstellen soll, ist und wird der gesamte Quellcode für alle lesbar . Historisch gesehen gab es einige (große) Unternehmen, die diesen Fehler gemacht haben. Ich verwende die Datei .htaccess , um den Zugriff einzuschränken. Daher glaube ich, dass im Moment keine Gefahr besteht. Vielleicht ist ein Integrationstest, der sicherstellt, dass niemand den Ordner .git / lesen kann, in Ordnung?

  • Jeder, der versehentlich Lesezugriff auf den Ordner erhält, erhält auch Zugriff auf jede frühere Version des Quellcodes, die früher vorhanden war. Aber es sollte nicht viel schlimmer sein, als Zugang zur vorliegenden Version zu haben. Schließlich sind diese Überarbeitungen per Definition veraltet.

Trotzdem glaube ich, dass die Verwendung von Git für die Bereitstellung von Code für die Produktion einigermaßen sicher und viel einfacher als rsync , ftp oder einfach kopieren. Was denkst du?

Wäre es nicht üblich, dass Ihr Git-Repository eine Ebene höher als Ihr Htdoc-Ordner existiert, damit es nicht versehentlich bereitgestellt wird?
Das ist ein guter Vorschlag, und genau das mache ich für ein aktuelles persönliches Projekt. Bei einem anderen Projekt ist das Repository meines Kunden jedoch anders organisiert (wobei sich htdoc im Stammverzeichnis des Repositorys befindet), sodass die Frage weiterhin gilt.
Wie stellen Sie sicher, dass Änderungen, die nach der Bereitstellung zum Testen vorgenommen wurden, nicht für die Produktion bereitgestellt werden?
Bisher hatte ich keine Chance, in einem Team mit dediziertem Testserver und Qualitätssicherung zu arbeiten (wahrscheinlich schlecht). Ich teste gründlich auf dem Entwicklungscomputer und stelle neue Funktionen nur in bestimmten Iterationen bereit. Wenn dann bis zur nächsten Iteration Bugfixes erforderlich sind, werden diese in einem separaten Zweig ausgeführt. Zum Beispiel wird Version 0.6 veröffentlicht, die Arbeit an 0.7 hat begonnen. Fehler wurde auf 0.6 gefunden, Fix in einem Zweig 0.6 angewendet und in einem Hauptzweig zusammengeführt. Die Produktion zieht dann Zweig 0,6. Und bis 0.7 veröffentlicht ist, gehen alle Fixes zuerst in Zweig 0.6. Manchmal (nicht immer) erstelle ich einen separaten Zweig für die bevorstehende Produktionsversion
In einer traditionellen Unternehmensumgebung würde diese Praxis mit Verachtung behandelt. Dennoch gibt es, wie Sie sagen, nur wenige technische Probleme. Tatsächlich gewinnt der allgemeinere Ansatz der schnellen und häufigen Bereitstellung zunehmend an Bedeutung. Es hat sogar ein eigenes Schlagwort: Continuous Deployment
Ist das * wirklich * eine Sicherheitsfrage?
Sie können jederzeit eine Package Manager-Suite wie Gradle, Maven usw. verwenden, um Ihre Dateien im HTDOCS-Ordner bereitzustellen, sodass Sie ./git usw. ausdrücklich ignorieren. Aktualisieren Sie Ihr GIT auf dem Server in einem separaten Ordner, und führen Sie dann PM aus, um es bereitzustellenan den richtigen Ort.Deshalb existieren sie.
Ich bin überrascht, dass das Sicherheitsproblem, über das Sie sich Sorgen machen, der .git-Ordner ist, während ich eher befürchten würde, dass ein solcher Prozess bedeutet, dass Ihre git-Anmeldeinformationen auf dem Webserver gespeichert werden. Wenn also ein Verstoß auf Ihrer Website vorliegt,dann kann jeder auf das Git-Repository zugreifen (hoffen wir, dass diese Anmeldeinformationen schreibgeschützt sind)
Sieben antworten:
user10211
2013-11-14 18:21:13 UTC
view on stackexchange narkive permalink

Ich würde sogar in Betracht ziehen, Git für die Bereitstellung zu verwenden. Sehr gute Praxis .

Die beiden von Ihnen aufgelisteten Probleme haben sehr wenig mit der Verwendung von git für die Bereitstellung selbst zu tun. Ersetzen Sie die Konfigurationsdatei mit den Datenbankkennwörtern durch .git / , und Sie haben das gleiche Problem. Wenn ich Lesezugriff auf Ihr Webstamm habe, habe ich Lesezugriff auf alles, was darin enthalten ist. Dies ist ein Problem der Serverhärtung, das Sie mit Ihrer Systemadministration besprechen müssen.

git bietet einige sehr attraktive Vorteile in Bezug auf die Sicherheit.

  1. Sie können ein System für die Bereitstellung in der Produktion erzwingen. Ich würde sogar einen Post-Receive -Hook konfigurieren, der automatisch für die Produktion bereitgestellt wird, wenn ein Commit für master vorgenommen wird. Ich gehe natürlich von einem Workflow aus, der dem Git-Flow ähnelt.

  2. Git macht es extrem einfach, den in der Produktion bereitgestellten Code auf eine frühere Version zurückzusetzen wenn ein Sicherheitsproblem angesprochen wird. Dies kann hilfreich sein, um den Zugriff auf geschäftskritische Sicherheitslücken zu blockieren, für deren Behebung Sie Zeit benötigen.

  3. Sie können ein System erzwingen, bei dem Ihre Entwickler die von ihnen vorgenommenen Commits unterschreiben müssen. Dies kann dabei helfen, festzustellen, wer was für die Produktion bereitgestellt hat, wenn eine absichtliche Sicherheitslücke gefunden wird.

  4. ol>
Schöne Antwort, ich freue mich sehr darauf, Git in meinen Produktionsservern zu verwenden! Ich zögere jedoch, den automatischen Push zu verwenden, wie Sie (und einige andere, die ich gelesen habe) vorgeschlagen haben. Durch automatisches Push kann Ihr Produktionsserver geändert werden, wenn Sie dies nicht möchten, und Sie können Ihren Server versehentlich offline lassen. Vielleicht fehlt mir etwas und ich mache es zu kompliziert, aber ich bevorzuge den paranoischen Ansatz, in den Produktionsserver zu ssh'en, einen "git fetch origin master" zu machen und dann "git diff master origin / master". Nur dann würde ich "git merge origin / master --ff-only" machen. Haben Sie irgendwelche Gedanken zu diesem Thema?
@pedromanoel Ich abonniere die Denkschule, in der alles, was Sie zum Master drängen, produktionsbereit sein sollte, damit es eigentlich kein Problem sein sollte. Was Sie vorschlagen, funktioniert auch.
Unsere Hauptzweig-Commits werden auf dem Dev-Webserver bereitgestellt. Wir haben einen QS-, Staging- und Produktionszweig, der den jeweiligen Umgebungen zugeordnet ist. Wenn wir für die Produktion freigeben möchten, müssen wir einfach den getesteten Code in den Produktionszweig einfügen. Das hat bei uns gut funktioniert. Wir verwenden dafür KUDU. Ich bin mir nicht sicher, welche anderen Tools verfügbar sind.
@TerryChia Können Sie Tutorials / Tools zum Einrichten Ihrer Post-Receive-Hooks für automatische Bereitstellungen vorschlagen? Wir verwenden Kudu, aber ich fand es schwierig, nicht sichere Websites einzurichten (wir haben unsere eigenen IIS-Server vor Ort).
Matt Surabian
2013-11-19 19:27:38 UTC
view on stackexchange narkive permalink

Es ist nichts Falsches daran, von einem Git-Repo aus bereitzustellen. Tatsächlich ist dies eine weit verbreitete Praxis und, wie Sie sagen, viel weniger fehleranfällig als das Kopieren von Dateien über FTP oder Rsync.

Angesichts der von Ihnen bereitgestellten Informationen würde ich die folgenden Punkte beachten:

  • Ziehen Sie nicht nur den neuesten Master ein. Die Produktion sollte über ein Release-Tag bereitgestellt werden. Verwenden Sie Git Flow oder ähnliches, um mehr Informationen über die Bereitstellung des Codes und die Erstellung der Tags zu erhalten. Da Tags zu einem bestimmten Zeitpunkt eine unveränderliche Referenz auf Ihren Code sind, ist sie stabiler als der Verweis auf einen Hauptzweig, der durch ein fehlerhaftes Festschreiben aktualisiert werden könnte.

  • Bezüglich der Bereitstellung des. Git-Verzeichnis Dies sollte kein großes Problem sein. Leiten Sie einfach alles, was mit .git vorangestellt ist, auf 404 in .htaccess um.

  • Ihre Git-Authentifizierung sollte auf SSH-Schlüsseln basieren, damit keine Repo-Passwörter auf dem Server gespeichert werden müssen.

Hurra für Git-Bereitstellungs-Workflows!

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

Ich werde hier der Meinung der Bevölkerung nicht zustimmen. Git dient der Versionskontrolle, nicht der Bereitstellung / CI.

Die hier empfohlenen Methoden eignen sich gut für kleine Projekte, lassen sich jedoch im Allgemeinen nicht sehr gut skalieren.

... was nicht heißt, dass Sie nicht weiter machen sollten, was Sie tun. Denken Sie im Verlauf Ihrer Karriere daran, dass die Projekte, an denen Sie arbeiten, wahrscheinlich aus einem rein git-basierten Bereitstellungsworkflow herauswachsen.

Der wichtigste Paradigmenwechsel besteht darin, nicht mehr über die Bereitstellung von Zweigen nachzudenken Denken Sie über das Bereitstellen von Build-Ergebnissen nach und fügen Sie Umgebungsabhängigkeiten ein, um Ihre Infrastruktur von Ihrer Verzweigungsstrategie zu entkoppeln.

Verwenden Sie beispielsweise das obige Paradigma zum Bereitstellen von Dateien und zum Rollback. Wenn Sie Dateien bereitstellen, können Sie mehrere Versionen der Anwendung auf dem Produktionsserver behalten. Wenn Sie ein Rollback durchführen müssen, können Sie Ihren Webserver auf eine ältere Version verweisen, indem Sie das Webstammverzeichnis erneut verknüpfen. Zwei Shell-Befehle, Mikrosekunden Ausfallzeit, weniger Fehleranfälligkeit als bei Verwendung von git.

Ein weiteres Beispiel: Sie haben den Standard-Dev-Zweig> Staging-Zweig> Master-Workflow mit jeweils einem Server. Sie haben Dinge bereit für die Entwicklung, aber einige andere Dinge zur Bereitstellung haben die Qualitätssicherung fehlgeschlagen. Sie müssen also einige hässliche Vorgänge ausführen - die fehlerhaften Commits von der Bühne entfernen, die Phase erneut bereitstellen sowie die fehlerhaften Commits in der Entwicklung entfernen oder beheben und hoffen, dass Entwicklung und Staging nicht nicht synchron sind.

Was ist stattdessen, wenn Sie einen Release-Zweig vom Master abschneiden, das Material, das für diesen Release-Zweig bereit ist, zusammenführen und das Ergebnis erstellen, einen Testserver in AWS hochfahren und das Ergebnis dort bereitstellen, Ihre Qualitätssicherung ausführen und funktionsfähig sind Tests gegen diesen temporären Staging-Server und dann das gleiche Ergebnis in den Produktionscluster übertragen und bereitgestellt? Nehmen Sie dann die temporäre Staging-Box außer Betrieb, die Sie hochgefahren haben, führen Sie die Freigabe in Master zusammen und kennzeichnen Sie Master mit einer Versionsnummer.

Das sind natürlich extreme Beispiele. Normalerweise ist es nicht so sauber, selbst wenn wir es wollen - Sie müssen wahrscheinlich einige Build-Prozesse in der Zielumgebung ausführen, da Datenbankänderungen erforderlich sind. Und wenn Sie zwischen den Versionen nicht-idempotente Datenbankmods haben, wird das Rollback nicht so einfach sein, egal welche Methode Sie verwenden, da Sie die Datenbank zurücksetzen müssen (im Allgemeinen versuchen Sie, die idempotente Datenbank bereitzustellen Änderungen, und entfernen Sie dann die veralteten Datenbankbits in einer späteren Version, nachdem Sie sicher sind, dass sie nicht mehr im Anwendungsfluss sind.

Wie auch immer, ich denke, was ich vorhabe, ist meine Antwort auf "Ist die Verwendung von Git für die Bereitstellung eine schlechte Praxis?" ist im Allgemeinen "Ja", genauso wie die Verwendung von Stützrädern für das Fahrradfahren schlecht ist. Es ist eine Verbesserung, wenn Sie Ihren Arsch wiederholt auf dem Beton platzen lassen, aber Sie wachsen hoffentlich irgendwann heraus.

Dem würde ich auch zustimmen.Ich denke nicht unbedingt, dass es schlecht ist, aber es gibt einige zusätzliche Punkte, die Anlass zur Sorge geben. 1. Es bringt * alles * in Produktion 2. `git checkout` ist keine Transaktion.Dies bedeutet, dass sich Ihr System während der Bereitstellung in einem inkonsistenten Zustand befinden kann, während einzelne Dateien geschrieben werden Wie @siliconrockstar feststellte, ist git ein SCM-System, kein Bereitstellungssystem.Sie lösen zwei verschiedene Probleme.
@siliconrickstar Haben Sie weitere Informationen oder Ressourcen dazu?Ich habe diesen Prozess bereits verwendet, möchte aber einige Best-Practice-Anleitungen sehen.Beispiel: Würde Ihre CI-Pipeline mit Gitlab die gesamte Anwendung in eine Zip-Datei bündeln und diese in die Produktion rsyncieren?Abhängigkeiten und alle (wie Hersteller, Knotenmodule usw.) oder würden sie auf dem Server aufgelöst (ich nehme das erstere an, da Sie dann einen vollständigen Snapshot der Anwendung in einem Verzeichnis haben und der Produktserver keine "Arbeit" erledigt)außer einem Symlink-Tausch)
@Chris Ich wünschte, ich hätte einige "maßgebliche" Ressourcen für Sie, aber die tatsächlichen Details variieren drastisch je nach Projekt und Stapel.Ich arbeite heutzutage hauptsächlich mit Magento und selbst der "offizielle" Bereitstellungsablauf mit Magento Cloud führt einige seltsame Dinge aus, die wahrscheinlich nicht die beste Vorgehensweise sind (das Koppeln von Zweigen und Umgebungen fällt mir sofort ein).In Magentoland verwendet Magento in Bezug auf Abhängigkeiten derzeit Composer und npm, und IMO ist es im Allgemeinen sicher, diese Tools auf den Bereitstellungszielen ausführen zu lassen, anstatt den gesamten Anbieter / jede Bereitstellung zu kopieren.
Cool cool, danke @siliconrockstar!
Brendon
2013-11-21 00:56:15 UTC
view on stackexchange narkive permalink

Sie können das Argument --separate-git-dir = <git dir> verwenden, wenn Sie den git-Klon aufrufen. Dadurch wird ein symbolischer Link in das Verzeichnis .git eingefügt (symbolisch für Git, ich glaube nicht, dass es sich um einen symbolischen Link zu Ihrem Betriebssystem handelt), und Sie können den <git dir> code angeben > an einen Ort außerhalb des Dokumentstamms.

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

Ein alternativer Ansatz, den ich zuvor gewählt habe, ähnelt Terry Chias Kommentar zu Hooks nach dem Empfang.

Git verfügt über eine Reihe von Hooks, die für die Ausführung verwendet werden können Alle Arten von Aufgaben vor / während / nach mehreren verschiedenen Aktionen.

Erstellen Sie ein nacktes Repository an einer anderen Stelle als in Ihrem Webordner. Das Bare-Repository kann dann als Remote zum Push verwendet werden, und ein Post-Receive-Hook kann ausgelöst werden, um den neuen Code in ein angegebenes Verzeichnis auszuchecken.

Dieser Ansatz hat Einige Vorteile: Der Bereitstellungsort fungiert als "Einbahnstraße", in der Code die Quellcodeverwaltung durchlaufen muss, um in die Produktion zu gelangen. Sie können verschiedene Zweige / Versionen an verschiedenen Standorten bereitstellen (alle aus demselben Bare-Repo). Es bietet auch eine schöne einfache Möglichkeit zum Rollback mit der Standard-Git-Prüfung. Eine Einschränkung / Konsequenz davon ist jedoch, dass Codeänderungen auf dem Server nicht in Git widergespiegelt werden (nackte Repositorys haben keine Arbeitsverzeichnisse) git --work-tree = / path / to / code status manuell ausführen, um Änderungen zu sehen (aber Sie sollten den Produktionscode trotzdem nicht ändern, oder?)

Ich glaube nicht, dass Sie diesen einleitenden Absatz brauchen.Es wird nur versucht, Ihren Beitrag zum Löschen zu markieren.Besser an einer guten Antwort arbeiten.
Als Leser, wenn ich Antworten vom Typ "soll ein Kommentar sein" sehe, schätze ich sie normalerweise als nicht nützlich ein und überspringe das Lesen.Sie haben einige nützliche Inhalte in diesem Beitrag.Darauf würde ich aufbauen.Waschen, spülen und wiederholen, bis Sie genug Ruf haben, um Kommentare zu hinterlassen.
Danke für die Rückmeldung!Ich entfernte den ersten Satz und erweiterte meine Antwort.Es war sowieso zu lang für einen Kommentar.
Thibault
2016-09-16 18:04:23 UTC
view on stackexchange narkive permalink

Ich stimme Terry Chia zu, dass dies eine sehr gute Praxis ist. Es stellt sicher:

  • , dass die vorhandene Revision die richtige ist,
  • mit allen benötigten Dateien und prüft die Vollständigkeit der Version,
  • Machen Sie die Bereitstellungsprozedur schnell und einfach.

Aber ich muss hinzufügen, dass es einige Einschränkungen gibt, die ich gerne teilen möchte.

Normalerweise legen Sie Folgendes in ein Git-Repository:

  • Code,
  • Dokumente,
  • Unit-Tests,
  • Bereitstellungsskripte,
  • Integrationstools, .deb-Archive,
  • SQL-Patches
  • oder ähnliches und vielleicht ein paar andere

Nun, in der Produktion wollen Sie nur den Code!

Weil Dokumente, Komponententests, Tools oder .deb-Archive viel Speicherplatz beanspruchen können und in der Produktion nichts zu tun haben

Mit Subversion (vor Version 1.7) können Sie nur das Verzeichnis src / auschecken und haben alle Vorteile. Aber mit Subversion> 1.7 und Git können Sie das nicht tun.

Eine Alternative wäre die Verwendung von Git-Submodulen, um diese Art von Architektur zu erstellen: project repo | - doc | - src -> submodule to project-src repo. \ tests Aber dann würden Ihr Projekt / Ihre Tests und Ihr Projekt-src-Code nicht synchronisiert und das wäre wirklich scheiße.

Die Lösung wäre dann, "sparse checkout" zu verwenden, siehe: https://stackoverflow.com/questions/600079/how-do-i-clone-a-subdirectory-only-of-a-git-repository

Sie können also git verwenden , aber bitte seien Sie vorsichtig mit diesen Nachteilen.

Ich würde sagen, dass die Einführung von Submodulen \ speziellen Kassen \ anderen seltsamen Dingen sehr sorgfältig geprüft werden sollte, bevor Entscheidungen getroffen werden.Normalerweise ist dein "anderes Zeug" nicht so groß, also könnte es ein Problem sein.Viel besser, wenn Entwickler einfach das gesamte Repo klonen und sofort damit beginnen können, ohne magische Tänze über die Konfiguration von allem zu tanzen. P.S.Und natürlich sollten Sie keine binären Blobs in Ihrem Repo speichern.
Zamicol
2014-11-15 04:18:37 UTC
view on stackexchange narkive permalink

Hier ist das Skript, mit dem ich Git zum Push-to-Prod mache.

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

Es wird davon ausgegangen, dass alles, was an den Hauptzweig gesendet wird, für die Produktion bereit ist. Alle anderen geschobenen Zweige werden ignoriert. Sie können dieses Hook-Skript an Ihre Bedürfnisse anpassen.

In Bezug auf Ihre Bedenken platziere ich mein Git-Verzeichnis unter / var / git und meine Produktionsdateien an einer anderen Stelle (wie / var / www) und beschränke den Zugriff zu diesen Verzeichnissen.

Sie können Ihr Git-Repo auch auf einem von Ihrem Produktionsserver getrennten Server haben und dann so etwas wie scp und ssh im verwenden Skript oben, um Ihre Dateien vom Git-Server auf den Produktionsserver zu verschieben. Auf diese Weise können Sie weiterhin git verwenden, um zu prod zu pushen, während Sie Ihren Code von Ihrer Produktion trennen.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...