【问题标题】:Maven install/deploy with Jenkins build number使用 Jenkins 内部版本号安装/部署 Maven
【发布时间】:2023-03-11 20:58:01
【问题描述】:

更新 #1 9/18

我的公司决定彻底改变他们的开发/发布周期,以适应越来越多的开发人员。

git 进程将与successful branching model 类似,但有一些变化。开发人员不需要直接推送访问“develop”分支,而是需要提出合并/拉取请求,需要代码审查和基本单元测试。

版本系统将是 Major.Minor.Patch,其中主要版本标记向后兼容性中断,次要版本标记新功能和小错误修复,而补丁标记关键热修复。这个新版本系统将删除 Jenkins 内部版本号作为有用信息,但将其附加到已部署的工件以用于历史目的。

Jenkins 将跟踪“开发”分支以构建 SNAPSHOT 并将其部署到我们的本地 Nexus,因此开发人员可以使用未发布但已接受的功能。 Jenkins 还将跟踪“master”分支以构建和部署发布工件。

发布过程将:

  • 根据发布的功能更新 POM 版本
  • Git 用新版本标记分支
  • 执行单元、集成和系统测试。
  • 构建、混淆和部署发布工件到我们的 Nexus
  • 将“develop”分支版本更新为“Major.Minor++-SNAPSHOT”,以获取新的开发 SNAPSHOT。

原帖

我正在尝试构建一个模糊的 JAR 库,使用基于 Jenkins/Hudson 构建的动态构建号,并部署到内部 Sonatype Nexus。

我的问题是 Maven 安装/部署不遵守对 finalName 的更改,并且使用如下表达式设置版本被认为是“不好的做法”:

    <version>1.0.${buildNumber}</version>

尽管这是一种不好的做法,但它可以正确安装/部署具有正确版本的工件,包括本地和远程。内部版本号基于一对配置文件,这些配置文件与 Jenkins 构建系统的内部版本号环境变量的存在相关联,并且在没有该变量的情况下默认为 0:

    <profile>
        <id>static_build_number</id>
        <activation>
            <property>
                <name>!env.BUILD_NUMBER</name>
            </property>
        </activation>
        <properties>
            <buildNumber>0</buildNumber>
        </properties>
    </profile>
    <profile>
        <id>dynamic_build_number</id>
        <activation>
            <property>
                <name>env.BUILD_NUMBER</name>
            </property>
        </activation>
        <properties>
            <buildNumber>${env.BUILD_NUMBER}</buildNumber>
        </properties>
    </profile>

我们不使用 SNAPSHOT 版本,因为任何提交并推送到 Nexus 的版本都被视为经过测试的发布版本。

是否有一种“正确”的方法可以根据 Jenkins/Hudson 动态内部版本号设置 Maven 版本,从而允许使用该更新版本进行部署?

【问题讨论】:

  • 看起来和这个类似:*.com/questions/1230015/…
  • @Anton,这个问题很相似,但由于配置文件设置默认为 0,我的 buildNumber 始终得到解决。我的解决方案在 100% 的时间内有效,但由于 Maven 被认为是不好的做法项目版本中的表达式。

标签: java maven jenkins hudson version


【解决方案1】:

maven 方法说版本仅在您发布代码时才会更改,并且相同版本的两个连续构建应该产生相同的输出。

在您的情况下,您违反了这两个良好做法

如果真的每一个提交都是一个新版本,那么你所做的听起来并没有什么大错(但对我来说听起来确实很有趣)。一个缺点是它看起来不像是从 VCS 创建标签(这是另一种好的做法)。

我会说实话。我不敢相信每次提交都是生产就绪版本。我从未见过这种情况,即使在持续交付环境中,每次提交都需要通过大量自动化测试,有时修订会被拒绝(可能出于功能或性能原因)。

【讨论】:

  • 我的公司使用“主线”Git 存储库,接受来自开发人员克隆的合并/拉取请求。合并/拉取请求仅在经过广泛的自动化和手动测试后才被接受,因此每次合并都被视为生产就绪版本。
  • 那听起来不错。您是否有任何理由不想在每个构建中都使用mvn release?这将消除不好的做法,仍然给你一个独特的版本。
  • 老实说,当前的工作流是由对 Maven 非常陌生的开发人员创建的,而发布/部署策略根本没有实施。人工制品是从 Jenkins 中手动拉出的。我正在尝试将其清理到可以进行持续集成的程度,同时尽可能多地维护我们当前的工作流程。由于 Jenkins 通过内部版本号和手动 Major.Minor 版本提交来控制我们的版本控制,我将分析我们的版本控制工作流程。 CI 和敏捷工作流程中的 SNAPSHOTS 似乎不值得,而且我还没有看到一个很好的例子。