我有许多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}
然后为依赖树一直更新依赖关系。
问题:这可能吗?或者是否有人有任何其他版本控制的解决方案?
答案 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>
个人资料在做什么?
BUILD_NUMBER
分类器的jar(即{{ 1}}和myproject-1.0.jar
)myproject-1.0-4567.jar
)放入本地Maven缓存中(因此它对其他相关项目可见)因此,在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插件。
所以,总结一下:
使用这种方法,本地构建将继续照常工作,不会使用分类器,而Jenkins构建将使用跨越它们的其他分类器。