项目版本管理工具实战总结

项目版本管理的最佳实践测试

一、Git设置

1、添加公钥

打开 git bash (mac 下直接打开终端即可)
#: ssh-keygen -t rsa -C "邮箱"
#: cat ~/.ssh/id_rsa.pub
会生成:以ssh-rsa 开头的字符串,复制,贴到git公钥管理里面

测试是否可以通过公钥,免密拉取上传代码
#: ssh -T git@gitee.com (我这里用的gitee,对应的域名请自行切换)

成功:
Hi 柴梧炫 (DeployKey)! You've successfully authenticated, but GITEE.COM does not provide shell access.
Note: Perhaps the current use is DeployKey.
Note: DeployKey only supports pull/fetch operations

失败:
The authenticity of host 'gitlab.com (172.65.251.78)' can't be established.
ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.

[图片上传失败...(image-3a059f-1590112256704)]

二、项目版本

在web开发的过程中,maven 除了作为项目的依赖管理之外,还处理着项目的版本控制

1、maven 的多项目的标准结构

1.1、如何组织项目

[MavenMultiProject]
 ├── module-1
 │   ├── pom.xml
 │   └── src
 ├── module-2
 │   ├── pom.xml
 │   └── src
 ├── module-3
 │   ├── pom.xml
 │   ├── module-3-1
 │       ├── pom.xml
 │       └── src
 │   ├── module-3-2
 │       ├── pom.xml
 │       └── src
 ├── pom.xml
 ├── README.en.md
 ├── README.md

其中子模块也可以有其子模块

1.2、POM文件中的内容

1.2.1、parent pom.xml

父模块的pom文件一般存放公用的信息,以及定义标准,打包的格式:pom

除了上述的信息,一般不要引入其他的元素,因为一旦引入,子模块就会继承这些依赖,导致子模块的依赖被污染

<!-- 属性定义-->
<properties>
  <java.version>1.8</java.version>
  ....
</properties>

<!-- 仓库的定义 -->
<distributionManagement>
  <repository>
     <id>local nexus</id>
     <name>local nexus</name>
     <url>http://localhost:8081/repository/maven-releases/</url>
  </repository>
  <snapshotRepository>
      <id>local nexus</id>
      <name>local nexus</name>
      <url>http://localhost:8081/repository/maven-snapshots/</url>
  </snapshotRepository>
</distributionManagement>

<!-- 软件配置管理(项目git地址信息)如果git需要权限,则需要加入公钥,免密访问-->
<scm>
   <connection>
            scm:git:https://gitee.com/wuxuanchai_admin/m-v.git
   </connection>
   <developerConnection>
            scm:git:https://gitee.com/wuxuanchai_admin/m-v.git
   </developerConnection>
   <url>
            https://gitee.com/liang.liang/version-mangement-best-practices
   </url>
   <tag>HEAD</tag>
</scm>

<!--开发者-->
<developers>
   <developer>
      <name>wuxuan.chai</name>
      <email>wuxuan.chai@gmail.com</email>
      <organizationUrl>www.shuyun.com</organizationUrl>
   </developer>
</developers>

<!--模块定义-->
<moudles>
    <moudle>../moudle1</moudle>
</moudles>

<build>
  <!--插件定义-->
    <pluginManagement>
    
  </pluginManagement>
</build>

<!--依赖定义-->
<dependencyManagement>
</dependencyManagement>

pom文件中可被继承的元素:

  • 可继承的POM元素如下:
    • groupId:项目组ID,项目坐标的核心元素
    • version:项目版本,项目坐标的核心因素
    • description:项目的描述信息
    • organization:项目的组织信息
    • inceptionYear:项目的创始年份
    • url:项目的URL地址
    • developers:项目的开发者信息
    • contributors:项目的贡献者信息
    • distributionManagement:项目的部署配置
    • issueManagement:项目的缺陷跟踪系统信息
    • ciManagement:项目的持续集成系统信息
    • scm:项目的版本控制系统西溪
    • malilingLists:项目的邮件列表信息
    • properties:自定义的Maven属性
    • dependencies:项目的依赖配置
    • dependencyManagement:项目的依赖管理配置
    • repositories:项目的仓库配置
    • build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
    • reporting:包括项目的报告输出目录配置、报告插件配置等

1.2.2、子模块

子模块是具体依赖的配置,一般以jar包的格式提供服务(使用springboot后,war包格式会被打成jar)

在子模块中,所有的version都不应该存在,要放在parent.pom 中进行统一管理

  • 模块本身:version 继承父模块的versoin
  • 所有依赖version,在父模块的dependencyManagement 元素中进行定义
<!-- 父模块的坐标-->
<parent>
  
</parent>
<!-- 当前模块的坐标,不需要写版本信息,会继承父模块的版本号-->
<artifactId>com.example</artifactId>
<name>demo</name>

<!-- 模块描述-->
<description>xxx</description>

<!-- 模块依赖列表-->
<dependencies>

</dependencies>

<!-- 模块的构建所需要的插件-->
<build>
</build>

1.3、语义化的版本号(Semantic Versioning)

1.3.1、版本号的格式

版本号的格式: 主版本号.次版本号.修订号

版本号的递增的规则:

1、主版本号:当你做了不兼容的API修改

2、次版本号:当你做了向下兼容的功能性新增

3、修订号:当你做了向下兼容的问题修正

先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

也就是说可以支持这种版本号:

4.7.5.202005

  • 4 主版本号
  • 7 次版本号
  • 5 修订号
  • 202005 编译元数据-编译日期

其他的语义描述:

  • Alpha:内测版
  • Beta:公测版
  • Gamma:比较成熟的测试版,与即将发行的正式版相差无几
  • RC:是 Release Candidate 的缩写,意思是发布倒计时,候选版本
  • Stable:稳定版

1.4、版本性质: Snapshot 与Release

1.4.1、概念

Snapshot:快照,他是一个不稳定的版本,处于开发中的,经常变化的版本

Release:发行版,功能稳定的版本,将停止代码的更新,用于发行到生产环境

1.4.2、理想的流程

日常的开发

基于Snapshot的版本进行开发,snapshot版本会有一些特性

  • 执行 mvn complie 时会去仓库中尝试拉最新打包,因为他可以被多次构建,使用时必须保证最新
  • 可以被重复构建
版本发布

在发布版本的时候,我们需要做以下的几件事:

1、创建Tag分支,tag/v版本号(例如:tag/v0.0.1)

2、在仓库中构建发布包(release 的jar)

3、创建新的开发分支,升级本地pom文件版本,根据实际的需求提升版本号

  • 如果hotfix发布,则:x.y.z -> x.y.z+1 例如:4.7.5 > 4.7.6
  • 次版本发布, 则: x.y.z -> x.y+1.0 例如:4.7.5 > 4.8.0
  • 大版本更新,则:x.y.z -> x+1.0.0 例如:4.7.5 > 5.0.0

4、非hotfix版本发布,还需要创建hotfix分支,用于以后修复

现有的项目如何做?

插件管理:maven-release-plugin

插件地址:http://maven.apache.org/maven-release/maven-release-plugin/

parent pom配置文件配置:

<scm>
  <!-- git项目地址可以用SSH  也可以用 HTTPS的-->
   <connection>scm:git:https://gitee.com/wuxuanchai_admin/m-v.git</connection>
  
  <!-- #git项目地址可以用SSH  也可以用 HTTPS的-->
   <developerConnection>scm:git:https://gitee.com/wuxuanchai_admin/m-v.git</developerConnection>
  <!-- #git项目浏览器里的地址-->
   <url>https://gitee.com/liang.liang/version-mangement-best-practices</url>
   <tag>HEAD</tag>
</scm>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-release-plugin</artifactId>
            <configuration>
                                <!-- tag分支的名称,project.version只包含版本,不包含SNAPSHOT后缀 -->
                <tagNameFormat>v@{project.version}</tagNameFormat>
                                <!-- 升级子模块 -->
                <autoVersionSubmodules>true</autoVersionSubmodules>
                                <!-- 跳过单元测试 -->
                <arguments>-DskipTests</arguments>
                                <!-- 执行目标,此句可省 -->
                <goals>-f pom.xml deploy</goals>
            </configuration>
        </plugin>
    </plugins>
</build>
如何使用??
1) release:branch(创建分支 )

创建的分支是用于hotfix修复的基础分支,在第一次创建次要版本是,要一并创建,以后的修改都基于此分支,后续如果有需要的hotfix来修复问题,则基于此分支创建一个新的分支hotfix-xxx,然后提交代码后,将release一个hotfix的版本:x.y.z+1(z表示当前的修订号)

命令:

mvn release:branch -DbranchName=0.2.x -DupdateBranchVersions=true -DupdateWorkingCopyVersions=false

命令含义:

  • -DbranchName=0.2.x:创建一个叫 0.2.x 的分支
  • -DupdateBranchVersions=true :分支会升级版本号,如果当前的版本号为0.0.1-snapshot,则新的分支版本号为: 0.0.2-snapshot
  • DupdateWorkingCopyVersions=false 当前工作空间的pom文件不做更改,方便后面的release操作
2) release:prepare(预处理,升级pom-version)

预处理阶段,release插件会:

  • 执行一次打包过程
  • 在git仓库里面创建好Tag分支
  • 升级pom文件版本,并提交到本地仓库(此处不会更改远程仓库的分支)
mvn release:prepare

在默认的情况下,他是一个交互式的命令,有如下问题需要确认:

What is the release version for "mvc-test"? (com.fruits.mvc:mvc-test) 0.1.15: :
What is SCM release tag or label for "mvc-test"? (com.fruits.mvc:mvc-test) v0.1.15: :
What is the new development version for "mvc-test"? (com.fruits.mvc:mvc-test) 0.1.16-SNAPSHOT: :

//要发布的版本是哪一个?默认当前版本
//要打的tag叫什么?现在的样子 
//创建一个新的开发版本吗?默认当前版本+1 修订(此处我们可以手工改成 子版本号更新)

执行了 release:prepare命令后,在git仓库中,我们可以看到一个叫:v0.1.15的tag被创建,这操作是可以回滚的,插件在项目里面创建了一个,pom.xml.releaseBackup的文件,用于回滚pom.xml,同时还会生成:release.properties 里面会记录release版本的属性

3) release:rollback(回滚)

Release:prepare 阶段都是进行了本地的提交,因此可以进行回滚,但tag分支必须手工删除,插件不能帮你删除已经创建好的本地Tag

除此之外,可以还行发布预览:

mvn release:prepare -DdryRun=true

干跑会生成预览文件:

pom.xml.next
pom.xml.releaseBackup
pom.xml.tag
release.properties

但是不会提交。

4) release:perform (执行)

执行命令,会在release仓库里面构建发布包

可能碰到的问题
  • release:rollback不会回滚git的tag,需要手动删除tag

  • maven配置的优先级(idea下) pom.xml>.m2/setting.xml>setting.xml

  • pom.xml 发生改变,无法执行release:prepare

  • 私服的设置和maven的配置文件如果配置不正确,无法执行命令

效果

私服中release的jar:

release的jar

私服中的snapshot的jar:

snapshot的jar
snapshot的jar的命名规则

git中的tag:发布release后创建的tag分支

git中的release的tag标签
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343