为单个Jenkins作业构建多个Maven配置文件

为单个Jenkins作业构建多个Maven配置文件,maven,build,jenkins,artifactory,Maven,Build,Jenkins,Artifactory,我正试图在一个Jenkins工作中构建多个Maven配置文件。每个概要文件都会更改一些代码,然后通过在命令行中执行mvn-Pdev install然后mvn-Pprod install来创建一个jar(根据Maven使用mvn-Pdev的说法,prod install应该可以工作,但对我来说不起作用)。以下是我的项目的pom.xml中的两个概要文件: <profiles> <!-- prod profile --> <profile> &

我正试图在一个Jenkins工作中构建多个Maven配置文件。每个概要文件都会更改一些代码,然后通过在命令行中执行
mvn-Pdev install
然后
mvn-Pprod install
来创建一个jar(根据Maven使用
mvn-Pdev的说法,prod install
应该可以工作,但对我来说不起作用)。以下是我的项目的
pom.xml
中的两个概要文件:

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

戳
com.google.code.maven-replacer-plugin
替代者
1.5.2
过程资源
代替
src/main/java/com/IQzone/android/configuration/AbstractHoldingRefreshable.java
真的
土司开关
maven jar插件
包裹
罐子
戳
发展
com.google.code.maven-replacer-plugin
替代者
1.5.2
过程资源
代替
src/main/java/com/IQzone/android/configuration/AbstractHoldingRefreshable.java
土司开关
真的
org.apache.maven.plugins
maven编译器插件
1.6
1.6
maven surefire插件
真的
maven jar插件
包裹
罐子
发展

我该如何设置Jenkins,以便在一个Jenkins作业需要生成时,自动为该作业生成这两个配置文件?把这两个罐子都放进人工制品厂?我对Jenkins知之甚少,网上也没有太多关于这方面的信息。

在Maven中,如果您使用
mvn-Pdev,prod
,那么您可以在一个命令中同时激活两个配置文件

似乎您需要两次不同的命令运行,也就是说,通过执行两次构建,您可以在命令行上实现以下目标:

mvn -Pdev install; mvn -Pprod install
在詹金斯,你可以通过以下两种方式实现这一点:

  • 一个自由风格的项目作业(两个shell构建器运行
    mvn-P$PROFILE安装任务)
  • 2个maven类型的作业(可以使用“在构建其他项目之后构建”一个接一个地链接)

您可以创建Jenkins矩阵作业。矩阵作业允许同一作业在更改设置的情况下运行(在本例中为字符串)

每个更改的设置称为轴。在本例中,您将创建一个包含两个值的字符串轴:dev和prod

这样,您的作业将运行两次,同时具有两个值

但是:您使用配置文件是危险的。由于用于运行构建的概要文件没有被编码到您的工件中,因此您打破了Maven的“一个源版本应该总是导致完全相同的目标工件”合同(请参阅:以获得更详细的解释)


考虑使用分类器(-dev和-prod)创建两个不同的工件,或者更好:创建构建的两个单独模块,每个模块只创建一个目标工件。

您可以通过为每个执行设置不同的执行ID,然后触发命令来实现


mvn-Pdev,prod clean package install

除了矩阵作业和自由风格作业中的多个maven调用之外,还有另一种方法:
作为预构建步骤运行顶级maven目标
,并通过maven jenkins插件运行其他命令

通过提供
-Dmaven.repo.local=/${which it}/${EXECUTOR_NUMBER}
确保预构建步骤使用与其他命令相同的maven repo


有关矩阵作业等的详细信息,请参阅其他答案。

我有一个与此类似的问题。我已经在这个链接,你可以看看它,让我知道如果你有任何解决方案。