web-dev-qa-db-fra.com

Maven pour Jenkins

J'essaie de créer plusieurs profils Maven dans un seul travail Jenkins. Chaque profil modifie du code, puis crée un fichier jar en exécutant mvn -Pdev install, puis mvn -Pprod install dans la ligne de commande (selon Maven, utiliser mvn -Pdev,prod install est censé fonctionner, mais cela ne fonctionne pas pour moi). Voici les deux profils dans le pom.xml de mon projet:

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

Comment configurer Jenkins pour créer automatiquement ces deux profils pour un seul travail Jenkins chaque fois que le travail est recherché? Et mettre ces deux pots dans l'Artifactory? Je connais très peu Jenkins et il n’ya pas beaucoup d’informations à ce sujet sur le Web.

10
user2639215

Vous pouvez créer un travail de matrice Jenkins. Un travail matriciel permet d'exécuter le même travail avec des paramètres modifiés (dans votre cas, une chaîne).

Chaque réglage est appelé un axe. Dans votre cas, vous créeriez un axe de chaîne contenant les deux valeurs: dev et prod.

Ainsi, votre travail sera exécuté deux fois, avec les deux valeurs.

Cependant: votre utilisation des profils est dangereuse. Étant donné que le profil utilisé pour exécuter la construction n'est pas codifié dans votre artefact, votre contrat "Maven" doit toujours aboutir au même artefact cible "(voir: http://www.blackbuild.com/ comment-vraiment-utiliser-profils-maven-sans-mettre en danger votre karma/ pour une explication plus détaillée)

Pensez à créer deux artefacts différents à l'aide du classificateur (-dev et -prod), voire mieux: créez deux modules distincts de votre construction, chacun ne créant qu'un seul de vos artefacts cibles.

15
blackbuild

Dans Maven, si vous utilisez mvn -Pdev,prod, vous activez les deux profils simultanément en une seule commande.

Il semble que vous souhaitiez 2 exécutions distinctes de la commande, c’est-à-dire quelque chose que vous obtiendriez sur la ligne de commande en effectuant 2 versions:

mvn -Pdev install; mvn -Pprod install

En Jenkins, vous pouvez y parvenir avec

  • un travail de projet de style libre (avec 2 constructeurs de shell exécutant les tâches mvn -P$PROFILE install)
  • 2 tâches de type maven (que vous pouvez chaîner les unes après les autres en utilisant "build après la construction d'autres projets").
11
coffeebreaks

En plus du travail Matrix et de plusieurs invocations maven dans un travail de style libre, il existe un autre moyen: Run top-level Maven targets en tant qu'étape de pré-génération et exécutez l'autre commande via le plugin maven jenkins.

Assurez-vous que l'étape de pré-génération utilise le même référentiel maven que l'autre commande en fournissant -Dmaven.repo.local=/${whatever-it-is}/${EXECUTOR_NUMBER}.

Veuillez vous reporter à d’autres réponses pour des détails sur le travail matriciel, etc.

1
phani

Vous pouvez le faire en définissant différents identificateurs d’exécution à chaque exécution, puis en déclenchant la commande. 

mvn -Pdev,prod clean package install

0