在进行持续交付时,自动项目版本的Maven方式是什么?

ams*_*ams 52 java continuous-integration maven-3 maven continuous-delivery

我有一个Web应用程序,我们可以在功能准备就绪时部署到生产环境,有时可能每天运行几次,有时可能需要几周时间才能发布.

目前,我们没有为我们的项目增加我们的版本号,而且所有版本都在版本中0.0.1-SNAPSHOT保存了一年多.我想知道为Web应用程序进行持续交付的Maven方式是什么.在每次提交时提高版本号并且从不像我们现在所做的那样碰撞版本号似乎有点过分,似乎也是错误的.

对于此类Maven使用,建议的最佳做法是什么?

问题实际上是双重问题:

  • 在单个pom.xml文件中推进项目版本号(可以有很多).
  • 更新所有相关组件中的版本号以使用彼此的最新版本号.

Mar*_*nor 45

我推荐以下演示文稿,讨论使用Maven进行持续交付的实际情况:

关键点是每个构建都是一个潜在的版本,所以不要使用快照.

  • 该视频相当不错,可以帮助您加载.@ 23m35s在视频中,我要指出Maven应该进行大部分短期运行的健全性验证,例如单元测试,覆盖检查,集成测试等......但是,持续交付并不止于此.对于规模较大的SOA类型的组织,将管道分解为谨慎的阶段实际上是非常好的做法,例如使用模拟端点的功能测试,性能测试,大型集成测试,UAT测试,合规性验证,静态代码分析,安全性审查等. (2认同)

ams*_*ams 36

这是我根据Mark O'Connor的回答链接的视频摘要.

  • 该解决方案需要像git这样的DVCS和像Jenkins这样的CI服务器.
  • 不要在Continuous Delivery管道中使用快照构建,也不要使用maven release插件.
  • 快照版本,如1.0-SNAPSHOT都变成了现实版本,如1.0.buildNumberbuildNumber是詹金斯作业号.

算法步骤:

  1. Jenkins使用源代码克隆git repo,并说源代码有版本 1.0-SNAPSHOT
  2. Jenkins创建了一个名为git的分支,1.0.JENKINS-JOB-NUMBER因此快照版本变成了真实版本1.0.124
  3. Jenkins调用maven版本插件将pom.xml文件中的版本号从1.0-SNAPSHOT更改为1.0.JENKINS-JOB-NUMBER
  4. 詹金斯援引 mvn install
  5. 如果mvn install成功,那么Jenkins将提交分支,1.0.JENKINS-JOB-NUMBER并且在git中使用适当的标记创建真正的非快照版本以便稍后再现.如果mvn install失败,那么Jenkins将删除新创建的分支并使构建失败.

我强烈推荐Mark的答案链接的视频.

  • 在我的情况下,它甚至不是一个多模块.我有依赖于项目B的项目A.项目B有自己的Jenkins作业,可能有一个生成已发布工件的提交.然后,项目A需要在pom中引用该已发布的工件.您是否建议在项目B的构建成功并且工件可用时手动更新项目A?项目B是一个核心项目,而项目A是一个Web应用程序,因此它们是耦合的,但在更新项目A对项目B的依赖性方面有很大的开销,特别是当您在IDE中查看使用SNAPSHOT依赖项查看更改时. (5认同)
  • 您如何处理多模块Maven项目?您是否发布了整个项目以及所有具有相同版本的子级?如果我有一个依赖于B的项目A,并且在项目B中进行了提交,则为B触发上述步骤,然后为项目A触发上述步骤,但是A如何知道B的版本? (2认同)
  • 它是一个多模块项目,然后经验告诉我,拥有一个单一版本是有意义的-与版本插件保持一致。如果某些模块不经常更改,那么它们也可能是从工件仓库中拉入的单独组件,例如log4j,sl4fj ... (2认同)

Pio*_*zda 18

从Maven 3.2.1开始,支持开箱即用的交付友好版本:https://issues.apache.org/jira/browse/MNG-5576 您可以在版本中使用3个预定义变量:

${changelist}
${revision}
${sha1}
Run Code Online (Sandbox Code Playgroud)

所以你基本上做的是:

  1. 将您的版本设置为eg 1.0.0-${revision}.(您可以使用mvn versions:set在多模块项目中快速正确地执行此操作.)
  2. <revision>SNAPSHOT</revision>为当地发展投入房产.
  3. 在CI环境中运行mvn clean install -Drevision=${BUILD_NUMBER}或类似甚至是这样的mvn clean verify -Drevision=${BUILD_NUMBER}.

您可以使用例如https://wiki.jenkins-ci.org/display/JENKINS/Version+Number+Plugin来生成有趣的构建号.

一旦发现构建稳定(例如通过验收测试),您就可以将版本推送到Nexus或其他存储库.任何不稳定的构建都会变成垃圾.


msz*_*ach 9

有一些很好的讨论和建议如何处理maven版本号和持续交付(CD)(我将在我的部分答案之后添加它们).

首先我对SNAPSHOT版本的看法.在maven中,SNAPSHOT显示当前正在开发到SNAPSHOT后缀之前的特定版本.因此,像Nexus或maven-release-plugin这样的工具对SNAPSHOTS有特殊的处理方式.对于Nexus,它们存储在一个单独的存储库中,并允许使用相同的SNAPSHOT版本更新多个人工制品.所以SNAPSHOT可以在你不知道的情况下改变(因为你永远不会增加你的pom中的任何数字).因此,我不建议在项目中使用SNAPSHOT依赖项,特别是在CD世界中,因为构建不再可靠.

由于上述原因,当您的项目被其他项目使用时,SNAPSHOT作为项目版本将是一个问题.

对我来说,SNAPSHOT的另一个问题是不再可追溯或可重复.当我在生产中看到版本0.0.1-SNAPSHOT时,我需要进行一些搜索以找出它是从构建的修订版本构建的.当我在文件系统上找到该软件的版本时,我需要查看pom.properties或MANIFEST文件,看看这是旧垃圾还是最新最好的版本.

为了避免手动更改版本号(特别是当您每天构建多个版本时),让构建服务器为您更改编号.所以对于开发我会选择

<major>.<minor>-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)

版本,但在构建新版本时,构建服务器可以用更独特和可追踪的东西替换SNAPSHOT.

例如其中一个:

<major>.<minor>-b<buildNumber>
<major>.<minor>-r<scmNumber>
Run Code Online (Sandbox Code Playgroud)

因此,主要和次要数字可用于营销问题或仅显示达到新的重要里程碑,并且可以在您需要时手动更改.buildNumber(来自Continuous Integration服务器的编号)或scmNumber(SUbversion或GIT的修订版)使每个版本都是唯一且可追踪的.使用buildNumber或Subversion修订时,项目版本甚至可以排序(不使用GIT编号).使用buildNumber或scmNumber也很容易看出此版本中有哪些更改.

另一个例子是使用的stackoverflow的版本控制

<year>.<month>.<day>.<buildNumber>
Run Code Online (Sandbox Code Playgroud)

这里缺少链接:


use*_*272 7

不要这样做!

<Major>.<minor>-<build>
Run Code Online (Sandbox Code Playgroud)

因为Maven在连字符之后将任何东西视为LEXICAL,所以会在背后咬你.这意味着版本1将在词法上高于10.

这很糟糕,好像你在maven中要求最新版本的东西,然后上述点获胜.

解决方案是使用小数点而不是构建号之前的连字符.

做这个!

<Major>.<minor>.<build>
Run Code Online (Sandbox Code Playgroud)

在本地拥有SNAPSHOT版本是可以的,但作为构建的一部分,最好使用它

mvn versions:set -DnewVersion=${major}.${minor}.${build.number}
Run Code Online (Sandbox Code Playgroud)

有一些方法可以从pom派生主要/次要版本,例如使用help:在调用版本之前评估和管道到环境变量:set.这很脏,但我真的摸不着头脑(以及我团队中的其他人)让它更简单,而且(当时)Maven还不够成熟,无法处理这个问题.我相信Maven 2.3.1可能会有一些帮助这个的东西,所以这些信息可能不再相关.

对于一群开发人员来说,在同一个major.minor版本上发布是可以的 - 但是要注意微小的更改是非破坏性的,并且主要的版本更改会导致一些重大的API更改或功能/行为的弃用.

从持续交付的角度来看,每个构建都可能是可释放的,因此每次签入都应该创建一个构建.

  • http://mojo.codehaus.org/versions-maven-plugin/version-rules.html暗示并根据我自己的测试,这是不正确的.默认的Maven版本控制方案是`<major>.<minor>.<incremental> - <buildNumber | qualifier>`(大多数都是可选的).只要短划线后面的部分是数字,就不会在词汇上进行比较.我用`mvn版本测试了这个:use-latest-versions`和例如`1.4-11`被正确检测为比'1.4-2`更新. (6认同)