2008-09-27 9 views
8

In einer idealen Welt würden unsere Entwicklungsprozesse perfekt sein, was zu regelmäßigen Releases führen würde, die so gründlich getestet wurden, dass es niemals nötig sein würde, eine laufende Anwendung "hochzufixen".Was sind einige gute Strategien, um zu ermöglichen, dass bereitgestellte Anwendungen Hotfixes sein können?

Aber leider leben wir in der realen Welt, und manchmal rutschen Käfer an uns vorbei und stellen ihre hässlichen Köpfe erst wieder her, wenn wir schon beim nächsten Release beschäftigt sind. Und der Fehler muss behoben werden Jetzt. Nicht als Teil der nächsten geplanten Veröffentlichung. Nicht heute Abend, wenn der Verkehr abflaut. Jetzt.

Wie gehen Sie mit dieser Notwendigkeit um? Es kann wirklich gegen gute Design-Praktiken, wie Refactoring Ihres Codes in nette, diskrete Klassenbibliotheken laufen.

Das manuelle Bearbeiten von Markups und gespeicherten Prozeduren auf einem Produktionsserver kann ein Rezept für Katastrophen sein, aber auch Katastrophen verhindern.

Welche Strategien gibt es für Anwendungsdesign und Bereitstellungstechniken, um ein Gleichgewicht zwischen Wartungsbedarf und guten Programmierpraktiken zu finden?

Antwort

2

[Auch wenn wir viel testen, bevor wir loslassen,] Was wir tun, ist dies:

Unsere SVN wie folgt aussieht:

/repo/trunk/ 
/repo/tags/1.1 
/repo/tags/1.2 
/repo/tags/1.3 

Nun, wenn wir loslassen, schaffen wir einen Tag, das wir schließlich in der Produktion auschecken. Bevor wir mit der Produktion beginnen, führen wir eine Inszenierung durch, die [weniger Server] ist, als die Produktion.

Gründe für die Erstellung eines "Tags" sind, dass einige Einstellungen unserer App im Produktionscode leicht unterschiedlich sind (zB werden keine Fehler per E-Mail gesendet, sondern protokolliert), daher ist es sinnvoll, das Tag zu erstellen und begehe diese Änderungen. Und dann Checkout auf dem Produktionscluster.

Jetzt, wenn wir Hotfix ein Problem benötigen, reparieren wir es in Tags/x zuerst und dann wir svn update aus dem Tag und sind gut. Manchmal gehen wir durch Staging, mit einigen Problemen (z. B. kleinere/triviale Fixes wie Rechtschreibung) umgehen wir das Staging.

Das einzige, was zu erinnern ist, alle Patches von tags/x bis trunk zu übernehmen.

Wenn Sie mehr als einen Server haben, ist Capistrano äußerst hilfreich, um alle diese Operationen auszuführen.

+0

Wie testen Sie das Update in der Entwicklung? Normalerweise habe ich auf einer Dev-Box eine Million Dinge auf meinen Stammordner gerichtet, die neu konfiguriert werden müssen. Was ist der Vorteil eines SVN-Tags, wenn Sie die neueste Revisionsnummer bei der Veröffentlichung einfach notieren? Vielen Dank! –

+0

Gute Frage, ich habe meine Antwort erweitert und hinzugefügt, dass wir eine Staging-Umgebung haben. (RE: Unterschied) IMHO ist es der Anwendungsfall, einfacher mit einem Tag als einer Revision zu arbeiten und wie ich erklärte, machen wir Produktion/Staging-spezifische Ergänzungen, bevor wir deply. Ich hoffe, das hilft. – Till

0

Eine Strategie besteht darin, deklarative externe Konfigurationsdateien für die verschiedenen Komponenten zu verwenden.

Beispiele:

Auf diese Weise können Sie oft Schlüsselkomponenten getrennt halten diskrete Teile, Hotfix eine laufende Anwendung ohne Neukompilierung, und nahtlos Quellcodeverwaltung (insbesondere im Vergleich zu gespeicherten Prozeduren, die in der Regel manuellen Aufwand zur Quellcodeverwaltung erfordern).

0

Wir teilen unseren Code in Framework-Code und Business-Anpassungen. Business-Customization-Klassen werden mit einem separaten Classloader geladen, und wir verfügen über ein Tool zum Übergeben von Änderungen an eine laufende Instanz der Produktion. Wann immer wir eine Änderung in einer Klasse benötigen, ändern wir sie und senden sie an eine laufende Instanz. Die laufende Instanz lehnt den alten Klassenlader ab und verwendet einen neuen Klassenlader, um die Klassen erneut zu laden. Dies ähnelt der JBoss-Hot-Deployment von EJBs.