2009-04-08 4 views
19

Was ist das minimale Beispiel für die Bereitstellung eines Krieges auf mehrere Tomcat-Server mit Maven, die geschrieben werden können?Maven auf mehrere Tomcat-Server bereitstellen

Ich habe versucht, die folgenden URLs und fragte die Mailing-Liste, aber nicht mit etwas, was kurz war und würde einfach funktionieren.

Das Beispiel sollte die Server im Beispiel irgendwo definiert haben (mit Beispielbenutzernamen/Passwort)

Antwort

25

Die Idee von Markus Lux kann auch mit dem Profil Management mit einer Maven2 Lösung, angewandt werden:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.cargo</groupId> 
      <artifactId>cargo-maven2-plugin</artifactId> 
     </plugin> 
    </plugins> 
    ... 
</build> 
<profiles> 
    <profile> 
     <id>env-foo1</id> 
     <!-- Activated when -Denv=foo1 is given as parameter. --> 
     <activation> 
      <property> 
       <name>env</name> 
       <value>foo1</value> 
      </property> 
     </activation> 
     <properties> 
      <deploy.env>xxx</deploy.env> 
      <tomcat.manager>http://foo1/manager</tomcat.manager> 
      <tomcat.manager.username>foo</tomcat.manager.username> 
      <tomcat.manager.password>bar</tomcat.manager.password> 
     </properties> 
    </profile> 
    <profile> 
     <id>env-foo2</id> 
     <!-- Activated when -Denv=foo2 is given as parameter. --> 
     <activation> 
      <property> 
       <name>env</name> 
       <value>foo2</value> 
      </property> 
     </activation> 
     <properties> 
      <deploy.env>dev</deploy.env> 
      <tomcat.manager>http://foo2/manager</tomcat.manager> 
      <tomcat.manager.username>foo</tomcat.manager.username> 
      <tomcat.manager.password>bar</tomcat.manager.password> 
     </properties> 
    </profile> 
    ... 
</profiles>  

Dann werden Sie nur X-mal der mvn Befehl, mit dem angemessenen Parameter ausführen müssen (-Denv = foo1, -Denv = foo2, ...)


Zusätzlich dazu können Sie diese Lösung durch uns verbessern die Matrix-Funktion des Continuous Integration-Servers Hudson. Ich habe eine kurze Erklärung zu diesem Feature here gegeben.

Im Grunde definieren Sie einfach einen "normalen" Maven2-Job in Hudson, und mit der Matrix-Funktion können Sie Hudson bitten, diesen Job mehrmals auszuführen, einen pro Umgebung. In anderen Worten, erstellen Sie Ihre Hudson Job, und dann mit allen möglichen Wert für die env Parameter, um die "Umwelt-Achse" Sie definieren:

  • foo1
  • foo2
  • foo3
  • ..
  • .

Hudson wird dann die Anwendung mit dem mvn Befehl bauen und mit dem Parameter -De nv = foo1 .Sobald diese Build fertig ist, wird es die gleiche Anwendung bauen, aber mit dem Parameter -Denv = foo2, und so weiter ...

Auf diese Weise wird Hudson Ihre Anwendung in allen Umgebungen einsetzen. ..

ich meine Lösung hoffen, dass Sie Ihre Ziele erreichen helfen ...

+1

Heiliger Mist, das ist potentiell sehr nützlich, da Hudson genau das ist, was ich mit diesem Ziel anvisierte. – cgp

+0

Lustig ist, das ist ähnlich dem, was der Link, den ich gab, nahelegte, aber es ist nicht genau klar. Ich kann es kaum erwarten, es auszuprobieren. – cgp

+2

Gibt es eine Möglichkeit, dies zu tun, ohne Maven X mal aufrufen zu müssen? scheint mir, dass das erneute Erstellen nur zur Bereitstellung zeitaufwändig ist, und es kann zu inkonsistenten Bereitstellungen über einen Cluster hinaus führen, wenn während dieser Builds eine neue Änderung am Code vorgenommen wurde – maverick

1

Vielleicht gar die „minimalste“ Lösung nicht minimal ist. Wenn Sie Probleme damit haben, dies in maven selbst zu tun, versuchen Sie es mit ant: Erstellen Sie zwei verschiedene Bereitstellungstasks (einen pro Server) und eine andere Aufgabe, die sie als Abhängigkeiten hat. Es gibt mehrere Beispiele, wie Sie mithilfe von ant auf einem Tomcat-Server bereitstellen können. Just google them. Erledigt, müssen Sie die neuen Ameisen Aufgaben in Maven, die überhaupt nicht schwer mit dem antrun-Plugin zu integrieren.

+0

Zutreffend, hoffte ich auf ein Beispiel. – cgp

0

Diese Antwort für Jetty ist und für eine etwas andere Situation, aber man könnte es nützlich sowieso finden.

Bei einem früheren Projekt verwendeten wir Jetty, also schrieb ich ein einfaches Jetty-Deployer-Modul, das periodisch das Maven-Repository scannte und neue Artefakte herunterlud und implementierte, sobald diese verfügbar waren. Dies lief gut auf einer kleinen Gruppe von Staging- und Entwicklungsmaschinen.

Sie können den Code bei Google Code im Polar Rose Jetty Maven Deployer Projekt finden.

Beachten Sie, dass wir dies nur für Entwicklungs- und Staging-Server getan haben. Meiner Meinung nach sollten Produktions-Apps niemals automatisch aktualisiert werden.

8

In Bezug auf die Verwendung mehrerer Profile schien der Lebenszyklus bestimmte Schritte zu duplizieren - z. Die Anzahl der Tests wurde verdoppelt, wenn Profile verwendet wurden, die von Variablen aktiviert wurden. Wir fanden heraus, dass die Verwendung der Catalina-Ameisen-Bibliothek viel effektiver war;) und es ist "minimal". Verwenden Sie "executions" -Element, um das "run" -Ziel an eine Lebenszyklusphase anzuhängen, um es zu rationalisieren, oder nach Paket auszuführen: mvn package antrun: run

Sie könnten ein bisschen mehr Phantasie mit der ant-contrib-Bibliothek bekommen und erstellen eine for-Schleife mit einer Liste von Servern, aber hier ist eine statische Konfiguration für 2 fest codierte Server-URLs.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.6</version> 
    <configuration> 
     <target> 
      <taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask"/> 
      <deploy url="http://tc-app-01:8080/manager" username="manager" password="pass" 
        path="/app-path" war="file:${project.build.directory}/${project.build.finalName}.${project.packaging}" update="true"/> 

      <deploy url="http://tc-app-02:8080/manager" username="manager" password="pass" 
        path="/app-path" war="file:${project.build.directory}/${project.build.finalName}.${project.packaging}" update="true"/> 
     </target> 
    </configuration> 
    <dependencies> 
     <dependency> 
      <groupId>tomcat</groupId> 
      <artifactId>catalina-ant</artifactId> 
      <version>6.0.29</version> 
     </dependency> 
    </dependencies> 
</plugin> 

Die spezifische Version von catalina-ant oben manuell in unserem verteilten Maven-Repository eingesetzt wurde verwendet, kann es im Verzeichnis lib der tomcat-Distribution.

2

Dies ist eine ziemlich späte Antwort auf eine alte Frage, aber ich bin mir ziemlich sicher, dass sich die Leute dafür interessieren werden. Ich habe gerade erreicht, mehrere Deployments mit Maven- und Ant-Tasks auszuführen. Das Geheimnis ist eine macrodef (oder 2 für mich, wie ich heiße meine apps in Anlegesteg einsetzen und brauche einen Krieg und eine XML-Datei zu übertragen) zu verwenden und mit einer Ameise Eigenschaftendatei:

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.7</version> 
    <executions> 
     <execution> 
      <phase>install</phase> 
      <configuration> 
       <tasks> 
        <taskdef name="scp" 
         classname="org.apache.tools.ant.taskdefs.optional.ssh.Scp" 
         classpath="/usr/local/java/ant/lib/ant-jsch.jar:/usr/local/java/ant/lib/jsch-0.1.45.jar" /> 
        <macrodef name="deploy"> 
         <attribute name="server" default="NOT SET" /> 
         <attribute name="file" default="NOT SET" /> 
         <attribute name="todir" default="NOT SET" /> 
         <attribute name="port" default="NOT SET" /> 
         <attribute name="passphrase" default="NOT SET" /> 
         <attribute name="keyfile" default="NOT SET" /> 
         <sequential> 
          <echo message="Deploying to @{server}" /> 
          <echo message="Deploying @{file} to @{todir}" /> 
          <scp 
           file="@{file}" todir="@{todir}" 
           port="@{port}" passphrase="@{passphrase}" 
           keyfile="@{keyfile}" /> 
         </sequential> 
        </macrodef> 
        <macrodef name="deploy-app"> 
         <attribute name="config" default="NOT SET" /> 
         <sequential> 
          <property file="deploy.properties"/> 
          <echo message="Deploying to @{config}" /> 
          <deploy server="${@{config}.jetty.server.host}" 
            file="${project.build.directory}/${project.build.finalName}.${project.packaging}" 
            todir="${@{config}.jetty.server.user}@${@{config}.jetty.server.host}:${@{config}.jetty.server.baseDir}/${@{config}.jetty.server.webappsDir}" 
            port="${@{config}.jetty.server.port}" 
            passphrase="${@{config}.jetty.server.passphrase}" 
            keyfile="/home/steff/.ssh/id_rsa"/> 
          <deploy server="${@{config}.jetty.server.host}" 
            file="${project.build.finalName}.xml" 
            todir="${@{config}.jetty.server.user}@${@{config}.jetty.server.host}:${@{config}.jetty.server.baseDir}/${@{config}.jetty.server.contextDir}" 
            port="${@{config}.jetty.server.port}" 
            passphrase="${@{config}.jetty.server.passphrase}" 
            keyfile="/home/steff/.ssh/id_rsa"/>          
         </sequential> 
        </macrodef>        
        <deploy-app config="home"/>  
        <deploy-app config="wap"/> 
       </tasks> 
      </configuration> 
      <goals> 
       <goal>run</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Dazu Eigenschaftendatei Bedürfnisse so etwas wie zu sein:

home.jetty.server.user= 
home.jetty.server.port= 
home.jetty.server.host= 
home.jetty.server.baseDir= 
home.jetty.server.webappsDir= 
home.jetty.server.contextDir= 
home.jetty.server.passphrase= 
wap.jetty.server.user= 
wap.jetty.server.port= 
wap.jetty.server.host= 
wap.jetty.server.baseDir= 
wap.jetty.server.webappsDir= 
wap.jetty.server.contextDir= 
wap.jetty.server.passphrase= 

etc ... auf einem Block von Option pro Serverkonfiguration von

<deploy-app config="<config>"/> 

der Trick verwendet wird, ist, dass macrodef Attribut @ mit {} als Vorrang vor Immobilienbewertung $ { } in der Ameise.