本地文件导入到svn服务器中是怎么存在的,可以在服务器中查到源文件,还是在服务器中以另一种结构存在
百万级访问量网站的技术准备工作
当今从纯网站技术上来说,因为开源模式的发展,现在建一个小网站已经很简单也很便宜,所以很多人都把创业方向定位在互联网应用。这些人里大多数不是很懂技术,或者不是那么精通,而网站开发维护方面的知识又很分散,学习成本太高,所以这篇文章将这些知识点结合起来,系统的来说,一个从日几千访问的小小网站,到日访问一两百万的小网站,中间可能会产生什么问题,以及怎么才能在一开始做足工作尽量避免这些问题。
你的网站因为努力经营,访问量逐渐升高,在升高的过程中,问题也可能开始显现了。因为带宽的增加、硬件的扩展、人员的扩张所带来的成本提高是显而易见的,而还有相当大的一部分成本是因为代码重构、架构重构,甚至底层开发语言更换引起的,最坏的情况就是数据丢失,所有努力付之一炬。这类成本支出大多数在一开始就可以避免,先打好基础,往后可以省很多精力,少操很多心。
对于不同的初期投资成本,技术路线的选择是不同的。这里假设网站刚刚只是一个构想,计划第一年服务器硬件带宽投入5万左右。对于这个资金额度,有很多种方案可选择,例如租用虚拟主机、租用单独服务器,或者流行的私有云,或者托管服务器。前两种选择,网站发展到一定规模时需迁移,那时再重做规划显然影响更大。服务器托管因为配置自主、能完全掌握控制权,所以有一定规模的网站基本都是这种模式。采用自己托管服务器的网站,一开始要注意以下几点——
一、开发语言
一般来说,技术人员(程序员)都是根据自己技术背景选择自己最熟悉的语言,不过不可能永远是一个人写程序,所以在语言的选择上还要是要费些心思。首先明确一点,无论用什么语言,最终代码质量是看管理,因此我们从前期开发成本分析。现在国内流行的适用于网站的语言,大概有java、php、net、 python、ruby这五大阵营。python和ruby因为在国内流行的比较晚,现在人员还是相对难招一些。net平台的人相对多,但是到后期需要解决性能问题时,对人员技能的要求比较高。剩余的java、php用人可以说是最多的。java和php无法从语言层面做比较,但对于初期,应用几乎都是靠前端支撑的网站来说,php入门简单、编写快速,优势相对大一点。至于后端例如行为分析、银行接口、异步消息处理等,等真正需要时,就要根据不同业务需求来选择不同语言了。
二、代码版本管理
稍微有点规模的网站就需要使用代码版本管理了。代码版本管理两点最大的好处,一是方便协同工作,二是有历史记录可查询比较。代码版本管理软件有很多,vss/cvs/svn/hg等,目前国内都比较流行,其中svn的普及度还是很高的。
假设选了svn,那么有几点考虑。一是采用什么树结构。初期可能只有一条主干,往后就需要建立分支,例如一条开发分支,一条上线分支,再往后,可能要每个小组一个分支。建议一开始人少时选择两条分支,开发和线上,每个功能本地测试无误后提交到开发分支,最后统一测试,可以上线时合并到上线分支。如果每人都建自己的分支,合并时会浪费很大精力,对于几乎每天都要修改几次的WEB应用来说,所费时间太多。
向服务器部署代码,可以手工部署也可以自动部署。手工部署相对简单,一般可直接在服务器上svn update,或者找个新目录svn checkout,再把web root给ln -s过去。应用越复杂,部署越复杂,没有什么统一标准,只是别再用ftp上传那种形式,一是上传时文件引用不一致错误率增加,二是很容易出现开发人员的版本跟线上版本不一致,导致本来想改个错字结果变成回滚。如果有多台服务器还是建议自动部署,更换代码的机器从当前服务池中临时撤出,更新完毕后再重新加入。
三、服务器硬件
在各个机房里,靠一台服务器孤独支撑的网站数不清,但如果资金稍微充足,建议至少三台的标准配置,分别用作web处理、数据库、备份。web服务器至少要8G内存,双sata raid1,如果经济稍微宽松,或静态文件或多,则15k sas raid10。数据库至少16G内存,15k sas raid 10。备份服务器最好跟数据库服务器同等配置。硬件可以上整套品牌,也可以兼容机,也可以半品牌半组装,取决于经济能力。当然,这是典型的搭配,有些类型应用的性能瓶颈首先出现在web上,那种情况就要单独分析了。
web服务器可以既跑程序又当内存缓存,数据库服务器则只跑主数据库(假如是MySQL的话),备份服务器所承担就相对多一些,web配置、缓存配置、数据库配置都要跟前两台一致,这样WEB和数据库任意一台出问题,很容易就可以将备份服务器切换过去临时顶替,直到解决完问题。要注意,硬件是随时可能坏掉的,特别是硬盘,所以宁可WEB服务器跟数据库服务器放在一起,也一定不能省掉备份,备份一定要异机,并且有异步,电力故障、误操作都可能导致一台机器上的所有数据丢失。很多的开源备份方案可选择,最简单的就是rsync,写crontab里,定时同步。备份和切换,建议多做测试,选最安全最适合业务的,并且尽可能异地备份。
四、机房
三种机房尽量不要选:联通访问特别慢的电信机房、电信访问特别慢的联通机房、电信联通访问特别慢的移动或铁通机房。机房要尽可能多的实地参观,多测试,找个网络质量好,管理严格的机房。机房可以说是非常重要,直接关系到网站访问速度,网站访问速度直接关系到用户体验,访问速度很慢的网站,很难获得用户青睐。
五、架构
在大方向上,被熟知的架构是web负载均衡+数据库主从+缓存+分布式存储+队列。在一开始,按照可扩展的原则设计和编程就可以。只是要多考虑缓存失效时的雪崩效应、主从同步的数据一致性和时间差、队列的稳定性和失败后的重试策略、文件存储的效率和备份方式等等意外情况。缓存失效、数据库复制中断、队列写入错误、电源损坏,在实际运维中经常发生,如果不注意这些,出现问题时恢复期可能会超出预期很长时间。
六、服务器软件
操作系统Linux很流行。在没有专业运维人员的情况下,应倾向于择使用的人多、社区活跃、配置方便、升级方便的发行版,例如RH系列、 debian、ubuntu server等,硬件和操作系统要一起选择,看是否有适合的驱动,如果确定用某种商业软件或解决方案,也要提前知晓其对哪种操作系统支持最佳。web服务器方面,apache、nginx、lighttpd三大系列中,apache占有量还是最大,但是想把性能调教好还是需要很专业的,nginx和 lighttpd在不需要太多调整的情况下可以达到一个比较不错的性能。无论选择什么软件,除非改过这些软件或你的程序真的不兼容新版本,否则尽量版本越新越好,版本新,意味着新特性增多、BUG减少、性能增加。一个典型的php网站,基本上大多数人都没改过任何服务器软件源代码,绝大多数情况是能平稳的升级到新版本的。类似于jdk5到 jdk6,python2到python3这类变动比较大的升级还是比较少见的。看看ChangeLog,看看升级说明,结合自己情况评估测试一下,越早升级越好,升级的越晚,所花费的成本越高。对于软件包,尽量使用发行版内置的包管理工具,没有特殊要求时不建议自己编译,那样对将来运维不利。
七、数据库
几乎所有操作最后都要落到数据库身上,它又最难扩展(存储也挺难)。数据库常见的扩展方法有复制、分片,设计时要考虑到每种应用的数据如何复制、分片,当然这种考虑一般会推迟到技术设计时期。在初期进行数据库结构设计时,要根据不同的业务类型和增长量预期来考虑是否要分库、分区,并且尽量不要使用联合查询、不使用自增ID以方便分片。复制延时问题、主从数据库数据一致性问题,可以自己写或者用已有的运维工具进行检测。
用存储过程是比较难扩展的,这种情形多发生于传统C/S,特别是OA系统转换过来的开发人员。低成本网站不是一两台小型机跑一个数据库处理所有业务的模式,是机海作战。方便水平扩展比那点预分析时间和网络传输流量要重要的多的多。
另外,现在流行一种概念叫NoSQL,可以理解为非传统关系型数据库。实际应用中,网站有着越来越多的密集写操作、上亿的简单关系数据读取、热备等,这都不是传统关系数据库所擅长的,于是就产生了很多非关系型数据库,比如Redis/TC&TT/MongoDB/Memcachedb等,在测试中,这些几乎都达到了每秒至少一万次的写操作,内存型的甚至5万以上。在设计时,可根据业务特点和性能要求来选择是否使用这类数据库。例如 MongoDB,几句配置就可以组建一个复制+自动分片+failover的环境,文档化的存储也简化了传统设计库结构再开发的模式。但是当你决定采用一项技术时,一定要真正了解其优劣,例如可能你所选择的技术并不能支持你所需要的事务和数据一致性要求。
八、文件存储
存储的分布几乎跟数据库扩展一样困难,不过只有百万的PV的情况下,磁盘IO方面一般不会成大问题,一两台采用SATA做条带RAID的机器可以应付,反而是自己做异步备份比较复杂,因为小文件多。如果只有一台机器做存储,可以做简单的优化,例如放最小缩略图的分区和放中等缩略图的分区,根据平均大小调整一下块大小。存储要规划好目录结构,否则文件增多后维护起来复杂,也不利于扩展。同时还要考虑将来扩容,例如采用LVM,或者把文件根据不同规则散列到不同机器。磁盘IO繁重的情况下更容易出现故障,所以要做好备份,若发现有盘坏掉,要马上行动更换,很多人的硬盘都是坏了一块之后,接二连三的坏下去。
为了将来走cdn做准备,一开始最好就将的域名分开,且不用主域名。因为很多网站都将cookie设置到了domainltd,如果也在这个域名下,很可能因为cookie而造成缓存失效,并且占多余流量,还可能因为浏览器并发线程限制造成访问缓慢。
九、程序
一定硬件条件下,应用能承载多少访问量,很大一部分也取决于程序如何写。程序写的不好,可能一万的访问都承载不了,写的好,可能一两台机器就能承担几百万PV。越是复杂、数据实时性要求越高的应用,优化起来越难,但对普通网站有一个统一的思路,就是尽量向前端优化、减少数据库操作、减少磁盘IO。向前端优化指的是,在不影响功能和体验的情况下,能在浏览器执行的不要在服务端执行,能在缓存服务器上直接返回的不要到应用服务器,程序能直接取得的结果不要到外部取得,本机内能取得的数据不要到远程取,内存能取到的不要到磁盘取,缓存中有的不要去数据库查询。减少数据库操作指减少更新次数、缓存结果减少查询次数、将数据库执行的操作尽可能的让你的程序完成(例如join查询),减少磁盘IO指尽量不使用文件系统作为缓存、减少读写文件次数等。程序优化永远要优化慢的部分,换语法是无法“优化”的。
然而编程时不应该把重点放在优化上,应该关注扩展性。当今的WEB应用,需求变化非常之快,适应多种需求的架构是不存在的,我们的扩展性就要把要点放在跟底层交互的架构上,例如持久化数据的存取规则、缓存的存取规则等,还有一些共用服务,例如用户信息等。先把不变的部分做完善,剩下的部分就很容易将精力放在业务逻辑上面了。
21 文件检出
安装TortoiseSVN后,SVN会跟Windows的资源管理器完美集成。点击右键,我们可以在菜单栏中选择“SVN检出”选项,输入要检出代码的文件库的URL地址,我们就可以检出该URL地址下的文件库的文件。默认情况下是检出最新版本的代码,如果需要,我们可以通过浏览日志,根据日志来找出想要的版本,然后在“版本”选项中指定相应版本就可以检出相关代码了 。
之后,对于同一个项目的主干开发,我们都在这个检出的代码文件目录下操作,而不是每一次提交或更新都重新检出一次。
22 文件添加
我们在本地创建的文件(包括目录)不会受SVN的控制,为了让其接受SVN的控制必须将其添加到文件库中。对于团队其他成员需要的文件,如代码文件、某些模块的a文件(由于某些需要,该模块代码不公开),我们必须让它们接受SVN的控制,并且保持最新的版本。
23 文件删除
当我们需要删除无用的文件(包括目录)时,不能使用Windows的资源管理工具,而必须使用SVN本身的删除文件功能。这样该文件被删除后,其所有修改历史仍然保存在SVN服务器中,以后仍然可以获得该文件的修改历史。
24 文件改名
当我们需要对文件(包括目录)进行改名的时,不能使用Windows的资源管理工具,而必须使用SVN本身的文件改名功能。这样该文件被改名后,其改名前的所有修改历史仍然保存在SVN服务器中,保持连续的修改信息。
25 文件更新
其他团队成员提交到SVN上的改动不会自动更新到你的本地拷贝中来,我们需要通过更新文件操作来获取其他成员对项目文件所做的修改。SVN更新文件操作会把文件库里的文件与本地文件进行合并,从而达到了同时保留其他成员的修改及本地的修改的目的。如果无法自动合并则会发生冲突,需要使用文件比较工具进行手工合并,合并完成后才能提交已解决冲突的文件。冲突的详细解决方法见第三章——冲突解决。
在团队开发时,更新是一件很重要的工作,可以保持团队成员之间的工作内容一致,因此要注意经常更新自己的工作拷贝,以保证自己能够获得最新的修改内容。
26 改动提交
我们对文件(包括目录)所做的一切改动,包括添加、删除、修改文件都必须提交到SVN服务器文件库中才能正式生效,之后团队的其他成员才可以获取你所作的修改。
提交是很重要的一项操作,要求做到:
提交代码之前一定要保证修改后的代码能编译通过,不能提交编译不通过的代码。
比较修改前及修改后的代码,把调试信息或其他不相关的信息去掉,再次确保提交的代码是正确的并且提交的是需要提交的文件。
不要等到修改了很多代码才提交,而是相关小功能完成时就应该提交一次。这样以后发现问题时就很容易撤销有问题的代码——因为撤销只能针对一次提交,所以在一次提交里涉及过多的功能是不推荐的。
提交时必须填写log信息,说明这次提交增加了什么功能或者修正了什么bug。这些信息有助于自己和其他团队成员了解整个项目的历史。当出现问题时也方便定位到对应的版本代码,所以log信息必须足够详细。
事务性提交。也就是说提交要么成功,要么全部失败——即提交出现错误时会自动回滚,实际上没有提交任何东西。出现错误时,解决错误,再次提交上次提交的全部内容即可。
3 冲突解决
冲突的解决是我们使用SVN过程中的一个棘手问题,所以独立一节来谈论。
31 冲突的产生
冲突发生在多个成员同时对同一个文件进行修改的情形下。即当有其他成员已经提交了修改,而自己在本地拷贝中也对该文件进行了修改,而且修改的是同一个地方,那么在进行本地文件的更新时,SVN会不知道该选择那个修改(SVN上的修改还是本地的修改)来进行合并,所以冲突就产生了。
举例说,假如受SVN控制的文件Daytxt在SVN服务器上的当前内容如下:
图表 3 Daytxt文件在本地的修改
我们可以看到,在文本的第一行,SVN上及本地都做了修改。这样当在本地进行更新(提交之前必须先更新),SVN合并时就不知道monday后面到底该是work还是sleep,所以冲突就产生了。
而第三、五行是各自进行了修改,并没有冲突,所以这两行可以顺利合并,合并后可以看到所有人所做的修改。
32 冲突的解决
冲突发生后,SVN会在本地保存该文件的不同修改版本,见下图蓝色图标:
图表 4 Daytxt文件的不同版本
Daytxtr35是版本35的Daytxt文件(本地拷贝最新版本)
Daytxtr37是版本37的Daytxt文件(SVN上最新版本)
Daytxtmine的是本地修改后的Daytxt文件
Daytxt文件中包含了合并后的内容
321 简单冲突解决
对于简单的内容冲突,我们可以直接在合并后的文件上修改。在上例中,我们打开Daytxt文件,可以看到SVN合并后的内容:
图表 5 Daytxt合并后内容
我们看到没有冲突的修改:(play basketball)及(meeting)顺利地合并了,而冲突的部分出现了一些标记。其中标记
<<<<<<< mine
=======
之间包含的是本地修改的冲突部分的内容,即monday(work)。而标记
=======
>>>>>>> r37
之间包含的是版本37(SVN上最新版本)该部分内容,即monday(sleep)。
不失一般性,假如我们现在要保留的内容是monday(work),那么我们只要把标记及monday(sleep)部分内容去掉即可:
图表 6 Daytxt解决冲突后内容
确保修改正确后,把Daytxt文件设置为“已解决的”。
图表 7 Daytxt标记为已解决
之后,后缀为mine,r35,r37文件全部消失,仅保留已解决冲突的Daytxt文件,提交到SVN即可。
322 复杂冲突解决
对于文件内容复杂的文件,上述的解决方法容易漏掉一些要修改的部分,解决起来也耗时耗力。这时要通过SVN提供的工具来解决。
选择SVN功能“编辑冲突”,打开冲突编辑工具:
图表 8 冲突编辑工具
上半部分的两个内容栏分别显示的是版本37的内容及本地修改的内容。
下半部分的内容栏显示的是合并后的内容。
每个内容栏左边的标记清楚地标识了该文件做了那些修改。
文件冲突的部分用红色显眼地表示了出来。在合并栏,点击冲突部分,点击右键,我们可以选择用哪个内容(SVN上最新内容或者本地修改内容)来解决冲突部分,也可以选择两个内容都使用,同时选择它们出现的先后顺序。
逐一解决各个冲突。确保所有冲突都解决后,保存文件,并标记为“已解决”的,退出该工具即完成冲突的解决。
4 加锁策略
事实上,解决冲突还有一种方法,那就是“严格加锁”。
“严格加锁”要求在编辑文件之前必须先对文件加锁,然后才能进行编辑。此时团队其他成员不能对该文件进行编辑,即保证了同一时刻只有一个人在编辑该文件,因此避免了冲突的出现。
那么,什么类型的文件我们应该采取“严格加锁”呢?
Excel、等不可合并的文件,我们必须对其“严格加锁”。“严格加锁”的文件都标记为“可读”的,即不可编辑。要编辑这些“严格加锁”的文件,必须先对其加锁,加锁后文件更改为“可读可写”。编辑完这类文件后要第一时间提交。提交完成时,SVN会自动解开任何你拥有的锁 。
文本文件,比如程序代码,SVN通常可以为我们合并改动,无须“严格加锁”。对于一些大家都频繁改动的重要源代码文件,可能会引起大量冲突,我们也不推荐“严格加锁”,因为加锁会导致大家持续得走来走去去询问加锁情况。正确做法是把文件分成数个逻辑单元,大家都修改各自的单元,减少合并时的冲突。
5 标签&分支
一个项目最初存放的目录我们称之为主干(trunk)。下面我们讨论除了主干之外其他存放项目的目录——标签(tag)和分支(branch)。
51 标签(tag)
版本号可以区分多次的代码修改,我们可以使用版本号来检出需要的代码,但对于重要版本的代码,如第三版发布代码,我们不希望记住r37这样的数字。这时,我们就可以通过创建标签来对SVN中这个发布版本的文件的这个时刻的状态创建一个“快照”,以后就可以通过这个标签名字来检出第三发布版本的代码。
标签其实是当前项目文件的简单拷贝,保存在标签所在的目录下。创建标签也是挺简单的,不过要注意:
标签的名字一定要有描述性,可以仅凭名字就知道为什么要创建标签。
不能过多地使用标签,只有在重要时刻或者发布版本时才可以创建标签。
标签是项目文件在某个时刻的状态,不能对其进行修改 。
52 分支(branch)
分支跟标签一样,也是当前项目文件的简单拷贝,保存在分支所在的目录下。
分支跟标签的根本区别在于,标签不能对其进行修改,而分支就是为了某种目的的修改而建立的。在检出代码时检出指定分支即可,分支的操作跟主干上的操作完全相同。
521 何时创建
遇到下述情况,我们可以通过创建分支来解决问题:
发布分支
当我们快要发布一个版本了,一个开发小团队要为这次发布做好准备,比如说修改一些收尾的bug。这时他们需要的是项目的稳定性,而同时我们还有其他团队要开发预计下次发布才会添加进去的功能,显然他们不能在同一份代码上工作,因此我们需要从主干中建立出一个发布分支,发布团队都从这个发布分支检出及提交代码。当程序被发布之后,这个分支依然是活动的。这样,如果客户报告了一些bug,团队会在这个发布分支中修正它们并视情况合并到主干中去。
试验分支
当我们需要对项目做大范围的改动,并且这改动对系统的其余部分有深远的影响,而我们又不能保证这次改动一定能成功的时候就可以建立试验分支。如果试验失败了,可以废弃这个分支;成功了我们只要把分支的改动合并到主干代码中去就可以了。
其他情况,我们不建议创建分支,更不推荐在分支上创建分支,因为分支过多,合并时的冲突将会是一种难于解决的灾难。
522 合并分支
我们在分支上所修正的bug很可能在主干上或者其他分支上也存在,因为它们往往来自同一份代码,所以我们在分支上所做的改动有必要合并到主干或者其他分支中去。
对于简单的bug,一次提交就能解决问题的,那么我们只要记住提交新版本号,然后使用新版本号把改动合并到其他的受影响的主干及分支中去就可以了。
对于复杂的bug,可能需要多个开发者花几天的时间提交多次才能修好。这时光用版本号来记住修改的内容就有点勉为其难了。因此,我们可以使用标签来标记我们修正过程的开始和结束,然后使用这些标签帮助我们把修正的代码合并到主干和其他分支中去。整个过程如下:
① 给分支打个标签,标记bug修改开始。
② 测试重现bug,修正代码让新测试通过。
③ 提交你的改动到SVN上。
④ 重复步骤2、3,直到确定bug已经修正。
⑤ 再给分支打个标签,标记bug修正结束。
⑥ 使用两个标签来把修正的代码合并到所有其他受影响的主干和分支上。
6 注意事项
经常更新
由于文件可能有多个人修改,应该经常更新你的工作拷贝中的文件,这样能降低发生冲突的可能性。
测试提交
提交前先在本地进行测试。不允许将有错误的文件提交到SVN服务器上。
填写备注
提交时一定要写备注:备注有助于其他人(包括三个月后的你自己)理解你对文件所做的修改。
整体提交
提交文件时注意要提交一项改动所对应的所有文件,不要一次提交一个文件或者一次提交修改了很多功能的一堆文件。
发布标签
对于每一个发布的版本都要建立标签:当用户告诉你发生某个问题时,你可以迅速地追踪到问题是在哪个版本引入的 。
附:测试自动化小组SVN使用指导原则
1 Project的构建
Project在SVN服务器上的目录架构如下:
SVN上的项目文件:
1 必须保证Trunk上的代码是最新的!定期对Trunk上的代码进行更新,各小组可根据各自实际情况自己把握
2 Tag是根据项目需要所打的标签,每一个发布的版本都要打Tag,主要是方便有需要时可以直接根据Tag返回到之前的状态,以便于分析、测试;Tag中必须包含相应的release文件及当时编译或发布时的源代码,必须有相关的文档注明项目背景、发布情况等。
3 Branch文件夹可以用作备份用,可以用个人名字命名文件夹;此外,Branch分支主要用来进行短暂或者探索性的开发使用,最终的软件版本必须更新、合并到Trunk主干上。
4 关于同一项目组开发环境的建议:同一项目组成员的开发环境最好一致,软件安装路径和Project文件存放路径最好一致。
2 版本号
关于版本号命名规则:主版本号子版本号修正版本号
1 项目初版本时,版本号为010;
2 当项目在进行了局部修改或 bug 修正时,主版本号和子版本号都不变,修正版本号加 1;
3 当项目在原有的基础上增加了部分功能时,主版本号不变,子版本号加 1,修正版本号复位为 0;
4 当项目在进行了重大修改或局部修正累积较多,而导致项目整体发生全局变化时,主版本号加 1,子版本号和修正版本号复位为0;
5 编译版本号一般是编译器在编译过程中自动生成的,我们只定义其格式,如果编译器不能自动生成,人手添加,数值代表为当前的系统时间。
例子:V101 Build090305 Rel111123
其它版本使用规则:
1 α(alphal)内部测试版
此版本表示该软件仅仅是一个初步完成品,只在组内内部交流,该版本软件的 bug 较多,限内部测试使用。
例子:V011 Build090305 alphal1
2 β(beta)外部测试版
该版本相对于α版已有了很大的改进,经过组内的测试,消除了严重的错误,但还是存在着一些缺陷,需要经过大规模测试来进一步消除。
例子:V012 Build090305 beta1
3 demo 演示版
仅限评审或讲解时做介绍使用。
例子:V013 Build090305 demo1
4 release 最终版
该版本意味“最终释放版”,在出了一系列的测试版之后,终归会有一个正式版本,一般情况下,release不会以单词形式出现在软件封面上,取而代之的是符号 (Rel) 。release版本发布时,必须将待发布的软件和相应版本更新记录打包在一起发出。
例子:V101 Build090305 Rel111123
3 权限限制
如果项目本身需要对项目组成员作不同的权限控制,可以考虑维护两个工程:一个工程里面有相应的源文件,一个则只有编译后的文件。
4 模块的版本维护
1 文件一般不需要版本,但要有详细的更新历史记录;
2 模块可以以版本来维护,具体可以不同的文件夹区分。
您好,最简单的办法,将SVN服务器和测试服务器架设在同一台主机上,然后编辑SVN的post-commit钩子脚本,这个钩子是在每次成功commit后由SVN服务器自动调用执行的,存放在SVN服务器上该版本库的hooks文件夹下,编辑这个脚本,调用svn的checkout或者update,在SVN服务器主机上得到一个最新版的SVN客户端文件夹,接着通过这个脚本调用编译、部署指令,部署到测试服务器指定的文件夹,这就ok了。这样每次commit后就会自动发布一个新的测试版到测试服务器上。
当然了,也可以用操作系统的定时任务来做这个,来定时发布新测试版。
Jenkins 配置svn自动部署
Jenkins 环境搭建好之后,就需要配置项目了,这里也介绍一下。
新建一个项目
这里写描述
点击新建
输入项目名称
选择:构建一个自由风格的软件项目
点击 OK
这里写描述
输入项目描述
配置构建保留天数和最大个数
这里写描述
输入svn 项目地址
选择用户名&密码 #如果没有就,点击add 自己添加一个
这里写描述
配置每天 1:15AM 构建
配置每次 SCM 版本变更,构建
这里写描述
配置每次构建前,删除目录,放置构建产生的文件导致,svn 不能正常更新
这里写描述
添加构建:
这里写描述
cd /home/xxx/jenkins/workspace/fft-bill-web/ && ant #打开工作目录,项目会被更新到这个目录下, 执行ant 命令进行打包
cd /home/xxx/jenkins/workspace/fft-bill-web/release/ #打开war 目录,打好的包会被放到这个目录下
mv xxxx-1000war xxxwar #给war包重新命名
scp xxxwar user@192xxxxxxxxx:/opt/tomcat-xxxx/webapps #把war包发送到指定服务器目录
ssh user@192xxxxxxxxx "cd /xxx/xxx/tomcat-xxxx/bin && sh shutdownsh" #远程关闭 tomcat
ssh user@192xxxxxxxxx "cd /xxx/xxx/tomcat-xxxx/bin && sh startupsh" #远程命令启动 tomcat
1
2
3
4
5
6
1
2
3
4
5
6
到这里基本就配置完成了,点击立即构建,试一下。
后面还可以添加一些构建后的操作步骤,例如发送邮件等等。
0条评论