SVN Maven SCM 跟 release 插件的Spike

背景: 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>

已經變成了1.1-SNAPSHOT版本了。而tags/spike-svn-maven-1.0/pom.xml上的version爲 1.0


在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方面個人理解還比較淺的。若是有出現的明顯的錯誤請見諒:^)。

相關文章
相關標籤/搜索