背景: html
在客戶那邊作的一個項目,我中途加入項目組,項目版本管理在SVN上,因爲沒有分主線,分支,與里程碑版本。在第一次上線時,上了SVN上的一個版本,後來對這次上線的SVN上的版本遺望了。在其後的幾回上線中,對於項目功能有部分功能未完成、不上線的、或要更新上部分功能這種狀況,處理時簡單在一個Checkout下來的最近版本項目進行更改來進行上線,其實還好沒遇到一些大問題。另外碰到的一個問題是,上線的一些功能要配合其餘項目組的上線的功能,例如一個爲咱們提供單點登陸的項目組,他們上線,以前他們的單點登陸在測試沒有集羣的環境,與咱們項目測試環境通過測試是能夠正常使用的。可是線上環境下就不必定了。咱們要準備多一套上線的包,來應付對方若是上線功能有問題,咱們系統仍是緣用以前可使用的功能。 apache
對於上面的狀況,咱們考慮到在版本控制管理上,確實還作得不夠,要使用一些合理點的方式來進行管理。對於我我的,這也是在摸索之中,也沒有什麼最佳實踐。因而有了這麼一次的Spike,主要以實戰爲主,對於背後的理論大夥能夠參考一些資料。憑藉着對《maven in action》這本書的一些記憶。動手操做了一下^-^,在這其中也遇到了一些錯誤跟問題,這裏跟分享一下。 服務器
實戰: mvc
建立一個SVN的Repository。 我這邊使用的是VisualSVN Server, 一個很傻瓜很好用的SVN服務器^-^ maven
Repositories右鍵,Create New Repository。輸入spike-svn-maven、先下面標紅的建立主幹、分支、里程碑(標籤)目錄。 svn
如上圖建立一個名稱爲 spike-svn-maven的版本庫URL爲(https://xzf-pc:8083/svn/spike-svn-maven)。 測試
而後進入到本身準備放工程的目錄,我本身而言:e:\project\xzf_20130929\spike-svn-maven。 網站
這些目錄用小烏龜(TortoiseSVN客戶端)根據上面建立完Repository後給出的SVN的URL,Checkout下來。 ui
這個咱們要的三個目錄就準備好了。 url
進入e:\project\xzf_20130929\spike-svn-maven\trunk
打開CMD命令行。建立一個maven工程:
mvc archetype:create -DgroupId=com.fengzidm.spike -DartifactId=spike-svn-maven -DpackageName=com.fengzidm.spike
ps:這裏我犯了一個錯誤是。這裏建立了一個工程,會在trunk目錄下產生 \trunk\spike-svn-manen\ .... 這樣的目錄。我後面忘記了將trunk\spkie-svn-maven裏面的
東西所有剪切到trunk\下,並將spkie-svn-maven這個目錄刪除。致使了我後面使用release插件時,報找不到pom.xml文件的錯誤。
進行到這一步。咱們打開生成工程的pom.xml文件,並修改爲如下內容(根據我機器上的配置來進行的修改)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.fengzidm.spike</groupId> <artifactId>spike-svn-maven</artifactId> <version>1.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spike-svn-maven</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <!-- release插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.1</version> <configuration> <!-- 設置分支跟里程碑的url --> <branchBase>https://localhost:8083/svn/spike-svn-maven/branches</branchBase> <tagBase>https://localhost:8083/svn/spike-svn-maven/tags</tagBase> </configuration> </plugin> </plugins> </build> <!-- SCM配置 --> <scm> <url>https://localhost:8083/svn/spike-svn-maven/trunk</url> <connection>scm:svn:https://localhost:8083/svn/spike-svn-maven/trunk</connection> <developerConnection>scm:svn:https://localhost:8083/svn/spike-svn-maven/trunk</developerConnection> </scm> <!-- 配置release插件發佈到個人Nexus倉庫 --> <distributionManagement> <repository> <id>nexus-releases</id> <name>Nexus Releases Repository</name> <url>http://localhost:8081/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <name>Nexus Snapshots Repository</name> <url>http://localhost:8081/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement> </project>
裏面對maven的scm配置進行了配置,還配置了發佈到個人Maven倉庫的信息。還有就是release插件。
配置好以後,我用小烏龜進行一下代碼提交。
maven 的 scm支持仍是挺好用的。有一些相關的命令,官方網站爲:http://maven.apache.org/scm/maven-scm-plugin/
像以前的導入操做,咱們能夠經過
mvn scm:checkout 這們的命令進行。
有兩個操做是爲後面操做奠基基礎的,是scm:tag跟scm:branch。我用這兩個命令測試了一下。建立里程碑跟分支
mvn scm:tag -Dbasedir=E:\project\xzf_20130929\spike-svn-maven\tags -Dtag=first-tag.0.0.1
建立完成後,進入spike-svn-maven\tags\first-tag.0.0.1這個目錄。來繼續建立分支
mvn scm:branch -Dbasedir=E:\project\xzf_20130929\spike-svn-maven\branches -Dbranch=first-tag.0.0.1.branch.0.0.1
(這裏tag 跟 branch的名字我是亂取的哈) 而後用小烏龜查看svn服務上的改工程的倉庫圖:
咱們這樣就根據主線版本庫,建立了里程碑跟在裏面碑上面建立分支修改了。
可是這樣建立的里程碑跟分支若進行mvn:clean deploy上傳在咱們的maven倉庫中,都是snapshot版本的。
使用release插件進行操做: 官網:http://maven.apache.org/maven-release/maven-release-plugin/examples/prepare-release.html
將剛纔建立的first-tag.0.0.1跟first-tag.0.0.1.branch.0.0.1在svn版本庫上刪除。而後本地進行更新到最近版本。
而後將我上面以前的犯的一個小錯誤糾正。將trunk\spike-svn-maven裏面的東西所有移動到trunk\目錄下,而後刪除spike-svn-maven這個目錄進行一下提交代碼。
咱們的CMD命令行定位到工程目錄 :E:\project\xzf_20130929\spike-svn-maven\trunk
mvn release:prepare
裏面能夠自定版本號之類的,簡單起見我就一路回車去了。在顯示 BUILD SUCCESS後,咱們的工程目錄下多了幾個文件
觀察pom.xml,會發現裏面的version版本號按照上次的規則進行了變化。pom.xml.releaseBackup是備份文件。
若是在上次prepare操做,有修改或以爲不滿意,能夠執行 mvn release:rollback ,而後記得進擴target目錄下面把 checkhout目錄刪除 (或執行mvn release:clean)
而後在版本庫上把上面生成的tags文件刪除,貌似這個要手工刪除。
一切就緒 ok 以後 ,咱們發佈。
mvn release:perform
一樣的BUILD SUCCESS後,咱們的一次release 里程碑發佈就OK了。這時咱們看svn庫上:
這時,咱們trunk下的pom.xml裏面的版本信息
<groupId>com.fengzidm.spike</groupId> <artifactId>spike-svn-maven</artifactId> <version>1.1-SNAPSHOT</version> <packaging>jar</packaging>
在release:perform操做時,會上傳release版本到個人maven倉庫nexus服務中去。
若是咱們對trunk\spike-svn-maven進行一下mvn clean deploy操做。登陸到nexus服務器中:
release版本跟snapshot版本已經分佈發佈。
在里程碑版本建立分支進行開發:
咱們在發佈了里程碑版本,並放上線後,若是幾個地方放了不一樣的版本。我如今要在原來1.0的release版本中發佈中建立一個分支來進行修正。
使用release:branch命令建立。
命令行定位到tags\spike-svn-mave-1.0\目錄 :
mvn release:branch -DbranchName=spike-svn-maven-1.0.1 -DupdateBranchVersions=true -DupdateWorkingCopyVersions=false
這樣操做,maven會提示你要求給此次分支定義的版本,輸入 1.0.1-SNAPSHOT,而後回車。而後就提示BUILD SUCCESS啦!
這裏的svn上的目錄結構:
分支版本建立好了。之於修改後發佈。這些操做類似。若是要合併到主版本庫去又是一個話題:^) , 這些我沒經驗就先不說啦。
最後,通過這一次spike實戰後,對maven的這幾個插件有了必定了解,也嘗試解決了一些問題。總的來講收穫很多。
對scm跟svn方面個人理解還比較淺的。若是有出現的明顯的錯誤請見諒:^)。