項(xiàng)目版本管理工具實(shí)戰(zhàn)總結(jié)

項(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:

release的jar

私服中的snapshot的jar:

snapshot的jar
snapshot的jar的命名規(guī)則

git中的tag:發(fā)布release后創(chuàng)建的tag分支

git中的release的tag標(biāo)簽
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市衫画,隨后出現(xiàn)的幾起案子厚满,更是在濱河造成了極大的恐慌,老刑警劉巖碧磅,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異遵馆,居然都是意外死亡鲸郊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)货邓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秆撮,“玉大人,你說(shuō)我怎么就攤上這事换况≈氨妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵戈二,是天一觀(guān)的道長(zhǎng)舒裤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)觉吭,這世上最難降的妖魔是什么腾供? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上伴鳖,老公的妹妹穿的比我還像新娘节值。我一直安慰自己律杠,他們只是感情好嗅绸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著剥懒,像睡著了一般须肆。 火紅的嫁衣襯著肌膚如雪匿乃。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,850評(píng)論 1 290
  • 那天休吠,我揣著相機(jī)與錄音扳埂,去河邊找鬼。 笑死瘤礁,一個(gè)胖子當(dāng)著我的面吹牛阳懂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柜思,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼岩调,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了赡盘?” 一聲冷哼從身側(cè)響起号枕,我...
    開(kāi)封第一講書(shū)人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陨享,沒(méi)想到半個(gè)月后葱淳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抛姑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年赞厕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片定硝。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡皿桑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔬啡,到底是詐尸還是另有隱情诲侮,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布箱蟆,位于F島的核電站沟绪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏空猜。R本人自食惡果不足惜近零,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一诺核、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧久信,春花似錦窖杀、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至腿椎,卻和暖如春桌硫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啃炸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工铆隘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人南用。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓膀钠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親裹虫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肿嘲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349