这是我使用 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(即 myproject-1.0.jar 和 @987654333 @)
- 我们还使用 Maven 安装插件将 install 附加工件(
myproject-1.0-4567.jar)放入本地 Maven 缓存(因此其他相关项目可以看到)
- 我们需要为安装插件定义一些属性,否则安装文件will not work
因此,在构建 Jenkins 时,您将执行以下操作:
mvn clean install -Pjenkins -DBUILD_NUMBER=${BUILD_NUMBER}
Jenkins 实际上会将其 BUILD_NUMBER 传递给 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>
注意:作为配置文件的一部分,我们实际上覆盖了依赖项,并说我们需要特定的分类器。哪个分类器? BUILD_NUMBER 分类器,将在 Jenkins 服务器的本地 Maven 缓存中可用,因为之前的构建已安装。
但是依赖构建如何动态地知道哪个构建号以及要使用哪个分类器?
使用 Jenkins 参数化构建和 Jenkins Parametrized Trigger 插件。
所以,总结一下:
- Provider 项目定义配置文件以创建额外的分类器
- 消费者项目定义配置文件以用作特定分类器的依赖项
- 如果一个项目是其他人的提供者和其他人的消费者,那么它可以将上述两种方法合并到同一个配置文件中
- 第一个 Jenkins 构建会激活此特定配置文件并将其内部版本号传递给 Maven
- 下游 Jenkins 构建由第一个触发,它通过参数化插件将其构建号传递给它们
- 然后每个下游构建将解析参数指定的分类器,如果需要,还为自己的构建创建另一个分类器(根据其配置文件)
使用这种方法,您的本地构建将继续照常工作,并且不会使用任何分类器,而 Jenkins 构建将使用在它们之间使用的额外分类器。