2013-08-09 8 views
7

Ich versuche, mehrere Maven-Profile in einem einzelnen Jenkins-Job zu erstellen. Jedes Profil ändert etwas Code und erstellt dann ein Glas durch Ausführen von mvn -Pdev install dann mvn -Pprod install in der Befehlszeile (Laut Maven mit mvn -Pdev,prod install soll funktionieren, aber es funktioniert nicht für mich). Hier sind die beiden Profile in meinem Projekt pom.xml:Erstellen mehrerer Maven-Profile für einen einzelnen Jenkins-Job

<profiles> 
<!-- prod profile --> 
    <profile> 
    <id>prod</id> 
    <build> 
     <plugins> 

      <plugin> 
       <groupId>com.google.code.maven-replacer-plugin</groupId> 
       <artifactId>replacer</artifactId> 
       <version>1.5.2</version> 

       <executions> 
        <execution>      
         <phase>process-resources</phase> 
         <goals> 
          <goal>replace</goal> 
         </goals> 
        </execution> 
       </executions> 

       <configuration> 

         <file>src/main/java/com/IQzone/android/configuration/AbstractHoldingRefreshable.java</file> 
        <replacements> 
         <replacement> 
          <token>TrUe</token> 
          <value>TOAST_SWITCH</value> 
         </replacement> 
        </replacements> 

       </configuration> 

      </plugin> 

     <plugin> 
      <artifactId>maven-jar-plugin</artifactId> 
      <executions> 
      <execution> 
       <phase>package</phase> 
       <goals> 
       <goal>jar</goal> 
       </goals> 
       <configuration> 
       <classifier>prod</classifier> 
       </configuration> 
      </execution> 
      </executions> 
     </plugin> 
     </plugins> 
    </build> 
    </profile> 


<!-- dev profile --> 
    <profile> 
    <id>dev</id> 
    <build> 
     <plugins> 

      <plugin> 
       <groupId>com.google.code.maven-replacer-plugin</groupId> 
       <artifactId>replacer</artifactId> 
       <version>1.5.2</version> 

       <executions> 
        <execution>      
         <phase>process-resources</phase> 
         <goals> 
          <goal>replace</goal> 
         </goals> 
        </execution> 
       </executions> 

       <configuration> 

        <file>src/main/java/com/IQzone/android/configuration/AbstractHoldingRefreshable.java</file> 
        <replacements> 
         <replacement> 
          <token>TOAST_SWITCH</token> 
          <value>TrUe</value> 
         </replacement> 
        </replacements> 

       </configuration> 

      </plugin> 

      <!-- build project with JAVA 1.6 --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 


     <plugin> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
      <skip>true</skip> 
      </configuration> 
     </plugin> 
     <plugin> 
      <artifactId>maven-jar-plugin</artifactId> 
      <executions> 
      <execution> 
       <phase>package</phase> 
       <goals> 
       <goal>jar</goal> 
       </goals> 
       <configuration> 
       <classifier>dev</classifier> 
       </configuration> 
      </execution> 
      </executions> 
     </plugin> 



     </plugins> 
    </build> 
    </profile> 
</profiles> 

Wie würde ich Setup Jenkins automatisch baut beiden Profile für einen einzelnen Jenkins Job, wenn der Job für einen Build getroffen wird? Und stelle diese beiden Gläser in das Artefakt? Ich habe sehr wenig Jenkins Wissen und es gibt nicht viele Informationen darüber im Internet.

Antwort

9

In Maven, wenn Sie mvn -Pdev,prod verwenden, dann aktivieren Sie beide Profile gleichzeitig in einem Befehl.

Es scheint, dass Sie 2 verschiedene Lauf des Befehls wollen, also etwas, das Sie auf der Kommandozeile 2 erreichen würde, indem Sie baut:

mvn -Pdev install; mvn -Pprod install 

In jenkins Sie dies erreichen können entweder

  • ein kostenloser Style-Projekt-Job (mit 2 Shell-Buildern, die die mvn -P$PROFILE install Tasks ausführen)
  • 2 Maven-Typ-Jobs (die Sie hintereinander ketten können, indem Sie "Build nach anderen Projekten bauen" verwenden).
13

Sie könnten einen Jenkins-Matrix-Job erstellen. Ein Matrixjob ermöglicht die Ausführung desselben Jobs mit sich ändernden Einstellungen (in Ihrem Fall eine Zeichenfolge).

Jede sich ändernde Einstellung wird als Achse bezeichnet. In Ihrem Fall würden Sie eine String-Achse erstellen, die die zwei Werte enthält: dev und prod.

So würde Ihr Job zweimal laufen, mit beiden Werten.

Allerdings: Ihre Verwendung von Profilen ist gefährlich. Da das Profil, das zum Ausführen des Builds verwendet wird, nicht in Ihrem Artefakt kodifiziert ist, sollten Sie die "eine Quellrevision sollte immer zu genau dem gleichen Zielartefakt führen" Vertrag von Maven (siehe: http://www.blackbuild.com/how-to-really-use-maven-profiles-without-endangering-your-karma/ für eine detailliertere Erklärung)

Betrachten Erstellen Sie entweder zwei verschiedene Artefakte mithilfe von Classifier (-dev und -prod) oder noch besser: Erstellen Sie zwei separate Module Ihres Builds, von denen jeder nur eines Ihrer Zielartefakte erstellt.

+0

Ich habe ein Problem, das wenig ähnlich ist.Ich habe in diesen Link gesetzt, können Sie bitte einen Blick darauf werfen und lassen Sie mich wissen, wenn Sie irgendeine Lösung haben. https://stackoverflow.com/questions/48002535/one-profile-properties-are-riding-with-another-profile-properties-in-maven – SubbaReddy

0

Sie können es tun, indem unterschiedliche Ausführungs ids zu jeder Ausführung einstellen und dann lösen Sie den Befehl

mvn -Pdev,prod clean package install

1

Zusätzlich Anrufungen Job und mehr Maven Matrix in einer Job-Kür, gibt es eine andere Art und Weise: Run top-level Maven targets als Pre-Build-Schritt und führen Sie den anderen Befehl über maven jenkins plugin.

Stellen Sie sicher, dass der Pre-Build-Schritt das gleiche Maven-Repo wie der andere Befehl verwendet, indem Sie -Dmaven.repo.local=/${whatever-it-is}/${EXECUTOR_NUMBER} bereitstellen.

Bitte beziehen Sie sich auf andere Antworten für Details über Matrix-Job, etc.

Verwandte Themen