Java-Web-Deployment: erstellen Sie code, oder bereitstellen .Krieg?
Wesentlichen zwei Möglichkeiten zur Bereitstellung einer J2EE - /Java-Web-app (in einer sehr vereinfachenden Sinne):
Bereitstellen versammelten Artefakte, um die Produktion box
Hier, wir schaffen das .war
(oder was auch immer) anderswo, konfigurieren es für die Produktion (ggf. erstellen zahlreiche Artefakte für zahlreiche Kästen) und die daraus resultierenden Artefakte, die auf den Produktions-Servern.
- Profis: Keine dev-tools auf Produktions-Kisten, wieder verwenden können Artefakte aus der Prüfung direkt Mitarbeiter tun, Implementierung braucht keine Kenntnisse von build-Prozess
- Nachteile: zwei Prozesse für das erstellen und bereitstellen von Artefakten, die potenziell komplexe Konfiguration von bereits erstellten Artefakte machen könnte-Prozess schwer zu Skript/automatisieren; auf version binäre Artefakte
Bauen der Artefakte auf die Produktion box
Hier das gleiche Verfahren verwendet Tag-zu-Tag-erstellen und bereitstellen von lokal auf den Entwickler-Boxen verwendet wird, um in der Produktionsumgebung bereitstellen.
- Profis: Ein Prozess aufrecht zu erhalten; und es ist schwer getestet/validiert durch häufige Nutzung. Potenziell einfacher zum anpassen der Konfiguration an Artefakt-Erschaffung der Zeit statt, anpassen von pre-built Artefakt Nachwort; keine Versionierung von binären Artefakte benötigt werden.
- Nachteile: Potenziell komplexe Entwicklungs-tools erforderlich, auf allen Produktions-Boxen; Bereitstellung von Personal zu verstehen-build-Prozess; Sie nicht bereitstellen, was Sie getestet
Habe ich überwiegend verwendet der zweite Prozess, zugegebenermaßen aus der not heraus (keine Zeit/Priorität, für eine andere deployment-Prozess). Ich persönlich kaufen nicht, Argumente wie "die Produktion box muss sauber sein von allen Compilern, etc.", aber ich kann sehen die Logik bei der Bereitstellung, was Sie getestet haben (im Gegensatz zu Gebäude ein anderes Artefakt).
Jedoch Java-Enterprise-Anwendungen sind so empfindlich, Konfiguration, es fühlt sich an wie ärger mit zwei Verfahren zum konfigurieren von Artefakten.
Gedanken?
Update
Hier ein konkretes Beispiel:
Verwenden wir OSCache, und den disk-cache einzuschalten. Die Konfigurations-Datei muss in der .war-Datei und es verweist auf einen Dateipfad. Dieser Pfad ist anders auf jede Umgebung. Der build-Prozess erkennt der Benutzer die konfigurierten Speicherort und sorgt dafür, dass die properties-Datei gesetzt, im Krieg ist die richtige für seine Umwelt.
Wenn wir den build-Prozess für die Bereitstellung, wäre es eine Frage der Schaffung der richtigen Konfiguration für die Produktion von Umweltschutz (z.B. production.build.properties
).
Wenn wir Folgen der "bereitstellen versammelten Artefakte, um die Produktion box", bräuchten wir einen zusätzlichen Prozess zum extrahieren der (falsche) OSCache Eigenschaften und ersetzen Sie es mit einem entsprechenden Produktionsumgebung.
Dadurch werden zwei Prozesse, um das gleiche erreichen.
So, die Fragen sind:
- Ist diese vermeidbare ohne "kompilieren, die auf der Produktion"?
- Wenn nicht, ist es Ihnen das wirklich Wert? Es wird der Wert "kein kompilieren auf die Produktion" größer als "Don' T Repeat Yourself"?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin fest gegen die Gebäude, die auf die Produktion im Feld, weil es bedeutet, dass Sie mit einem anderen build als Sie getestet mit. Es bedeutet auch, jedes deployment Maschine hat eine andere JAR/war-Datei. Wenn nichts anderes, machen ein einheitliches bauen, nur so, dass, wenn bug tracking, die Sie nicht haben, um sorgen über die Inkonsistenzen zwischen den Servern.
Außerdem müssen Sie nicht brauchen, um die builds in version control, wenn Sie können einfach anzeigen zwischen bauen und die Quelle, der es erstellt.
Wo ich arbeite, unser deployment-Prozess ist wie folgt. (Das ist unter Linux mit Tomcat.)
Änderungen testen und prüfen in Subversion. (Nicht unbedingt in dieser Reihenfolge; wir erfordern nicht, dass engagierte code ist getestet. Ich bin der einzige Vollzeit-Entwickler, so der SVN-Baum ist im wesentlichen meinem Zweig. Kann Ihre Laufleistung variieren.)
Kopieren Sie die JAR/war-Dateien auf einem Produktions-server in einem freigegebenen Verzeichnis, benannt nach dem Subversion-Revisionsnummer. Der web-Server nur Lesezugriff haben.
Den deployment-Verzeichnis enthält relative symlinks auf die Dateien in der revision benannten Verzeichnisse. So ein directory-listing wird immer zeigen Ihnen, welche version des source-Codes produziert, die mit der version. Beim bereitstellen, aktualisieren wir eine log-Datei, die wenig mehr als ein Verzeichnis-Auflistung. Das macht die roll-backs einfach. (Eine gotcha, obwohl; Tomcat-checks für neue war-Dateien durch das Datum ändern die wirkliche Datei, nicht den symbolischen Link, so müssen wir berühren, wird die alte Datei, wenn Sie zurück Rollen.)
Unsere web-Server entpacken der war-Dateien auf einem lokalen Verzeichnis. Der Ansatz ist skalierbar, da Sie die war-Dateien auf einem einzigen Datei-server, wir könnten Sie haben eine unbegrenzte Anzahl von web-Servern und nur einer einzigen Bereitstellung.
Meisten der Orte, die ich gearbeitet habe, haben die erste Methode mit der Umwelt spezifische Konfiguration Informationen separat bereitgestellt (aktualisiert und sehr viel seltener), die außerhalb des Krieges/Ohr.
Empfehle ich "Bereitstellen versammelten Artefakte, um die Produktion box" wie eine war-Datei. Dies ist der Grund, warum unsere Entwickler verwenden die gleichen build-script (Ant in unserem Fall) zu konstruieren, die der Krieg auf Ihre Entwicklung sandbox, wie Sie verwendet wird, zu erstellen, die schließlich Artefakt. Auf diese Weise ist es debugged, sowie den code selbst, nicht zu erwähnen, vollständig wiederholbar.
Gibt es Konfigurations-services, wie schweres Gewicht Tierpfleger, und die meisten Container ermöglichen Ihnen die Verwendung von JNDI, um einige der Konfiguration. Diese trennen die Konfiguration aus die zu bauen, aber kann zu viel des guten. Jedoch gibt es Sie. Viel hängt von Ihren Bedürfnissen ab.
Habe ich auch verwendet, ein Prozess, bei dem die Artefakte gebaut werden, mit Platzhaltern für die config Werte. Als der KRIEG bereitgestellt ist, es ist explodiert und die Platzhalter durch die entsprechenden Werte ersetzt.
Ich würde champion der Einsatz eines continuous integration-Lösung unterstützt verteilte builds. Code überprüft, in Ihre SCM auslösen können, baut die (zur sofortigen Prüfung) und Sie können planen, baut zur Erstellung von Artefakten für die QS. Sie können dann fördern diese Artefakte zu Produktion und haben Sie bereitgestellt.
Dies ist derzeit, was ich arbeite einrichten, mit AnthillPro.
EDIT: Wir sind jetzt mit Hudson. Sehr zu empfehlen!!!
Wenn Sie sich Fragen, diese Frage relativ zum Konfigurations-management, dann ist Ihre Antwort muss auf dem basieren, was für Sie ein verwaltetes Artefakt. Aus CM-Sicht, ist es eine inakzeptable situation zu haben, einer Sammlung von source-Dateien arbeiten in einer Umgebung und in einem anderen nicht. CM ist empfindlich auf Umwelt-Variablen, Optimierung, Einstellungen, compiler und runtime-Versionen, etc. und Sie haben zu berücksichtigen, die für diese Dinge.
Wenn Sie sich Fragen, diese Frage relativ zu wiederholbaren Prozess der Erstellung, dann die Antwort muss sein, auf Basis der Position und Menge der Schmerzen, die Sie bereit sind zu tolerieren. Mit einem .war-Datei kann mit mehr up-front Schmerzen in Kauf, um zu sparen Arbeit in der test-und deployment-Zyklen. Mit Hilfe der source-Dateien und build-tools kann die Rettung up-front Kosten, aber Sie wird zu ertragen haben, zusätzliche Schmerzen im Umgang mit Themen, die spät in den deployment-Prozess.
Update für das konkrete Beispiel
Zwei Dinge zu beachten, bezogen auf Ihr Beispiel.
Ein .war-Datei ist nur eine .zip-Datei mit einer anderen Erweiterung. Sie könnte ersetzen Sie die Konfigurationsdatei mit standard zip-Programmen.
Möglicherweise überdenken müssen, um die Konfigurations-Datei innerhalb der .war-Datei. Würde es genug sein, um es auf dem classpath oder haben die angegebenen Eigenschaften in der Ausführung der Kommandozeile beim starten des Servers.
In der Regel versuche ich, zu halten, Bereitstellung, Konfiguration und spezifischen Anforderungen für die Bereitstellung Speicherort.
Mit 1 verpackt war-Dateien für die Bereitstellung ist eine gute Praxis.
wir verwenden Ameise zu ersetzen, die Werte sind zwischen verschiedenen Umgebungen. Wir überprüfen Sie die Datei mit einem @@@ variable wird ersetzt durch unsere ant-Skript. Das ant-script ersetzt, das richtige Element in der Datei und aktualisiert dann die war-Datei vor der Bereitstellung auf jedem
Zusammenfassen - ant tut es allen, und wir verwenden Ameisenhaufen zu verwalten ant.
ant-builds die war-Datei, ersetzt die Pfade der Dateien, updates der war-Datei, dann stellt der Ziel-environement. Ein Prozess, in der Tat einem Klick auf eine Schaltfläche in Ameisenhaufen.