【问题标题】:Increment version in every Jenkin's build and update dependencies在每个 Jenkins 的构建和更新依赖项中增加版本
【发布时间】:2016-04-24 02:30:55
【问题描述】:

我有许多 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} 然后为它更新依赖关系树的依赖关系。

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

【问题讨论】:

  • 这是一个多模块项目吗?在这种情况下,版本控制只是在父/根级别处理,maven-release-plugin 会自动更新每个 POM 中的版本。
  • 不是,是很多独立的Maven项目。
  • 那为什么它们遵循相同的发布周期?
  • 因为它们是不断集成的。当我将代码提交到 java-base 包时,我的 CI 服务器会构建它。成功构建 java-base 后,必须重新构建 server-base 以使用新更改。 Jenkins 负责自动构建依赖树,但它不处理版本控制。
  • 但是生成的 1.0.{BUILD_NUMBER} 也将是项目/人工制品的新版本,或者您只是为 Jenkins 拥有它,同时将发布的人工制品保持在 1.0(甚至更复杂)?

标签: java maven jenkins


【解决方案1】:

这是我使用 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 构建将使用在它们之间使用的额外分类器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2016-11-10
    • 2015-02-14
    • 2020-10-20
    • 2020-07-24
    • 2019-01-17
    • 2022-01-22
    相关资源
    最近更新 更多