版本管理指项目整体版本的演变过程管理。
版本控制指借助版本控制工具追踪代码的每个变更。
一、版本管理
版本管理关心问题之一是快照版本和发布版本的切换。
理想的发布版本项目的构建应当满足以下条件:
- 所有自动化测试应当全部通过
- 项目没有配置任何快照版本的依赖
- 项目没有配置任何快照版本插件
- 项目所包含的代码已经全部提交到版本控制系统中。
满足上述条件才可以将快照版本更新为发布版本。
版本控制系统记录代码的每个变化,通常这些变化被维护在主干中,当项目发布时,开发人员应该使用标签记录这一特殊时刻项目版本。
项目的快照版本更新至发布版本后,应当再执行一次Maven构建,确保项目状态健康。然后将这一变更提交到版本控制系统的主干中,接着打上标签。
二、Maven版本号定义约定
Maven版本号定义约定:
<主版本>.<次版本>.<增量版本>-<里程碑版本>
- 主版本:表示项目的重大架构变更。
- 次版本:表示较大范围的功能增加和变化,及bug修复。
- 增量版本:表示重大bug修复。
- 里程碑版本:某个版本的里程碑,往往不稳定。
一般主版本和次版本都会声明,但增量版本和里程碑就不一定。
三、主干、标签、分支
- 主干:代码开发代码的主体,从项目开始直到当前都处于活动的状态。
- 分支:从主干的某个点分离出的代码拷贝,通常可以在不影响主干的前提下在这里进行bug修复,或实验性开发。如果分支达到目的,通常将变更合并到主干。
- 标签:标识主干或分支的某个点的状态,以代表项目的某个稳定状态。
四、自动化版本发布
Maven Release Plugin通过自动化版本发布。该插件有三个目标:
要为项目发布版本,首先需要添加正确的版本控制系统信息,一般配置项目的SCM信息:
<project>
...
<scm>
<connnection>scm:svn:http://xxxxxxx</connection>
<developerConnection>scm:svn:https:xxxxxxx</developerConnection>
<url>xxxx</url>
</scm>
...
</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:
然后使用mvn命令签名并发布构件:mvn clean deploy -Dgpg.passphrass=yourpassphrass 。
如果想对已发布但没有签名的文件签名发布:
GPG签名只有在项目发布时必要,日常构件意义不大。判断项目是否要发布借助超级POM的release-profile的performReleasse值为true时,就是项目发布时刻,可以在settings.xml或POM中设置:
release:perform执行过程中签名可能会导致进程永久挂起,需要提供mavenExecutorId配置:
网友评论