Release插件是Apache Maven团队提供的官方插件,最终版本是2015-10-17发布的2.5.3,能够为项目代码库打tag,并将项目代码库中的代码发布到SCM的新版本。
1. 使用Release插件的前提条件
1) 明确使用的maven-release-plugin版本,当前为2.5.3
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
</plugin>
...
2) 在POM中配置scm的developerConnection
<scm>
<developerConnection>scm:git:ssh://gerrit.mycompany.com:29418/myproject</developerConnection>
</scm>
2. Release插件的Maven goals
1) release:clean
2) release:prepare
基本过程:
- 生成release.properties文件
- 检查本地项目代码中是否有未提交的modifications
- 检查项目的POM依赖或插件是否有SNAPSHOT版本
- 更新POM,将项目的version从*-SNAPSHOT改为用户输入的发布版本(提示用户输入)
- 确定项目tag(tag名提示用户输入)
默认tag格式为@{project.artifactId}-@{project.version},也可以配置<tagNameFormat>以设置tag格式。
<configuration>
<preparationGoals>clean verify</preparationGoals>
</configuration>
- 更新POM,转换POM中的SCM信息,包括更新tag
- 执行<preparationGoals>设置的goals
默认为clean verify,即执行mvn clean verify,也可以配置<preparationGoals>。
<configuration>
<preparationGoals>clean verify</preparationGoals>
</configuration>
执行期间,对项目代码进行单元测试(要跳过单元测试,则mvn -Darguments="-DskipTests" ...)。
- 验证成功,第一次提交POM修改,并push到Git库的refs/heads/master
git add -- mymodule\pom.xml pom.xml
git rev-parse --show-toplevel
git status --porcelain .
git commit --verbose -F C:\Users\...\Temp\maven-scm-1044264625.commit mymodule\pom.xml pom.xml
git symbolic-ref HEAD
git push ssh://gerrit.mycompany.com:29418/myproject refs/heads/master:refs/heads/master
- 为当前项目打tag,并push到Git库的refs/tags/my_tag_name
git tag -F C:\Users\...\Temp\maven-scm-7417013.commit myproject-1.0.1
git push ssh://gerrit.mycompany.com:29418/myproject refs/tags/myproject-1.0.1
- 为项目的version产生一个新的开发版本*-SNAPSHOT(提示用户输入)
- 更新POM为开发版本,并将更新后的POM再次提交到Git库
git add -- mymodule\pom.xml pom.xml
git rev-parse --show-toplevel
git status --porcelain .
git commit --verbose -F C:\Users\...\Temp\maven-scm-1044264625.commit mymodule\pom.xml pom.xml
git symbolic-ref HEAD
git push ssh://gerrit.mycompany.com:29418/myproject refs/heads/master:refs/heads/master
release:prepare的可配置的参数:
- username, 访问SCM的用户名
- password, 访问SCM的密码
- tag或releaseLabel, 使用的SCM tag
- tagNameFormat, 默认值@{project.artifactId}-@{project.version}
- tagBase, SCM库中tag的基础目录
- scmCommentPrefix, 默认值[maven-release-plugin] ,所有SCM修改的消息前缀
- pushChanges, 默认值true
- resume, 默认值true
- autoVersionSubmodules, 默认值false,提示为各个子模块输入版本;如果值true,表示所有子模块采用与父模块相同的版本
- releaseVersion, 要发布的版本
- developmentVersion, 本地工作目录的下一个开发版本
- preparationGoals, 默认值clean verify,在转换到发布版本之后,但是在commit之前执行
- completionGoals, 没有默认值,在转换到下一个开发版本之后,但是在commit之前执行
- generateReleasePoms, 默认值false,过时了
- useEditMode, 默认值false,进入SCM的修改模式
- updateDependencies, 默认值true,更新依赖版本为下一个开发版本
- addSchema, 默认值true
- commitByProject,
- ignoreSnapshots, 默认值false,
- allowReleasePluginSnapshot, 默认值false,仅用于插件本身的开发测试
- checkModificationExcludeList,
- updateWorkingCopyVersions, 默认值true,更新工作目录的版本为developmentVersion值
- waitBeforeTagging, 默认值0,等待创建tag的时间,单位秒
- remoteTagging, 默认值true,目前只对SCM, SVN有效。
- suppressCommitBeforeTag, 默认值false,tag创建完成之前拒绝提交修改,remoteTagging=false才有效
- dryRun,
- projectVersionPolicyId, 默认值default
3) release:prepare-with-pom
功能类似于release:prepare,但需要存在一个项目的已有发布构件,从而能够生成release-pom.xml文件
4) release:perform
基本过程:
- 依赖于release:prepare阶段生成的release.properties文件
- 基于SCM的URL检出prepare阶段刚刚打标签的代码,可以带一个可选的tag,如:
<scm>
<url>scm:git:ssh://gerrit.mycompany.com:29418/myproject</url>
<tag>myproject-1.0.1</tag>
</scm>
- 执行指定的Maven goals
默认为deploy site-deploy,将项目代码发布到SCM库中。
<configuration>
<goals>deploy</goals>
</configuration>
- 引用release:clean,删除release.properties等发布过程文件
5) release:stage
- 功能类似于release:perform,但专用于“预发布”
- 需要指定stagingRepository参数,即预发布库
- workingDirectory参数也是必须的,但其有默认值${project.build.directory}/checkout
- 预发布成功后,将“预发布库”复制到“发布库”,即从stage库到release库
- 保留release.properties等发布过程文件
- 出错可以回滚,执行release:rollback
6) release:rollback
7) release:branch
- 创建一个新分支
命令:mvn release:branch -DbranchName=my-branch
8) release:update-versions
3. Maven项目的发布过程
在POM中配置了Release插件的Maven项目,其发布过程默认即包含release:prepare和release:perform两大步。如前所述,实际上就是在执行mvn clean verify deploy site-deploy。
4. 非交互式模式的发布
从属性文件release.properties中读取发布参数,进行无人值守的自动发布。
命令:
mvn -B release:prepare release:perform
或
mvn --batch-mode release:prepare release:perform
5. 正式发布前的Dry Run模式
在正式发布之前,模拟执行发布,保留发布过程中的文件,以检查输出的中间结果。
命令:mvn release:prepare -DdryRun=true
此后,要正式执行发布,还需要先清除中间结果文件,然后再执行正式的发布。
命令:mvn release:clean release:prepare release:perform
参考链接:
http://maven.apache.org/plugins/maven-release-plugin/
https://github.com/apache/maven-release/