第十三章 版本管理

版本管理指项目整体版本的演变过程管理。

版本控制指借助版本控制工具追踪代码的每个变更。

一、版本管理

版本管理关心问题之一是快照版本和发布版本的切换。

理想的发布版本项目的构建应当满足以下条件:

  • 所有自动化测试应当全部通过
  • 项目没有配置任何快照版本的依赖
  • 项目没有配置任何快照版本插件
  • 项目所包含的代码已经全部提交到版本控制系统中。
  • 满足上述条件才可以将快照版本更新为发布版本。

    版本控制系统记录代码的每个变化,通常这些变化被维护在主干中,当项目发布时,开发人员应该使用标签记录这一特殊时刻项目版本。

    项目的快照版本更新至发布版本后,应当再执行一次Maven构建,确保项目状态健康。然后将这一变更提交到版本控制系统的主干中,接着打上标签。

    二、Maven版本号定义约定

    Maven版本号定义约定:
    <主版本>.<次版本>.<增量版本>-<里程碑版本>

  • 主版本:表示项目的重大架构变更。
  • 次版本:表示较大范围的功能增加和变化,及bug修复。
  • 增量版本:表示重大bug修复。
  • 里程碑版本:某个版本的里程碑,往往不稳定。
  • 一般主版本和次版本都会声明,但增量版本和里程碑就不一定。

    三、主干、标签、分支

  • 主干:代码开发代码的主体,从项目开始直到当前都处于活动的状态。
  • 分支:从主干的某个点分离出的代码拷贝,通常可以在不影响主干的前提下在这里进行bug修复,或实验性开发。如果分支达到目的,通常将变更合并到主干。
  • 标签:标识主干或分支的某个点的状态,以代表项目的某个稳定状态。
  • 四、自动化版本发布

    Maven Release Plugin通过自动化版本发布。该插件有三个目标:

    <connnection>scm:svn:http://xxxxxxx</connection> <developerConnection>scm:svn:https:xxxxxxx</developerConnection> <url>xxxx</url> </project>

    connection元素表示一个只读的scm地址,developerConnection元素表示可写的scm地址,url表示可在浏览器访问的scm地址。为了让Maven识别,connection和developerConnection必须以scm开头,冒号之后部分表示版本控制类型。然后是scm地址。

    该配置只告诉Maven当前代码的主干,而发布版本涉及标签操作。还需要配置Maven Release Plugin告诉其标签的基础目录。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin</artifactId>
        <version>2.0</version>
        <configuration>
            <tagBase>htttps:xxxx/app/tags/</tagBase>
        </configuration>
    </plugin>
    

    执行release:prepare之前要注意:第一,系统必须提供svn命令行工具;第二,POM必须配置了可用的部署仓库,因为release:perform会执行deploy将构建发布到仓库。

    就绪后在项目的根目录下运行:mvn release:prepare 。
    如果顺利,则会提示输入想要发布的版本号、标签名称及最新的快照版本号。

    在多模块项目中执行release:prepare时,默认提示设定每个模块发布版本号及新的开发版本号。maven-release-plugin提供autoVersionSubmodules参数,避免重复确认:mvn release -DautoVersionSubmodules=true 。

    如果release:prepare结果没问题,执行发布命令:mvn release:perform。该命令将标签的代码签出,执行mvn deploy命令构建,并部署仓库。基于该主构建的-source.jar和-javadoc.jar也会生成并发布。

    在超级POM中定义了一个名为release-profile的Maven Profile,Profile指一段在特定情况下被激活并更改Maven行为的配置。在只需release:perform时,Maven Release Plugin会自动生成值为true的performRelease属性,导致超级POM中的release-profile被激活。

    这个Profile配置了3个Maven插件,maven-source-plugin的jar目标生成-source.jar文件,maven-javadoc-plugin的jar目标为项目生成-javadoc.jar文件,maven-release-info配置会在部署的时候更新仓库的元数据,告诉仓库该版本是最新发布版。每个插件中值为true的inherited元素部署可以被子pom继承。

    五、自动化创建分支

    maven Release plugin的branch目标,自动化分支操作:

  • 检查本地有无未提交代码
  • 为分支更改POM版本
  • 将POM中的scm信息更新为分支地址
  • 提交以上更改
  • 将主干代码复制的分支中
  • 修改本地代码使其回退到分之前的版本
  • 提交本地更改
  • 必须在POM中提供正确的scm信息,由于分支操作涉及版本控制系统的分支地址,还要为Maven Release Plugin配置分支基础目录。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin</artifactId>
        <version>2.0</version>
        <configuration>
            <tagBase>xxxxx/xx/tags/</tagBase>
            <branchBase>xxxxxx/xxx/branches/</branchBase>
        </configuration>
    </plugin>
    

    如果为版本控制仓库使用了标准的Subversion布局,即在平行的trunk/tags/branches目录下分别分支项目主干代码、标签代码和分支代码,那么插件能自动计算出标签及分支代码位置,因此可以省略配置tagBase和branchBase。

    运行命令创建分支:mvn release:branch -DbranchName=1.1.x \ -DupdataBranchVersions=true -DupdateWorkingCopyVersions=false。

    DbranchName配置创建的分支名称,DupdataBranchVersions配置分支使用新版本,DupdateWorkingCopyVersion=false表示不更新本地代码的版本。运行后会提示输入分支项目版本。

    六、GPG及其基本使用

    Gnu PG(GPG)是PGP标准的一个免费实现,跨平台,为文件生成签名、管理密匙以及验证签名等。

    先下载安装,可以手动签名,也可以使用插件。

    Maven GPG Plugin自动化签名工作。使用插件前必须确认命令行下gpg可用。然后配置pom: