背景:
在客户那边做的一个项目,我中途加入项目组,项目版本管理在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>
在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方面我的理解还比较浅的。如果有出现的明显的错误请见谅:^)。