2013-08-09 9 views
7

Próbuję utworzyć wiele profili Mavena w jednym zadaniu Jenkinsa. Każdy profil zmienia kod, a następnie tworzy słoik, wykonując mvn -Pdev install następnie mvn -Pprod install w linii poleceń (według Mavena użycie mvn -Pdev,prod install ma działać, ale nie działa dla mnie). Oto dwa profile w moim projektu pom.xml:Budowanie wielu profili Mavela dla pojedynczego zadania Jenkinsa

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

Jak bym setup Jenkins do automatycznego budowania obu tych profili dla pojedynczego zadania Jenkins, gdy praca jest trafiony na budowie? I umieść oba te słoiki w Artifactory? Mam bardzo małą wiedzę Jenkinsa i nie ma zbyt wielu informacji na ten temat w Internecie.

Odpowiedz

9

W Maven, jeśli używasz mvn -Pdev,prod, aktywujesz oba profile jednocześnie w jednym poleceniu.

Wydaje chcesz 2 odrębną serię polecenia, czyli coś, co można osiągnąć w linii poleceń, wykonując 2 buduje:

mvn -Pdev install; mvn -Pprod install 

W Jenkins można to osiągnąć albo z

  • jedno wolne zadanie projektowe (z dwoma builderami powłoki wykonującymi zadania mvn -P$PROFILE install)
  • 2 zadania typu maven (które można łańcuchować po sobie za pomocą "kompilacji po zbudowaniu innych projektów").
13

Można utworzyć zadanie macierzy Jenkins. Zadanie macierzy pozwala na uruchamianie tego samego zadania przy zmianie ustawień (w twoim przypadku: ciąg).

Każde zmienne ustawienie jest nazywane osią. W twoim przypadku stworzysz oś łańcuchową zawierającą dwie wartości: dev i prod.

W ten sposób twoja praca przebiegałaby dwukrotnie, z obydwoma wartościami.

Jednak: używanie profili jest niebezpieczne. Ponieważ profil używany do uruchomienia kompilacji nie jest skodyfikowany w twoim artefakcie, twoja przerwa "jedna wersja źródłowa powinna zawsze prowadzić do dokładnie tego samego docelowego artefaktu" kontrakt Mavena (zobacz: http://www.blackbuild.com/how-to-really-use-maven-profiles-without-endangering-your-karma/ dla bardziej szczegółowego wyjaśnienia)

Zastanów się tworzenie dwóch różnych artefaktów za pomocą klasyfikatora (-dev i -prod) lub jeszcze lepiej: twórz dwa osobne moduły swojej kompilacji, z których każda tworzy tylko jeden z Twoich docelowych artefaktów.

+0

mam problem, który jest nieco podobny do tego.Umieściłem w tym linku, proszę zajrzyj do niego i daj mi znać, jeśli masz jakieś rozwiązanie. https://stackoverflow.com/questions/48002535/one-profile-properties-are-overriding- with-another-profile-properties-in-maven – SubbaReddy

0

Można to zrobić poprzez ustawienie różnych identyfikatorów wykonanie każdej realizacji, a następnie wywołać komendę

mvn -Pdev,prod clean package install

1

Oprócz matrycy wywołania pracy i wielokrotnego Maven w pracy free-style, istnieje inny sposób: Run top-level Maven targets jako etap wstępnej kompilacji i uruchom inne polecenie za pomocą wtyczki maven jenkins.

Upewnij się, że etap wstępnej kompilacji używa tego samego polecenia repo co drugiego polecenia, podając -Dmaven.repo.local=/${whatever-it-is}/${EXECUTOR_NUMBER}.

Proszę odnieść się do innych odpowiedzi Szczegółowe informacje na temat pracy macierzy itd

Powiązane problemy