每个Jenkin的构建和更新依赖项中的增量版本

时间:2016-01-18 19:48:23

标签: java maven jenkins

我有许多Maven项目正在构建我的Jenkins服务器。这些项目彼此依赖,例如

service-base -> java-base -> pom-base

换句话说,Maven项目service-base取决于Maven项目java-base。当然,我的POM文件如下所示:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>my.com</groupId>
  <artifactId>service-base</artifactId>
  <dependencies>
    <dependency>
        <groupId>my.com</groupId>
        <artifactId>java-base</artifactId>
        <version>1.0.0</version>
    </dependency>
  </dependencies>
</project>

问题是我的Maven项目都没有“发布”本身,因为我正在使用持续集成来发布我的更改。目前,我允许在我的Maven仓库中覆盖工件并将所有版本保留在1.0.0。这是因为我每天多次发布我的软件包,并在每次提交新的软件包版本时更改所有POM文件中的版本。

理想情况下,我希望Jenkins能够生成新版本,例如: 1.0.{BUILD_NUMBER}然后为依赖树一直更新依赖关系。

问题:这可能吗?或者是否有人有任何其他版本控制的解决方案?

1 个答案:

答案 0 :(得分:2)

以下是我使用Maven profiles,Maven classifiers和Jenkins parametrized构建的方法。

您可以在相关项目的pom中定义jenkins个人资料(或您喜欢的任何名称)。默认情况下,此配置文件不会处于活动状态,因此您的本地版本将继续照常工作。但是,此配置文件将在Jenkins构建上激活(通过Maven执行中的-Pjenkins选项)。

此配置文件在层次结构顶部的项目中的外观如何:

<profiles>
    <profile>
        <id>jenkins</id>
        <properties>
            <groupId>${project.groupId}</groupId>
            <artifactId>${project.artifactId}</artifactId>
            <version>${project.version}</version>
            <packaging>${project.packaging}</packaging>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>2.5</version>
                    <executions>
                        <execution>
                            <id>generate-default-version</id>
                            <phase>package</phase>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                            <configuration>
                                <classifier>${BUILD_NUMBER}</classifier>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.4</version>
                    <executions>
                        <execution>
                            <id>install-default-version</id>
                            <phase>install</phase>
                            <goals>
                                <goal>install-file</goal>
                            </goals>
                            <configuration>
                                <file>${project.build.directory}/${project.build.finalName}-${BUILD_NUMBER}.${project.packaging}</file>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

个人资料在做什么?

  • 我们正在使用Maven Jar Plugin在包阶段生成同一个项目的另一个人工制品,因此该项目将创建普通jar加上另一个具有BUILD_NUMBER分类器的jar(即{{ 1}}和myproject-1.0.jar
  • 我们还使用Maven安装插件install将额外的人工制品(myproject-1.0-4567.jar)放入本地Maven缓存中(因此它对其他相关项目可见)
  • 我们需要为Install Plugin定义一些属性,否则为安装文件will not work

因此,在Jenkins构建时,您将执行以下操作:

myproject-1.0-4567.jar

Jenkins实际上会将其mvn clean install -Pjenkins -DBUILD_NUMBER=${BUILD_NUMBER} 传递给Maven,后者将使用BUILD_NUMBER个人资料中定义的内容,并使用它作为分类器为我们创建(并安装)一个额外的人工制品。

很好,现在我们使用Jenkins构建号创建了一个动态创建的artefact,可用于其他项目/构建。

但其他项目如何使用呢?
我们在依赖项目中定义另一个配置文件(或者为了一致性再次称为jenkins)并重新定义我们现在在运行时需要的依赖项:

jenkins

注意:我们实际上覆盖了作为配置文件的一部分,并且说我们想要它的特定分类器。哪个分类器? <profiles> <profile> <id>jenkins</id> <dependencies> <dependency> <groupId>com.sample</groupId> <artifactId>test</artifactId> <version>1.1.0</version> <classifier>${BUILD_NUMBER}</classifier> </dependency> </dependencies> </profile> </profiles> 分类器,它将在Jenkins服务器的本地Maven缓存中提供,因为它是由上一版本安装的。

但是,依赖构建如何知道哪个构建号以及动态使用哪个分类器?
使用Jenkins参数化构建和Jenkins Parametrized Trigger插件。

所以,总结一下:

  • 提供商项目定义配置文件以创建其他分类器
  • Consumer项目定义要用作特定分类器依赖关系的配置文件
  • 如果项目是其他人的提供者和其他人的消费者,则可以在同一个人资料中合并上述两种方法
  • 第一个Jenkins构建激活此特定配置文件并将其内部版本号传递给Maven
  • 下游Jenkins构建由第一个触发,它通过参数化插件传递它们的内部版本号
  • 然后,每个下游构建将解析参数指定的分类器,如果需要,还为其自己的构建创建另一个分类器(根据其配置文件)

使用这种方法,本地构建将继续照常工作,不会使用分类器,而Jenkins构建将使用跨越它们的其他分类器。