2009-09-28 3 views
28

Was ist eine gute Bereitstellungsstrategie für die Verwendung mit Git + Heroku (Ruby on Rails)?Gute Git-Verteilung mit Heraku?

Derzeit ist die Art, wie ich mit meiner Herkunft Git-Repository arbeiten: Alle Funktionen (oder ‚Geschichten‘) werden zuerst geprüft, wie verzweigt, dann mit Master verschmolzen bekommen und schob zum Ursprung.

Alles, was zum Ursprung/Master geschoben wird, löst ein Skript aus, das den neuen Rails-Code zum Staging-Bereich (einfacher Rails-Webserver) bringt.

Wenn es an der Zeit ist, eine neue Produktionsversion nach Heroku zu schicken, sollte ich einen neuen Zweig (etwas wie production_version_121) erstellen und das irgendwie zu Heroku bringen?

Idealerweise würde ich gerne auswählen, welche Features aus früheren Entwicklungsversionen ich in den Produktionszweig aufnehmen sollte ... testen Sie es und wechseln Sie zu Heroku.

Zum Beispiel möchte ich nicht wollen, dass der neueste Code in Produktion geht. Ich möchte Feature "a", an dem ich gearbeitet habe, und Feature "c", das irgendwie in die Produktion integriert wurde, ohne das experimentelle Feature "b", das mehr Debugging benötigt.

N.B. Ich werde zunächst versuchen, capistrano zu vermeiden und etwas manuell arbeiten zu lassen.

Gedanken? Best Practices?

Antwort

32

Im Gemcutter Projekt haben wir einfach eine production Verzweigung.Alle Änderungen, die wir an der Produktionsstätte sehen wollen gehen in diesem Zweig zusammengeführt und dann zum Einsatz mit:

git push heroku production:master 

Der staging Zweig dient einem ähnlichen Zweck für die Inszenierung Website (auch auf Heroku)

+0

Danke David! Ich war neugierig, ob es jemand so machte. Richtig Ich bin Ich benutze nur meine Fernbedienung "Master" als die Produktion .. so zu deploy Ich mache einfach weiter: git push heroku (wenn die Zeit kommt) Problem ist, ich habe noch keine Funktionen, die ich will zu wählen und zu wählen, um in eine Produktionsbereitstellung noch einzuschließen ... Ich erwarte die Notwendigkeit, in diesem Fall zu erscheinen, muss ich einen legitimen "Produktionszweig" auf meinem Remote-Git-Server beginnen. Das nächste Mal probiere ich es mit: git push heroku production: Meister, ich nehme an, dass es sich beschweren wird und ich muss die "force" -Flagge benutzen, damit Heroku wegwirft, was es verfolgte? – Zaqintosh

+0

Meine einzige andere Frage ist, verwenden Sie Ihren Remote-Master für irgendetwas? Oder arbeiten Sie in Zweigniederlassungen und stellen/verschmelzen zu/von Filialen in 100% der Fälle? – Zaqintosh

+0

Ob Sie forcieren müssen oder nicht, hängt davon ab, ob "Produktion" direkt von dem abgeleitet ist, was derzeit auf dem Remote-Master vorhanden ist. Gemcutter verwendet den "Master" Zweig als Trunk. Hier werden die neuesten Änderungen vorgenommen. Funktionszweige werden erstellt und dann wieder in den Trunk zusammengeführt. Manchmal werden einzelne Commits oder Feature-Zweige in den Produktionszweig eingebunden, manchmal wird Master direkt zusammengeführt, wenn wir alles wollen. –

7

Es gibt eine Vielzahl von Möglichkeiten, dies zu tun, und es hängt wirklich von Ihren Vorlieben ab.

Ich gebe Ihnen eine mögliche Strategie von der Spitze meines Kopfes: Gegeben, Sie haben bereits eine automatisierte Staging-Setup, das Master verwendet, würde ich vorschlagen, eine 'Produktion' Zweig zu erstellen. Wenn Sie ein Fix/Feature für die Produktion bereitstellen möchten, fügen Sie einfach den Zweig "Thema" in den Zweig "Produktion" ein.

git checkout production 
git pull . my-topic-branch 
(resolve any conflicts) 

Wenn Sie bereit sind Push tatsächlich, dass Code auf Ihre Produktionsserver, sollten Sie den Zweig tag einen eindeutigen Namen (wahrscheinlich mit einem Zeitstempel). Dann schieben Sie einfach den Produktionszweig nach Heroku.

git checkout production 
git tag release-200910201249 

Ich würde vorschlagen, ein Skript oder git alias Erstellen des Tagging für Zeitstempel zu automatisieren, da ein einheitliches Namensschema verwendet, ist wichtig. Ich benutze so etwas wie diese:

git config alias.dtag '!git tag release-`date "+%Y%m%d%H%M"`' 

Das erlaubt mir nur git dtag zu tun geben, wenn ich eine Freigabe mit einem Zeitstempel markieren möge.

Sie können Ihre Tags mit git tag anzeigen und sie mit git show release-1234 anzeigen. Weitere Informationen zu Tags finden Sie unter git help tag. Sie können auch diese Github guide zum Taggen hilfreich finden. Ich würde auch empfehlen, die Workflows anderer Leute zu lesen (hier ist a nice writeup) und wählen Sie aus, was für Sie funktioniert.

+0

Danke für die Antwort! Ich bin nicht zu vertraut mit Tagging oder was es tatsächlich tut ... obwohl ich (meistens) verstehe, was Ihr Rat ist, wäre es toll, ein kurzes Beispiel oder Durchlauf des Prozesses über Git-Befehle zu haben. Danke nochmal! – Zaqintosh

+0

Ich habe Befehle zum Taggen und einen handlichen Alias ​​hinzugefügt, den ich in der Vergangenheit benutzt habe. Beachten Sie, dass dies für ein lokales Repository gilt. Sie können Tags mit 'git push --tags' in einen anderen Repo verschieben. –

+0

Also sagen wir, Sie drücken eine Freigabe-xxxxxxxxx (mit 'git push heroku production: master') und es bonks. Wie kommen Sie zur letzten bekannten guten Revision zurück? Mit anderen Worten, wie drücken Sie ein bestimmtes Tag? – brittohalloran

16

haupt seit ich Vincent Driessens A successful Git branching model gelesen habe, war ich begeistert. Mein gesamtes Unternehmen (8 von uns) hat jetzt dieses Modell standardisiert und einige andere Orte, die ich konsultiert habe, haben es auch begonnen, es zu benutzen.

Die meisten Leute, denen ich es gezeigt habe, sagen, dass sie schon etwas Ähnliches gemacht haben und fanden es sehr einfach sich anzupassen.

Kurz gesagt, Sie haben 2 Zweige, die permanent sind (Master und entwickeln). Meistens machen Sie nur Zweige von Entwicklung und verbinden sie wieder in Entwicklung. Die Dinge werden ein wenig komplizierter, wenn es darum geht, Produktionsfreigaben und Hotfixes zu machen, aber nach dem Lesen des Beitrags ein paar Mal, wird es eingefleischt.

Es gibt sogar ein Befehlszeilenprogramm namens git-flow, das Ihnen hilft.