目录

版本管理 Version Management

Maven 中版本管理中说的版本是指构件(artifact)的版本,一般涉及 SNAPSHOTRELEASE 版本

版本控制 (version control),版本是指源码的版本。SCM(Software Configuration Management,软件配置管理)是一种标识、组织和控制修改的技术。git svn 都是属于 一种 scm

项目版本

  • RELEASE (发布版本):

    • 项目开发进入阶段里程碑后,发布稳定的版本,不会改变的版本称为发布版本
  • SNAPSHOT (快照版本)

    • 开发者对每个模块进行构建时,输出的临时性版本叫快照版本。(测试阶段版本)
    • 随着开发进展不断更新

Release 版本要求

  • 所有自动化测试应当全部通过
  • 项目没有配置任何快照版本的依赖
  • 项目没有配置任何快照版本的插件
  • 项目所包含的代码已经全部提交到版本控制系统中

SNAPSHOT 版本

SNAPSHOT 是快照的意思,Maven 在处理 SNAPSHOT 依赖时,会根据 timestamp下载最新的jar,默认 Maven 每天更新一次。

如果你想让 Maven 强制更新 SNAPSHOT 依赖,可以使用 -U 参数。

1
mvn clean package -U

项目版本号约定

约定格式:

<主版本>.<次版本>.<增量版本>-<里程碑版本>
  • 主版本: 项目的重大架构变更.如jdk8到jdk9
  • 次版本: 较大范围的功能增加和变化及bug修复.但总体架构上变化不大.如jdk9到jdk10
  • 增量版本: (可选)一般表示重大bug的修复.
  • 里程碑版本: (可选)某一个版本的里程碑.这样的版本与正式的版本相比,往往不稳定,还需要很多测试.

范例:

  • 0.1.0 初始化开发版本。
  • 1.0.0 软件被用于正式环境,有稳定的API被使用者依赖。
  • 1.3.4-M2 产品的第一个重大版本(1)的第三个次要版本(3)的第四次增量版本(4)的M2里程碑

版本管理流程

  1. 发布快照版本1.0-SNAPSHOT
  2. 快照版本功能实现,并满足发布版本要求后,生成发布版本1.0
  3. 打标签关联发布版本与版本控制源码
  4. 进入新的快照版本1.1-SNAPSHOT

1.0-SNAPSHOT > 1.0 > 1.1-SNAPSHOT

  1. master 分支中,更新 pom 版本从 1.0-SNAPSHOT1.0
  2. 对 1.0 打一个 tag
  3. 针对 tag 进行 mvn deploy,发布正式版本
  4. 更新 master 从 1.01.1-SNAPSHOT
1
2
3
4
5
# 保持 master 最新测试稳定代码
git checkout master
# 保证本地与远程都没有你想打的tag 这一步需要 release version、release tag、下一个开发 SNAPSHOT 号 会提交版本修改 打tag到远程
mvn release:prepare
mvn release:perform

Maven Release Plugin

如果你的项目中pom分多个模块,就需要使用命令:release:prepare-with-pom 进行打包发布。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<scm>
    <developerConnection>scm:git:https://gitlab.ynthm.com:8090/ynthm/order-service.git</developerConnection>
</scm>

<distributionManagement>
  <repository>
    <id>nexus-releases</id>
    <url>https://nuxes.ynthm.com:8081/nexus/content/repositories/releases/</url>
  </repository>
  <snapshotRepository>
    <id>nexus-snapshots</id>
    <url>https://nuxes.ynthm.com:8081/nexus/content/repositories/snapshots/</url>
  </snapshotRepository>
</distributionManagement>
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-release-plugin</artifactId>
      <version>2.5.3</version>
      <configuration>
        <tagNameFormat>@{project.version}</tagNameFormat>
        <autoVersionSubmodules>true</autoVersionSubmodules>
        <arguments>-Dmaven.test.skip=true</arguments>
      </configuration>
    </plugin>
  </plugins>
</build>

/images/devops/maven/maven-release-plugin-command.png

确保当前版本是 SNAPSHOT,若不是执行如下命令 mvn release:update-versions

1
2
3
4
# 根据提示输入snapshot版本号
mvn release:update-versions
# 批量 更新到指定 SNAPSHOT 版本
mvn --batch-mode release:update-versions -DdevelopmentVersion=1.0.0-SNAPSHOT

release:prepare

  1. 检查本地是否存在还未提交的修改
  2. 确保没有快照的依赖
  3. 改变应用程序的版本信息用以发布
  4. 更新 POM 文件到 SVN
  5. 运行测试用例
  6. 提交修改后的 POM 文件
  7. 为代码在 SVN 上做标记
  8. 增加版本号和附加快照以备将来发布 提交修改后的 POM 文件到 SVN
1
2
3
4
5
6
7
# 请在稳定的代码打包
git checkout master
mvn release:prepare
# 若发现错误可以回滚 或者 mvn release:clean
mvn release:rollback

mvn release:clean release:prepare -DdryRun=true -DgenerateBackupPoms=false -Dtag=1.0.0 -DreleaseVersion=1.0.0 -DdevelopmentVersion=1.0.1-SNAPSHOT

-DgenerateBackupPoms=false 不生成 pom.next / pom.tag and pom.backUp

release:perform

1
mvn release:perform
  • 将生成的下一个快照版本代码提交至scm
  • 将release包上传至私服
  • 在scm中生成tag

附录