什麼是版本管理?git
版本管理是指項目總體版本的演變過程管理,如從1.0-SNAPSHOT到1.0再到1.1-SNAPSHOTapache
什麼是版本控制?瀏覽器
版本控制是指藉助版本控制工具(如Subversion)追蹤代碼的每個變動安全
何時能夠將快照版本更新爲發佈版本架構
1、全部自動化測試應當所有經過併發
2、項目沒有配置任何快照版本的依賴app
3、項目沒有配置任何快照版本的插件maven
4、項目所包含的代碼已經所有提交到版本控制系統中svn
Maven的版本號定義約束工具
可能有個版本號是這樣的,1.3.4-beta-2
Maven的版本號定義約定是這樣的,<主版本>.<次版本>.<增量版本>-<里程碑版本>
1、主版本:表示項目的重大架構變動
2、次版本:表示較大範圍的功能增長和變化
3、增量版本:通常表示重大Bug的修復
4、里程碑版本:顧名思義,這每每指某一個版本的里程碑。例如,Maven 3已經發布了不少里程碑版本,如3.0-alpha-1、3.0-alpha-2、3.0-beta-1等,這樣的版本與正式的3.0相比,每每表示不是很是穩定,還須要不少測試
關於版本號須要注意的地方
1、不是每一個版本號都必須擁有這四個部分,通常來講,主版本和次版本都會聲明,但增量版本和里程碑就不必定了
2、當用戶在聲明依賴或插件未聲明版本時,Maven就會根據上述版本號約定自動解析最新版本。這個時候就須要對版本號進行排序,對於主版本、次版本和增量版原本說,比較是基於數字的,所以1.5>1.4>1.3.11>1.3.9。而對於里程碑版本,Maven則只進行簡單的字符串比較,所以會獲得1.2-beta-3>1.2-beta-11的結果
理解主幹、標籤與分支
1、主幹:項目開發代碼的主體,是從項目開始直到當前都處於活動的狀態。從這裏能夠得到項目最新的源代碼以及幾乎全部的變動歷史
2、分支:從主幹的某個點分離出來的代碼拷貝,一般能夠在不影響主幹的前提下在這裏進行重大Bug的修復,或者作一些實驗性質的開發。若是分支達到了預期的目的,一般發生在這裏的變動會被合併(merge)到主幹中
3、標籤:用來標識主幹或者分支的某個點的狀態,以表明項目的某個穩定狀態,這一般就是版本發佈時的狀態
使用Maven管理項目版本,可能有這樣的場景
項目最初的版本是1.0.0-SNAPSHOT,通過一段時間的開發後,1.0.0版本發佈,這個時候就須要打一個標籤,圖中用一個長條表示。而後項目進入1.1.0-SNAPSHOT狀態,大量的開發工做都完成在主幹中,添加了一些新特性並修復了不少Bug以後。項目1.1.0發佈,一樣,這時候須要打另外一個標籤。發佈事後,項目進入1.2.0-SNAPSHOT階段,可這個時候用戶報告1.1.0版本有一個重大的Bug,須要儘快修復,咱們不能在主幹中修Bug,由於主幹有太多的變化,沒法在短期內測試完畢併發布,咱們也不能中止1.2.0-SNAPSHOT的開發,所以這時候能夠基於1.1.0建立一個1.1.1-SNAPSHOT的分支,在這裏進行Bug修復,而後爲用戶發佈一個1.1.1增量版本,同時打上標籤。固然,還不能忘了把Bug修復涉及的變動合併到1.2.0-SNAPSHOT的額主幹中,主幹在開發一段時間以後,發佈1.2.0版本,而後進入到新版本1.3.0-SNAPSHOT的開發過程當中
使用Maven Release Plugin插件,流程化管理版本發佈
Maven Release Plugin主要有三個目標,它們分別爲:
n release:prepare,準備版本發佈
n release:rollback,回退release:prepare所執行的操做
n release:perform,執行版本發佈
release:perpare目標都作了哪些操做?
n 檢查項目是否有未提交的代碼
n 檢查項目是否有快照版本依賴
n 根據用戶的輸入將快照版本升級爲發佈版
n 將POM中的SCM信息更新爲標籤地址
n 基於修改後的POM執行Maven構建
n 提交POM變動
n 基於用戶輸入爲代碼打標籤
n 對代碼從發佈版升級爲新的快照版
n 提交POM變動
release:rollback目標都作了哪些操做?
將POM回退至release:prepare以前的狀態,並提交。須要注意的是,該步驟不會刪除release:prepare生成的標籤,所以用戶須要手動刪除
release:perform目標都作了哪些操做?
簽出release:prepare生成的標籤中的源代碼,並在此基礎上執行mvn deploy命令打包並部署構件至倉庫
另外,使用Maven Release Plugin插件須要注意
1、要爲項目發佈版本,首先須要爲其添加正確的版本控制系統信息
2、這是由於Maven Release Plugin須要知道版本控制系統的主幹、標籤等地址信息後才能執行相關的操做
通常的SCM,版本發佈配置SCM信息以下
<project>
...
<scm>
<connection>scm:svn:http://10.1.0.56/app/trunk</connection>
<developerConnection>scm:svn:http://10.1.0.56/app/trunk</developerConnection>
<url>http://10.1.0.56/account/trunk</url>
</scm>
...
</project>
對上面配置進行說明
1、connection元素表示一個只讀的scm地址
2、developerConnection元素表示可寫的scm地址
3、url表示能夠在瀏覽器中訪問的scm地址
4、爲了讓Maven識別,connection和developerConnection必須以scm開頭,冒號以後的部分表示版本控制工具類型(這裏是svn),Maven還支持cvs、git等
5、接下來纔是實際的scm
地址,該配置中的connection使用了http協議,而developerConnection則因爲涉及寫操做,使用https協議進行了保護
上面的配置只告訴Maven當前代碼的位置(主幹),而版本發佈還要涉及標籤等操做,所以,還須要配置Maven Release Plugin告訴其標籤的基礎目錄
配置maven-release-plugin提供標籤基礎目錄
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.0</version>
<configuration>
<tagBase>http://10.1.0.56/app/tags/</tagBase>
</configuration>
</plugin>
在執行release:prepare以前還有兩個注意點
1、系統必需要提供svn命令行工具,Maven須要svn命令行工具執行相關操做,而沒法使用圖形化工具,如TortoiseSVN;
2、POM必須配置了可用的部署倉庫,由於release:perform會執行deploy操做將構件發佈到倉庫中
maven-release-plugin提供autoVersionSubmodules參數
使用這個參數,maven-release-plugin會自動爲全部子模塊使用與父模塊一致的發佈版本和新的SNAPSHOT版本:
mvn release:prepare -DautoVersionSubmodules=true
若是使用release:prepare命令執行的結果沒有問題,就執行mvn release:perform命令
這部分會出現不少問題!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
執行release:perform和release:branch命令之後再試
如何保障構件的安全性
當從中央倉庫下載第三方構件的時候,你可能會想要驗證這些文件的合法性,例如它們是由開源項目官方發佈的,而且沒有被篡改過,一樣地,當發佈本身項目給客戶使用的時候,你的客戶也會想要驗證這些文件是不是由你的項目組發佈的,且沒有被惡意篡改過PGP (Pretty Good Privacy)就是這樣一個用來幫助提升安全性的技術。PGP最經常使用來給電子郵件進行加密、解密以及提供簽名,以提升點子郵件交流的安全性
基於PGP標準的GPG
GnuPG (簡稱GPG,來自http://www.gnupg.org/) 是PGP標準的一個免費實現,不管是類UNIX平臺仍是Windows平臺,均可以使用它。GPG可以幫助咱們爲文件生成簽名、管理密鑰以及驗證簽名等
具體如何使用GnuPG之後用到再說吧