2013-08-09 23 views
7

Sto provando a creare più profili Maven in un singolo lavoro Jenkins. Ogni profilo cambia un codice e quindi crea un jar eseguendo mvn -Pdev install quindi mvn -Pprod install nella riga di comando (Secondo Maven che utilizza mvn -Pdev,prod install dovrebbe funzionare ma non funziona per me). Qui ci sono i due profili in del mio progetto pom.xml:Creazione di più profili Maven per un singolo lavoro Jenkins

<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> 

Come potrei configurazione Jenkins per costruire automaticamente sia di questi profili per un singolo lavoro Jenkins ogni volta che il lavoro viene colpito per una build? E metti entrambi questi vasi nell'artificiale? Ho pochissima conoscenza di Jenkins e non ci sono molte informazioni su questo sul web.

risposta

9

In Maven, se si utilizza mvn -Pdev,prod, si attivano entrambi i profili contemporaneamente in un unico comando.

Sembra che si desidera 2 distinti corsa del comando, vale a dire qualcosa che si raggiungere sulla riga di comando facendo 2 costruisce:

mvn -Pdev install; mvn -Pprod install 

a Jenkins è possibile raggiungere questo obiettivo con uno

  • un lavoro di progetto in stile libero (con 2 builder di shell che eseguono le attività mvn -P$PROFILE install)
  • 2 lavori di tipo maven (che possono essere concatenati uno dopo l'altro utilizzando "compilazione dopo la creazione di altri progetti").
13

È possibile creare un lavoro matrice Jenkins. Un lavoro matrice consente di eseguire lo stesso lavoro con la modifica delle impostazioni (nel tuo caso: una stringa).

Ogni impostazione di modifica è denominata asse. Nel tuo caso dovresti creare un asse stringa contenente i due valori: dev e prod.

In questo modo il lavoro verrà eseguito due volte, con entrambi i valori.

Tuttavia, l'utilizzo dei profili è pericoloso. Dato che il profilo utilizzato per eseguire il build non è codificato nel vostro manufatto, la pausa "un revisione sorgente dovrebbe sempre portare esattamente lo stesso artefatto bersaglio" contratto di Maven (vedi: http://www.blackbuild.com/how-to-really-use-maven-profiles-without-endangering-your-karma/ per una spiegazione più dettagliata)

Considerare creando due differenti artefatti usando il classificatore (-dev e -prod) o anche meglio: crea due moduli separati della tua build, ognuno dei quali crea solo uno dei tuoi artefatti di destinazione.

+0

Ho un problema che è poco simile a questo.Ho inserito questo link, puoi darci un'occhiata e fammi sapere se hai qualche soluzione. https://stackoverflow.com/questions/48002535/one-profile-properties-are-overriding-with-another-profile-properties-in-maven – SubbaReddy

0

Puoi farlo impostando diversi ID di esecuzione per ogni esecuzione e quindi attivare il comando

mvn -Pdev,prod clean package install

1

Oltre a Matrix di lavoro e Maven molteplici invocazioni in un lavoro free-style, c'è un altro modo: Run top-level Maven targets come passo pre-compilazione ed esegui l'altro comando tramite il plugin maven jenkins.

Assicurarsi che la fase di pre-compilazione utilizzi lo stesso repository maven dell'altro comando fornendo -Dmaven.repo.local=/${whatever-it-is}/${EXECUTOR_NUMBER}.

Si prega di fare riferimento alle altre risposte per i dettagli sul lavoro a matrice, ecc

Problemi correlati