Es gibt zwei Hauptmöglichkeiten, eine J2EE/Java-Webanwendung bereitzustellen (in einem sehr vereinfachten Sinne):
Bereitstellung der zusammengestellten Artefakte in der Produktionsbox
Hier erstellen wir die .war
(oder was auch immer), konfigurieren Sie es für die Produktion (möglicherweise erstellen Sie zahlreiche Artefakte für zahlreiche Boxen) und platzieren Sie die resultierenden Artefakte auf den Produktionsservern.
- Profis : Keine Entwicklungswerkzeuge auf den Produktionssystemen, direkte Wiederverwendung von Artefakten aus den Tests, Mitarbeiter, die für die Bereitstellung zuständig sind, benötigen keine Kenntnisse des Build-Prozesses
- Nachteile Zwei Prozesse für die Erstellung und Bereitstellung von Artefakten; potenziell komplexe Konfiguration von vorgefertigten Artefakten könnte den Prozess schwer skriptbar/automatisierbar machen; binäre Artefakte müssen versioniert werden
Erstellen der Artefakte auf die Produktionsbox
Hier wird derselbe Prozess, der täglich für die Erstellung und Bereitstellung auf lokalen Entwicklungssystemen verwendet wird, auch für die Bereitstellung in der Produktion genutzt.
- Profis : Ein zu pflegender Prozess, der durch häufige Nutzung intensiv getestet/validiert wird. Möglicherweise ist es einfacher, die Konfiguration bei der Erstellung des Artefakts anzupassen, als das vorgefertigte Artefakt nachträglich zu ändern; keine Versionierung von binären Artefakten erforderlich.
- Nachteile : Potenziell komplexe Entwicklungstools, die auf allen Produktionssystemen benötigt werden; das Bereitstellungspersonal muss den Build-Prozess verstehen; Sie sind nicht Bereitstellung der getesteten Daten
Ich habe meist den zweiten Prozess verwendet, zugegebenermaßen aus der Not heraus (keine Zeit/Priorität für einen anderen Verteilungsprozess). Ich persönlich glaube nicht an Argumente wie "die Produktionsbox muss frei von allen Compilern usw. sein", aber ich kann die Logik des Einsatzes des Getesteten (im Gegensatz zur Erstellung eines weiteren Artefakts) zu verstehen.
Java-Enterprise-Anwendungen sind jedoch so konfigurationsempfindlich, dass zwei Prozesse für die Konfiguration von Artefakten eher ein Problem darstellen.
Was denken Sie?
Update
Hier ein konkretes Beispiel:
Wir verwenden OSCache und aktivieren den Festplatten-Cache. Die Konfigurationsdatei muss sich innerhalb der .war-Datei befinden und verweist auf einen Dateipfad. Dieser Pfad ist in jeder Umgebung anders. Der Build-Prozess erkennt den konfigurierten Speicherort des Benutzers und stellt sicher, dass die in der War-Datei enthaltene Eigenschaftsdatei für seine Umgebung korrekt ist.
Wenn wir den Build-Prozess für die Bereitstellung verwenden würden, müssten wir die richtige Konfiguration für die Produktionsumgebung erstellen (z. B. production.build.properties
).
Wenn wir die "Bereitstellung der zusammengestellten Artefakte in der Produktionsumgebung" befolgen würden, bräuchten wir einen zusätzlichen Prozess, um die (falschen) OSCache-Eigenschaften zu extrahieren und sie durch eine für die Produktionsumgebung geeignete zu ersetzen.
Dies führt zu zwei Prozessen, um dieselbe Sache zu erreichen.
Die Fragen lauten also:
- Lässt sich dies ohne "Kompilieren in der Produktion" vermeiden?
- Wenn nicht, ist es das wert? Ist der Wert von "keine Kompilierung bei der Produktion" größer als "wiederhole dich nicht"?