使用Jenkins构建编号进行Maven安装/部署

4

更新 #1 9/18

我的公司决定彻底重新设计开发/发布周期以适应不断增长的开发人员数量。

git流程将类似于成功的分支模型,但会有一些变化。开发人员不再直接对“develop”分支进行推送访问,他们需要提出合并/拉取请求,并进行代码审核和基本单元测试。

版本系统将采用 Major.Minor.Patch,其中 Major 版本标记向后兼容性断裂,Minor 版本标记新功能和小错误修复,而 Patch 标记重要的热修复。这个新版本系统将删除 Jenkins 构建编号作为有用信息,但将其附加到部署的工件中以供历史记录。

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

发布过程将包括:

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

原始帖子

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

我的问题是 Maven install/deploy 不会遵循 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版本,使其能够部署该更新版本?


看起来类似于这个:https://dev59.com/YnM_5IYBdhLWcg3wyWWt - Anton Arhipov
@Anton,那个问题很相似,但是我的buildNumber总是由于配置文件默认为0而被解析。我的解决方案百分之百有效,但由于项目版本中的表达式,被Maven认为是不良实践。 - Nick Johnson
1个回答

1

Maven的方式是说,只有在发布代码时才更改版本,并且相同版本的两个连续构建应该产生相同的输出。

在您的情况下,您正在违反这两个“好习惯”。

如果真的每个提交都是一个新的发布版本,那么您所做的听起来并不太错(但对我来说听起来很有趣)。其中一个缺点是看起来您没有从VCS创建标记(这是另一个好习惯)。

老实说,我无法相信每个提交都是可供生产使用的发布版本。即使在连续交付环境中,每个提交都需要通过大量自动化测试,有时也会被拒绝修订(可能是出于功能或性能原因)。


我的公司使用“主线”Git存储库,从开发者克隆中接受合并/拉取请求。由于每个合并都经过广泛的自动化和手动测试,因此只有通过测试的合并/拉取请求才会被接受,这就是为什么每个合并都被视为生产就绪版本的原因。 - Nick Johnson
那听起来不错。您不想在每次构建中执行 mvn release 有什么原因吗?这将消除不良实践,同时仍然为您提供唯一的版本。 - Augusto
说实话,当前的工作流是由极其新手的Maven开发人员创建的,并且发布/部署策略根本没有实施。构件是手动从Jenkins中提取出来的。我正在尝试将其清理到我们可以拥有持续集成的程度,同时尽可能保持我们当前的工作流程。由于Jenkins通过构建编号和手动Major.Minor版本提交来控制我们的版本控制,因此我将分析我们的版本控制工作流程。在CI和敏捷工作流程中,快照似乎不值得,我也没有看到一个好的例子。 - Nick Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接