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

Java 每个Jenkin'中的增量版本;s构建和更新依赖项,java,maven,jenkins,Java,Maven,Jenkins,我有许多Maven项目正在我的Jenkins服务器上构建。这些项目相互依赖,例如: service-base -> java-base -> pom-base 换句话说,Maven项目服务库依赖于Maven项目java库。当然,我的POM文件如下所示: 4.0.0 我的网站 服务基地 我的网站 java基础 1.0.0 问题是,我的Maven项目本身都没有“发布”,因为我正在使用持续集成来发布我的更改。目前,我允许在Maven repo中覆盖工件,并将所有版本保持在1.0.0。

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

service-base -> java-base -> pom-base
换句话说,Maven项目
服务库
依赖于Maven项目
java库
。当然,我的POM文件如下所示:


4.0.0
我的网站
服务基地
我的网站
java基础
1.0.0
问题是,我的Maven项目本身都没有“发布”,因为我正在使用持续集成来发布我的更改。目前,我允许在Maven repo中覆盖工件,并将所有版本保持在
1.0.0
。这是因为我每天多次发布包,每次提交新包版本时都会更改所有POM文件中的版本

理想情况下,我希望Jenkins生成一个新版本,例如
1.0.{BUILD_NUMBER}
,然后更新依赖关系树上的所有依赖关系


问题:这可能吗?或者有没有其他版本控制解决方案

以下是我如何通过使用Maven、Maven和Jenkins构建来实现相同的功能

您可以在相关项目的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>
Jenkins将把它的
BUILD\u编号
传递给Maven,Maven将按照
Jenkins
配置文件中的定义使用它,并使用它作为分类器为我们创建(并安装)一个额外的人工制品

好的,现在我们有了一个使用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>

詹金斯
com.sample
插件

因此,总结一下:

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

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

这是一个多模块项目吗?在这种情况下,版本控制只在父/根级别进行,并且
maven release plugin
自动更新每个POM中的版本。不,这是许多独立的maven项目。那么为什么它们遵循相同的发布周期呢?因为它们是不断集成的。当我向
javabase
包提交代码时,我的CI服务器会构建它。一旦
javabase
构建成功,则必须重建
server base
以使用新的更改。Jenkins负责自动建立依赖关系树,但它不处理版本控制。但是生成的1.0.{BUILD_NUMBER}也将是项目/人工制品的新版本,或者您只需要为Jenkins提供它,同时将发布的人工制品保持在1.0(甚至更复杂)?
<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>