項(xiàng)目版本管理的最佳實(shí)踐測(cè)試
一届吁、Git設(shè)置
1吗货、添加公鑰
打開(kāi) git bash (mac 下直接打開(kāi)終端即可)
#: ssh-keygen -t rsa -C "郵箱"
#: cat ~/.ssh/id_rsa.pub
會(huì)生成:以ssh-rsa 開(kāi)頭的字符串立轧,復(fù)制尘执,貼到git公鑰管理里面
測(cè)試是否可以通過(guò)公鑰,免密拉取上傳代碼
#: ssh -T git@gitee.com (我這里用的gitee溪椎,對(duì)應(yīng)的域名請(qǐng)自行切換)
成功:
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)]
二、項(xiàng)目版本
在web開(kāi)發(fā)的過(guò)程中校读,maven 除了作為項(xiàng)目的依賴(lài)管理之外沼侣,還處理著項(xiàng)目的版本控制
1、maven 的多項(xiàng)目的標(biāo)準(zhǔn)結(jié)構(gòu)
1.1歉秫、如何組織項(xiàng)目
[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文件中的內(nèi)容
1.2.1、parent pom.xml
父模塊的pom文件一般存放公用的信息,以及定義標(biāo)準(zhǔn)轧膘,打包的格式:pom
除了上述的信息钞螟,一般不要引入其他的元素,因?yàn)橐坏┮牖寻幽K就會(huì)繼承這些依賴(lài)鳞滨,導(dǎo)致子模塊的依賴(lài)被污染
<!-- 屬性定義-->
<properties>
<java.version>1.8</java.version>
....
</properties>
<!-- 倉(cāng)庫(kù)的定義 -->
<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>
<!-- 軟件配置管理(項(xiàng)目git地址信息)如果git需要權(quán)限,則需要加入公鑰蟆淀,免密訪(fǎng)問(wèn)-->
<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>
<!--開(kāi)發(fā)者-->
<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>
<!--依賴(lài)定義-->
<dependencyManagement>
</dependencyManagement>
pom文件中可被繼承的元素:
- 可繼承的POM元素如下:
- groupId:項(xiàng)目組ID拯啦,項(xiàng)目坐標(biāo)的核心元素
- version:項(xiàng)目版本,項(xiàng)目坐標(biāo)的核心因素
- description:項(xiàng)目的描述信息
- organization:項(xiàng)目的組織信息
- inceptionYear:項(xiàng)目的創(chuàng)始年份
- url:項(xiàng)目的URL地址
- developers:項(xiàng)目的開(kāi)發(fā)者信息
- contributors:項(xiàng)目的貢獻(xiàn)者信息
- distributionManagement:項(xiàng)目的部署配置
- issueManagement:項(xiàng)目的缺陷跟蹤系統(tǒng)信息
- ciManagement:項(xiàng)目的持續(xù)集成系統(tǒng)信息
- scm:項(xiàng)目的版本控制系統(tǒng)西溪
- malilingLists:項(xiàng)目的郵件列表信息
- properties:自定義的Maven屬性
- dependencies:項(xiàng)目的依賴(lài)配置
- dependencyManagement:項(xiàng)目的依賴(lài)管理配置
- repositories:項(xiàng)目的倉(cāng)庫(kù)配置
- build:包括項(xiàng)目的源碼目錄配置熔任、輸出目錄配置褒链、插件配置、插件管理配置等
- reporting:包括項(xiàng)目的報(bào)告輸出目錄配置疑苔、報(bào)告插件配置等
1.2.2碱蒙、子模塊
子模塊是具體依賴(lài)的配置,一般以jar包的格式提供服務(wù)(使用springboot后夯巷,war包格式會(huì)被打成jar)
在子模塊中,所有的version都不應(yīng)該存在哀墓,要放在parent.pom 中進(jìn)行統(tǒng)一管理
- 模塊本身:version 繼承父模塊的versoin
- 所有依賴(lài)version趁餐,在父模塊的dependencyManagement 元素中進(jìn)行定義
<!-- 父模塊的坐標(biāo)-->
<parent>
</parent>
<!-- 當(dāng)前模塊的坐標(biāo),不需要寫(xiě)版本信息篮绰,會(huì)繼承父模塊的版本號(hào)-->
<artifactId>com.example</artifactId>
<name>demo</name>
<!-- 模塊描述-->
<description>xxx</description>
<!-- 模塊依賴(lài)列表-->
<dependencies>
</dependencies>
<!-- 模塊的構(gòu)建所需要的插件-->
<build>
</build>
1.3后雷、語(yǔ)義化的版本號(hào)(Semantic Versioning)
1.3.1、版本號(hào)的格式
版本號(hào)的格式: 主版本號(hào).次版本號(hào).修訂號(hào)
版本號(hào)的遞增的規(guī)則:
1吠各、主版本號(hào):當(dāng)你做了不兼容的API修改
2臀突、次版本號(hào):當(dāng)你做了向下兼容的功能性新增
3、修訂號(hào):當(dāng)你做了向下兼容的問(wèn)題修正
先行版本號(hào)及版本編譯元數(shù)據(jù)可以加到“主版本號(hào).次版本號(hào).修訂號(hào)”的后面贾漏,作為延伸候学。
也就是說(shuō)可以支持這種版本號(hào):
4.7.5.202005
- 4 主版本號(hào)
- 7 次版本號(hào)
- 5 修訂號(hào)
- 202005 編譯元數(shù)據(jù)-編譯日期
其他的語(yǔ)義描述:
- Alpha:內(nèi)測(cè)版
- Beta:公測(cè)版
- Gamma:比較成熟的測(cè)試版,與即將發(fā)行的正式版相差無(wú)幾
- RC:是 Release Candidate 的縮寫(xiě)纵散,意思是發(fā)布倒計(jì)時(shí)梳码,候選版本
- Stable:穩(wěn)定版
1.4、版本性質(zhì): Snapshot 與Release
1.4.1伍掀、概念
Snapshot:快照掰茶,他是一個(gè)不穩(wěn)定的版本,處于開(kāi)發(fā)中的蜜笤,經(jīng)常變化的版本
Release:發(fā)行版濒蒋,功能穩(wěn)定的版本,將停止代碼的更新把兔,用于發(fā)行到生產(chǎn)環(huán)境
1.4.2沪伙、理想的流程
日常的開(kāi)發(fā)
基于Snapshot的版本進(jìn)行開(kāi)發(fā)瓮顽,snapshot版本會(huì)有一些特性
- 執(zhí)行 mvn complie 時(shí)會(huì)去倉(cāng)庫(kù)中嘗試?yán)钚麓虬驗(yàn)樗梢员欢啻螛?gòu)建焰坪,使用時(shí)必須保證最新
- 可以被重復(fù)構(gòu)建
版本發(fā)布
在發(fā)布版本的時(shí)候趣倾,我們需要做以下的幾件事:
1、創(chuàng)建Tag分支某饰,tag/v版本號(hào)(例如:tag/v0.0.1)
2儒恋、在倉(cāng)庫(kù)中構(gòu)建發(fā)布包(release 的jar)
3、創(chuàng)建新的開(kāi)發(fā)分支黔漂,升級(jí)本地pom文件版本诫尽,根據(jù)實(shí)際的需求提升版本號(hào)
- 如果hotfix發(fā)布,則:x.y.z -> x.y.z+1 例如:4.7.5 > 4.7.6
- 次版本發(fā)布炬守, 則: 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版本發(fā)布减途,還需要?jiǎng)?chuàng)建hotfix分支酣藻,用于以后修復(fù)
現(xiàn)有的項(xiàng)目如何做?
插件管理:maven-release-plugin
插件地址:http://maven.apache.org/maven-release/maven-release-plugin/
parent pom配置文件配置:
<scm>
<!-- git項(xiàng)目地址可以用SSH 也可以用 HTTPS的-->
<connection>scm:git:https://gitee.com/wuxuanchai_admin/m-v.git</connection>
<!-- #git項(xiàng)目地址可以用SSH 也可以用 HTTPS的-->
<developerConnection>scm:git:https://gitee.com/wuxuanchai_admin/m-v.git</developerConnection>
<!-- #git項(xiàng)目瀏覽器里的地址-->
<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分支的名稱(chēng)鳍置,project.version只包含版本辽剧,不包含SNAPSHOT后綴 -->
<tagNameFormat>v@{project.version}</tagNameFormat>
<!-- 升級(jí)子模塊 -->
<autoVersionSubmodules>true</autoVersionSubmodules>
<!-- 跳過(guò)單元測(cè)試 -->
<arguments>-DskipTests</arguments>
<!-- 執(zhí)行目標(biāo),此句可省 -->
<goals>-f pom.xml deploy</goals>
</configuration>
</plugin>
</plugins>
</build>
如何使用税产?怕轿?
1) release:branch(創(chuàng)建分支 )
創(chuàng)建的分支是用于hotfix修復(fù)的基礎(chǔ)分支,在第一次創(chuàng)建次要版本是辟拷,要一并創(chuàng)建撞羽,以后的修改都基于此分支,后續(xù)如果有需要的hotfix來(lái)修復(fù)問(wèn)題衫冻,則基于此分支創(chuàng)建一個(gè)新的分支hotfix-xxx诀紊,然后提交代碼后,將release一個(gè)hotfix的版本:x.y.z+1(z表示當(dāng)前的修訂號(hào))
命令:
mvn release:branch -DbranchName=0.2.x -DupdateBranchVersions=true -DupdateWorkingCopyVersions=false
命令含義:
- -DbranchName=0.2.x:創(chuàng)建一個(gè)叫 0.2.x 的分支
- -DupdateBranchVersions=true :分支會(huì)升級(jí)版本號(hào)隅俘,如果當(dāng)前的版本號(hào)為0.0.1-snapshot渡紫,則新的分支版本號(hào)為: 0.0.2-snapshot
- DupdateWorkingCopyVersions=false 當(dāng)前工作空間的pom文件不做更改,方便后面的release操作
2) release:prepare(預(yù)處理考赛,升級(jí)pom-version)
預(yù)處理階段惕澎,release插件會(huì):
- 執(zhí)行一次打包過(guò)程
- 在git倉(cāng)庫(kù)里面創(chuàng)建好Tag分支
- 升級(jí)pom文件版本,并提交到本地倉(cāng)庫(kù)(此處不會(huì)更改遠(yuǎn)程倉(cāng)庫(kù)的分支)
mvn release:prepare
在默認(rèn)的情況下颜骤,他是一個(gè)交互式的命令唧喉,有如下問(wèn)題需要確認(rèn):
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: :
//要發(fā)布的版本是哪一個(gè)?默認(rèn)當(dāng)前版本
//要打的tag叫什么?現(xiàn)在的樣子
//創(chuàng)建一個(gè)新的開(kāi)發(fā)版本嗎八孝?默認(rèn)當(dāng)前版本+1 修訂(此處我們可以手工改成 子版本號(hào)更新)
執(zhí)行了 release:prepare命令后董朝,在git倉(cāng)庫(kù)中,我們可以看到一個(gè)叫:v0.1.15的tag被創(chuàng)建干跛,這操作是可以回滾的子姜,插件在項(xiàng)目里面創(chuàng)建了一個(gè),pom.xml.releaseBackup的文件楼入,用于回滾pom.xml哥捕,同時(shí)還會(huì)生成:release.properties 里面會(huì)記錄release版本的屬性
3) release:rollback(回滾)
Release:prepare 階段都是進(jìn)行了本地的提交,因此可以進(jìn)行回滾嘉熊,但tag分支必須手工刪除遥赚,插件不能幫你刪除已經(jīng)創(chuàng)建好的本地Tag
除此之外,可以還行發(fā)布預(yù)覽:
mvn release:prepare -DdryRun=true
干跑會(huì)生成預(yù)覽文件:
pom.xml.next
pom.xml.releaseBackup
pom.xml.tag
release.properties
但是不會(huì)提交阐肤。
4) release:perform (執(zhí)行)
執(zhí)行命令凫佛,會(huì)在release倉(cāng)庫(kù)里面構(gòu)建發(fā)布包
可能碰到的問(wèn)題
release:rollback不會(huì)回滾git的tag,需要手動(dòng)刪除tag
maven配置的優(yōu)先級(jí)(idea下) pom.xml>.m2/setting.xml>setting.xml
pom.xml 發(fā)生改變孕惜,無(wú)法執(zhí)行release:prepare
私服的設(shè)置和maven的配置文件如果配置不正確愧薛,無(wú)法執(zhí)行命令
效果
私服中release的jar:
私服中的snapshot的jar:
git中的tag:發(fā)布release后創(chuàng)建的tag分支