SVN Maven SCM 跟 release 插件的Spike

一曲冷凌霜 提交于 2019-11-30 14:24:36

背景:

    在客户那边做的一个项目,我中途加入项目组,项目版本管理在SVN上,由于没有分主线,分支,与里程碑版本。在第一次上线时,上了SVN上的一个版本,后来对此次上线的SVN上的版本遗望了。在其后的几次上线中,对于项目功能有部分功能未完成、不上线的、或要更新上部分功能这种情况,处理时简单在一个Checkout下来的最近版本项目进行更改来进行上线,其实还好没遇到一些大问题。另外碰到的一个问题是,上线的一些功能要配合其他项目组的上线的功能,例如一个为我们提供单点登录的项目组,他们上线,之前他们的单点登录在测试没有集群的环境,与我们项目测试环境经过测试是可以正常使用的。但是线上环境下就不一定了。我们要准备多一套上线的包,来应付对方如果上线功能有问题,我们系统还是缘用之前可以使用的功能。

    对于上面的情况,我们考虑到在版本控制管理上,确实还做得不够,要使用一些合理点的方式来进行管理。对于我个人,这也是在摸索之中,也没有什么最佳实践。于是有了这么一次的Spike,主要以实战为主,对于背后的理论大伙可以参考一些资料。凭借着对《maven in action》这本书的一些记忆。动手操作了一下^-^,在这其中也遇到了一些错误跟问题,这里跟分享一下。

实战:

创建一个SVN的Repository。 我这边使用的是VisualSVN Server, 一个很傻瓜很好用的SVN服务器^-^

Repositories右键,Create New Repository。输入spike-svn-maven、先下面标红的创建主干、分支、里程碑(标签)目录。

如上图创建一个名称为 spike-svn-maven的版本库URL为(https://xzf-pc:8083/svn/spike-svn-maven)。

然后进入到自己准备放工程的目录,我自己而言:e:\project\xzf_20130929\spike-svn-maven。

这些目录用小乌龟(TortoiseSVN客户端)根据上面创建完Repository后给出的SVN的URL,Checkout下来。

这个我们要的三个目录就准备好了。

进入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方面我的理解还比较浅的。如果有出现的明显的错误请见谅:^)。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!