- Svn(subversion)是近年来崛起的很是优秀的版本管理工具,与CVS管理工具同样,SVN是一个跨平台的开源的版本控制系统。Svn版本管理工具管理着随时间改变的各类数据。这些数据放置在一个中央资料档案库(repository)中,这个档案库很像一个普通的文件服务器或者FTP服务器,可是,与其余服务器不一样的是,SVN会备份并记录每一个文件每一次的修改更新变更。这样咱们就能够把任意一个时间点的档案恢复到想要的某一个旧的版本,固然也能够直接浏览指定文件的更新历史记录。
- 为何会有svn这样一个项目?
- 官方解释:为了接管CVS的用户基础,确切的说,咱们写了一个新的版本控制系统,它和CVS很类似,可是它修正了之前CVS所没有解决的许多问题。问题见SVN官方首页。
- SVN是一个很是通用的软件系统,它常被用来管理程序源码,可是它也能够管理任何类型的文件,如文本,视频,图片等等。
SVN相关站点:php
Subversion官网:
http://subversion.tigris.org/
http://subversion.apache.org/
svn客户端:http://toroisesvn.net/
svn中文网站:http://www.iusesvn.com/
中文常见问题解答FAQ:http://subversion.apache.org/faq.zh.html
官方手册:http://svnbook.red-bean.com/ 中英都有css
svn版本控制系统是集中式的数据管理,存在一个中央版本库,全部开发人员本地开发所使用的代码都是来自于这个版本库,提交代码也都必须提交到这个中央版本库。html
svn版本控制系统工做流程以下:前端
缺点:java
当没法链接到中央版本库的环境下,你没法提交代码,将代码加入版本控制;
你没法查看代码的历史版本以及版本的变化过程。提交到版本控制系统中的代码咱们都默认经过自测可运行的,若是某个模块的代码比较复杂,不能短期内实现为可测试的功能,那么你须要等很长的时间才能提交本身的代码,因为代码库集中管理,所以,须要对中央版本库的存储作备份。这点分布式的版本控制系统要好一些。Svn的备份要备份全部代码数据以及全部更改的版本记录。linux
- git是由Linus开发的,因此很天然的git和Linux文件系统结合的比较紧密,以致于在windows上你必须使用cygwin才能使其完美的工做。
- 那git凭啥叫作分布式的版本控制系统呢?仍是从其工做模式讲起把。
- git中没有了中央版本库的说法了,可是为了开发小组的代码共享,咱们一般仍是会搭建一个远程的git仓库。
- 可是和svn不一样的是,开发者本地也包含了一个完整的git仓库,从某种程度上说本地的仓库和远程的仓库在身份上是等价的,没有主从之分。
- 若是你的项目是闭源项目,或者你习惯于以往的集中式的管理模式的话,那么在git下你也能够像svn那样的工做,只是流程中可能会增长一些步骤。
从上面的描述咱们能够看到,咱们每一个开发人员的本地都会有一个git库,咱们能够随时进行commit而不须要联网,能够随时查看历史版本,当某一个功能点开发完了以后咱们能够将commit后的内容push到远程git库了,若是远程git库的版本在你上次clone或者pull以后变化了,那么你须要进行pull并处理冲突,提交以后,再push到远程git库。ios
svn还是当前企业的主流。git正在发展,也许将来也会成为主流,但如今还不是。若是 有精力,能同时掌握更好。git
对于版本管理系统,运维人员须要掌握的技术点:程序员
svn服务常见的运行访问方式有3种:web
(1)独立服务器访问
访问地址如:svn://svn.nange.org/sadoc;
(2)借助apache等http服务
访问地址如:http://svn.nange.com/sadoc;
a,单独安装apache+svn(不要用)
b,CSVN(apache+svn)是一个单独的整合的软件,带web界面管理的SVN软件
(3)本地直接访问(例如:file://application/svndata/sadoc)
在这里,主要给 介绍第一种方式以及第二种方式中的CSVN web管理方式
SVN客户端能够经过多种方式访问服务器端,例如:本地磁盘访问,或各类各样不一样的网络协议访问,但一个版本库地址永远都是一个URL,URL反映了访问方法。
访问方式 | 说明 |
---|---|
file:// | 直接经过本地磁盘或者网络磁盘访问版本库 |
http:// | 经过WebDAV协议访问支持Subversion的Apache服务器 |
https:// | 与http://类似,可是用SSL加密访问 |
svn:// | 经过TCP/IP自定义协议访问svnserve服务器 |
svn+ssh:// | 经过认证并加密的TCP/IP自定义协议访问svnserve服务器 |
svn存储版本数据有2种方式:BDB(一种事务安全型表类型)和FSFS(一种不须要数据库的存储系统)。由于BDB方式在服务器中断时,有可能锁住数据,因此仍是FSFS方式更安全一点。
伯克利DB(Berkeley DB),版本库可使用的一种通过充分测试的后台数据库实现,不能在经过网络共享的文件系统上使用,伯克利DB是Subversion 1.2版本之前的缺省版本库格式
一个专用于Subversion版本库的文件系统后端,可使用网络文件系统(例如 NFS 或 SMBFS)。是1.2版本及其后的缺省版本库格式。
Svn是一种集中式文件版本管理系统。集中式管理的工做流程以下图:
集中式代码管理的核心是SVN服务器,全部开发者在开始新一天的工做以前必须从服务器获取代码,而后进行开发,最后解决冲突,提交。全部的版本信息都放在SVN服务器上。所以若是脱离了服务器,开发者就没法进行提交代码工做。
下面举例说明:
开始新一天的工做:
优势:
#检查环境 [root@localhost ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@localhost ~]# uname -m x86_64 [root@localhost ~]# uname -r 2.6.32-431.el6.x86_64 #光盘安装svn [root@localhost ~]# yum -y install subversion [root@localhost ~]# rpm -qa subversion subversion-1.6.11-9.el6_4.x86_64 #创建svn版本库数据存储根目录(svndata)及用户,密码权限目录(svnpasswd) mkdir -p /application/svndata #数据存储根目录 mkdir -p /application/svnpasswd #用户,密码权限目录
建立一个新的Subversion项目nange,其实,相似nange这样的项目能够建立多个,每一个项目对应不一样的代码,这里只是以建立一个项目为例演示:
[root@localhost ~]# svnadmin create /application/svndata/nange [root@localhost ~]# tree /application/svndata/nange/ /application/svndata/nange/ |-- README.txt |-- conf | |-- authz | |-- passwd | `-- svnserve.conf |-- db | |-- current | |-- format | |-- fs-type | |-- fsfs.conf | |-- min-unpacked-rev | |-- rep-cache.db | |-- revprops | | `-- 0 | | `-- 0 | |-- revs | | `-- 0 | | `-- 0 | |-- transactions | |-- txn-current | |-- txn-current-lock | |-- txn-protorevs | |-- uuid | `-- write-lock |-- format |-- hooks | |-- post-commit.tmpl | |-- post-lock.tmpl | |-- post-revprop-change.tmpl | |-- post-unlock.tmpl | |-- pre-commit.tmpl | |-- pre-lock.tmpl | |-- pre-revprop-change.tmpl | |-- pre-unlock.tmpl | `-- start-commit.tmpl `-- locks |-- db-logs.lock `-- db.lock 10 directories, 28 files #提示:查看svnadmin命令帮助的方法
[root@localhost ~]# cd /application/svndata/nange/conf/ [root@localhost conf]# ll total 12 -rw-r--r--. 1 root root 1080 Nov 13 16:02 authz -rw-r--r--. 1 root root 309 Nov 13 16:02 passwd -rw-r--r--. 1 root root 2279 Nov 13 16:02 svnserve.conf [root@localhost conf]# cp svnserve.conf{,.bak} [root@localhost conf]# vim svnserve.conf #修改配置文件的以下信息 [root@localhost ~]# cat -n /application/svndata/nange/conf/svnserve.conf.bak | sed -n '12p;13p;20p;27p' 12 # anon-access = read 13 # auth-access = write 20 # password-db = passwd 27 # authz-db = authz #将配置文件代码修改成以下所示: [root@localhost ~]# cat -n /application/svndata/nange/conf/svnserve.conf | sed -n '12p;13p;20p;27p' 12 anon-access = none #禁止匿名访问 13 auth-access = write #验证访问可写 20 password-db = /application/svnpasswd/passwd #密码文件位置 27 authz-db = /application/svnpasswd/authz #验证文件位置 特别提示: 此配置文件里的每条配置代码必须顶格写,不能有空格。
[root@localhost conf]# cp /application/svndata/nange/conf/authz /application/svnpasswd/ [root@localhost conf]# cp /application/svndata/nange/conf/passwd /application/svnpasswd/ [root@localhost conf]# ll /application/svnpasswd/ total 8 -rw-r--r--. 1 root root 1080 Nov 13 17:07 authz -rw-r--r--. 1 root root 309 Nov 13 17:07 passwd
[root@localhost conf]# svnserve --help #svn启动命令帮助 svnserve: warning: cannot set LC_CTYPE locale svnserve: warning: environment variable LANG is en svnserve: warning: please check that your locale name is correct usage: svnserve [-d | -i | -t | -X] [options] Valid options: -d [--daemon] : daemon mode #守护进程启动(后台) -i [--inetd] : inetd mode -t [--tunnel] : tunnel mode -X [--listen-once] : listen-once mode (useful for debugging) -r [--root] ARG : root of directory to serve #指定根目录 -R [--read-only] : force read only, overriding repository config file --config-file ARG : read configuration from file ARG --listen-port ARG : listen port #监听端口默认3690 [mode: daemon, listen-once] --listen-host ARG : listen hostname or IP address #监听IP [mode: daemon, listen-once] -T [--threads] : use threads instead of fork [mode: daemon] --foreground : run in foreground (useful for debugging) [mode: daemon] --log-file ARG : svnserve log file --pid-file ARG : write server process ID to file ARG [mode: daemon, listen-once] --tunnel-user ARG : tunnel username (default is current uids name) [mode: tunnel] -h [--help] : display this help --version : show program version information #启动svn服务 [root@localhost conf]# svnserve -d -r /application/svndata/ svnserve: warning: cannot set LC_CTYPE locale #警告能够忽略 svnserve: warning: environment variable LANG is en #警告能够忽略 svnserve: warning: please check that your locale name is correct ##警告能够忽略 [root@localhost conf]# netstat -antup | grep 3690 tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 1256/svnserve
[root@localhost conf]# source /etc/sysconfig/i18n #启用中文字符集 [root@localhost conf]# pkill svnserve [root@localhost conf]# svnserve -d -r /application/svndata/ [root@localhost conf]# netstat -antup | grep 3690 tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 1261/svnserve [root@localhost conf]# cat /etc/sysconfig/i18n LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16"
#在/application/svnpasswd/passwd文件末尾追加以下内容: [root@localhost conf]# tail -4 /application/svnpasswd/passwd nange = 123123 #设置帐号密码 benet = 123123 #设置帐号密码 stu001 = 123 #设置帐号密码 stu002 = 456 #设置帐号密码
注意:
1,权限配置文件中出现的用户名必须已在用户配置文件中定义
2,对权限配置文件的修改当即生效,没必要重启svn
权限配置说明 #用户组格式: 【groups】 =, 其中,1个用户组能够包含1个或多个用过户,用户间以逗号分隔。 例如:harry_and_sally = harry,sally #==>用户组 = 用户1,用户2 #版本库目录格式: [<版本库>:/项目/目录] #例如:[repository:/baz/fuz] @<用户组名> = <权限> #例如:@harry\_and\_sally = rw <用户名> = <权限> #例如:harry = rw #其中,方框号内部分能够有多种写法: [/],表示根目录及如下,根目录是svnserve启动时指定的,咱们指定为/application/svndata,[/]就是表示对所有版本库设置权限。 [repos:/],表示对版本库repos设置权限。 [repos:/nange],表示对版本库repos中的nange项目设置权限。 [repos:/nange/benet],表示对版本库repos中的nange项目的benet目录设置权限。 #权限主体能够是用户组,用户或*,用户组在前面加@,*表示所有用户。 #权限能够是w,r,wr和空,空表示没有任何权限。 #authz中每一个参数都要顶格写,开头不能有空格。 #对于组,要以@开头,用户不须要@开头。 #编辑authz配置文件进行受权,在authz末尾加入如下几句代码 [root@localhost conf]# egrep -v "#|^$" /application/svnpasswd/authz [aliases] [groups] sagroup = stu001,stu002 #新增本行,定义组名 [nange:/] #定义受权的范围 nange = rw #用户单独受权 benet = r #用户单独受权 @sagroup = r #组用户受权
[root@localhost conf]# ps -ef | grep svn | grep -v grep root 1261 1 0 17:16 ? 00:00:00 svnserve -d -r /application/svndata/ [root@localhost conf]# kill 1261 [root@localhost conf]# ps -ef | grep svn | grep -v grep [root@localhost conf]# svnserve -d -r /application/svndata/
推荐:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7
注意:32位系统要用32位软件版本
一路yes便可
(1)先在本地建立一个目录,起名任意,好比data
(2)鼠标右键点击data目录
选择右键菜单里的SVN Checkout,出现下图:
特别提示:
若是链接不通,请检查Linux虚拟机的iptables是否关闭。
点击OK后,出现下图:
再次点击OK之后,结束。此时目录里多了一个隐藏的目录,表示此目录已经和svn服务器连通
命令说明:
(1)SVN Checkout:至关于下载,第一次链接svn服务器的时候须要和服务器的对应存储目录进行数据同步,若是服务器的对应目录里有数据文件,那么就会下载到你的本地对应目录里。
(2)SVN Update:更新数据,检查服务器端svn存储目录里是否和本地svn存储目录数据不一致,若是不一致,那么下载改变或新增的部分到本地svn目录里。(不会删除本地目录内容)
(3)SVN Commit:提交数据到svn服务器端存储目录。本地svn存储目录会和服务器端存储目录进行比对校验。会把本地改变的部分和新增的部分同步上传至服务器端。
(1)向windows的svn存储目录data里放一个空文件
(2)右键点击data目录,选择SVN Commit
(3)打开本地data目录里的文件,随便写点内容后,再次进行SVN commit
(4)直接从本地查看服务器端的数据内容
右键点击本地svn存储目录data,选择TortoiseSVN ===>Repo-browser后出现下图:
双击文件能够直接远程打开文件,能够看到里面刚刚被修改后的内容已经更新至服务器端。
(5)删除本地svn存储目录data里的文件,后选择SVN Update
我会发现,刚刚删除的文件又从新下载回来了。
(6)继续删除本地svn存储目录data里的文件,后选择SVN Commit
(7)再次查看服务器端存储目录里,发现文件已经被删除了
[root@localhost ~]# svn --help usage: svn <subcommand> [options] [args] Subversion command-line client, version 1.6.11. Type 'svn help <subcommand>' for help on a specific subcommand. Type 'svn --version' to see the program version and RA modules or 'svn --version --quiet' to see just the version number. Most subcommands take file and/or directory arguments, recursing on the directories. If no arguments are supplied to such a command, it recurses on the current directory (inclusive) by default. Available subcommands: add blame (praise, annotate, ann) cat changelist (cl) checkout (co) #下载数据 cleanup commit (ci) #提交数据 copy (cp) delete (del, remove, rm) diff (di) export help (?, h) import info list (ls) #显示服务器端内容 lock log merge mergeinfo mkdir move (mv, rename, ren) propdel (pdel, pd) propedit (pedit, pe) propget (pget, pg) proplist (plist, pl) propset (pset, ps) resolve resolved revert status (stat, st) switch (sw) unlock update (up) #更新数据 Subversion is a tool for version control. For additional information, see http://subversion.tigris.org/
将文件checkout到本地目录
svn checkout(co) remotepath localpath
[root@localhost ~]# mkdir nange [root@localhost ~]# cd nange/ [root@localhost nange]# pwd /root/nange #下载服务器端数据到Linux本地目录 [root@localhost nange]# svn co svn://192.168.0.220/nange/ /root/nange/ --username=benet --password=123123 Restored '/root/nange/ffff.txt' Checked out revision 6. [root@localhost nange]# ll total 4 -rw-r--r--. 1 root root 30 Nov 13 19:45 ffff.txt
svn list file:///application/svndata/nange
[root@localhost nange]# svn list file:///application/svndata/nange/ ffff.txt
(1)一次失败的提交 [root@localhost nange]# pwd /root/nange [root@localhost nange]# mkdir {111..120} #建立目录 [root@localhost nange]# ll total 44 drwxr-xr-x. 2 root root 4096 Nov 13 19:56 111 drwxr-xr-x. 2 root root 4096 Nov 13 19:56 112 drwxr-xr-x. 2 root root 4096 Nov 13 19:56 113 drwxr-xr-x. 2 root root 4096 Nov 13 19:56 114 drwxr-xr-x. 2 root root 4096 Nov 13 19:56 115 drwxr-xr-x. 2 root root 4096 Nov 13 19:56 116 drwxr-xr-x. 2 root root 4096 Nov 13 19:56 117 drwxr-xr-x. 2 root root 4096 Nov 13 19:56 118 drwxr-xr-x. 2 root root 4096 Nov 13 19:56 119 drwxr-xr-x. 2 root root 4096 Nov 13 19:56 120 -rw-r--r--. 1 root root 30 Nov 13 19:45 ffff.txt -rw-r--r--. 1 root root 0 Nov 13 19:48 xxxx [root@localhost nange]# svn add * #提交前须要先把要提交的内容作标记A A 111 A 112 A 113 A 114 A 115 A 116 A 117 A 118 A 119 A 120 svn: warning: 'ffff.txt' is already under version control #这个文件已经标记过了 A xxxx [root@localhost nange]# svn ci -m "message" #提交时须要同时-m指定一段话做为备注 Authentication realm: <svn://192.168.0.220:3690> e498878c-b578-41a4-8361-6c1c5baa75f9 Password for 'benet': #输入benet用户密码(以前checkout时的帐号密码已经记录到了此目录) ----------------------------------------------------------------------- ATTENTION! Your password for authentication realm: <svn://192.168.0.220:3690> e498878c-b578-41a4-8361-6c1c5baa75f9 can only be stored to disk unencrypted! You are advised to configure your system so that Subversion can store passwords encrypted, if possible. See the documentation for details. You can avoid future appearances of this warning by setting the value of the 'store-plaintext-passwords' option to either 'yes' or 'no' in '/root/.subversion/servers'. ----------------------------------------------------------------------- Store password unencrypted (yes/no)? yes #是否记录帐户 svn: Commit failed (details follow): svn: Authorization failed #提交失败,帐户没有写权限,认证失败 (2)换帐户从新Checkout [root@localhost nange]# svn co svn://192.168.0.220/nange/ /root/nange/ --username=nange --password=123123 #换拥有写入权限的帐户checkout ----------------------------------------------------------------------- ATTENTION! Your password for authentication realm: <svn://192.168.0.220:3690> e498878c-b578-41a4-8361-6c1c5baa75f9 can only be stored to disk unencrypted! You are advised to configure your system so that Subversion can store passwords encrypted, if possible. See the documentation for details. You can avoid future appearances of this warning by setting the value of the 'store-plaintext-passwords' option to either 'yes' or 'no' in '/root/.subversion/servers'. ----------------------------------------------------------------------- Store password unencrypted (yes/no)? yes #是否做为目录的新帐户和密码 Checked out revision 6. [root@localhost nange]# ll total 44 drwxr-xr-x. 3 root root 4096 Nov 13 19:57 111 drwxr-xr-x. 3 root root 4096 Nov 13 19:57 112 drwxr-xr-x. 3 root root 4096 Nov 13 19:57 113 drwxr-xr-x. 3 root root 4096 Nov 13 19:57 114 drwxr-xr-x. 3 root root 4096 Nov 13 19:57 115 drwxr-xr-x. 3 root root 4096 Nov 13 19:57 116 drwxr-xr-x. 3 root root 4096 Nov 13 19:57 117 drwxr-xr-x. 3 root root 4096 Nov 13 19:57 118 drwxr-xr-x. 3 root root 4096 Nov 13 19:57 119 drwxr-xr-x. 3 root root 4096 Nov 13 19:57 120 -rw-r--r--. 1 root root 30 Nov 13 19:45 ffff.txt -rw-r--r--. 1 root root 0 Nov 13 19:48 xxxx #从新提交 [root@localhost nange]# svn add * svn: warning: '111' is already under version control #文件或目录已经归入了版本控制(也就是作过标记了) svn: warning: '112' is already under version control svn: warning: '113' is already under version control svn: warning: '114' is already under version control svn: warning: '115' is already under version control svn: warning: '116' is already under version control svn: warning: '117' is already under version control svn: warning: '118' is already under version control svn: warning: '119' is already under version control svn: warning: '120' is already under version control svn: warning: 'ffff.txt' is already under version control svn: warning: 'xxxx' is already under version control [root@localhost nange]# svn ci -m "message" #从新提交 Adding 111 Adding 112 Adding 113 Adding 114 Adding 115 Adding 116 Adding 117 Adding 118 Adding 119 Adding 120 Adding xxxx Transmitting file data . Committed revision 7. #查看服务器端数据 [root@localhost nange]# svn list file:///application/svndata/nange/ 111/ 112/ 113/ 114/ 115/ 116/ 117/ 118/ 119/ 120/ ffff.txt xxxx
- 钩子脚本的具体写法就是操做系统中shell脚本程序的写法,可根据本身的SVN所在的操做系统和shell程序进行相应的开发。
- 钩子脚本就是被某些版本库事件触发的程序,例如:建立新版本或修改未被版本控制的属性。每一个钩子都能掌管足够的信息来了解发生了什么事件,操做对象是什么以及触发事件用户的帐号。
- 根据钩子的输出或返回状态,钩子程序可以以某种方式控制该动做继续执行,中止或挂起。
默认状况下,钩子的子目录中包含各类版本库钩子模板
[root@localhost ~]# ls -l /application/svndata/nange/hooks/ total 36 -rw-r--r--. 1 root root 1977 Nov 13 16:02 post-commit.tmpl -rw-r--r--. 1 root root 1638 Nov 13 16:02 post-lock.tmpl -rw-r--r--. 1 root root 2289 Nov 13 16:02 post-revprop-change.tmpl -rw-r--r--. 1 root root 1567 Nov 13 16:02 post-unlock.tmpl -rw-r--r--. 1 root root 3426 Nov 13 16:02 pre-commit.tmpl -rw-r--r--. 1 root root 2410 Nov 13 16:02 pre-lock.tmpl -rw-r--r--. 1 root root 2786 Nov 13 16:02 pre-revprop-change.tmpl -rw-r--r--. 1 root root 2100 Nov 13 16:02 pre-unlock.tmpl -rw-r--r--. 1 root root 2780 Nov 13 16:02 start-commit.tmpl
- 对每种Subversion版本库支持的钩子都有一个模板,经过查看这些脚本的内容,你能看到是什么事件触发了脚本及如何给传脚本传递数据。
- 同时,这些模板也是如何使用这些脚本,结合Subversion支持的工具来完成有用任务的例子。
- 要实际安装一个可用的钩子,你须要在repos/hooks目录下安装一些与钩子同名(如start-commit或者post-commit)的可执行程序或脚本,注意,去掉模板的扩展名。
重要提示:
因为安全缘由,Subversion版本库在一个空环境中执行钩子脚本就是没有任何环境变量,甚至没有$PATH或%PATH%。因为这个缘由,许多管理员会感到很困惑,他们的钩子脚本手工运行时正常,可在Subversion中却不能运行。要注意,必须在你的钩子中设置好环境变量或为你的程序指定好绝对路径。
钩子脚本 | 说明 |
---|---|
post-commit | 在提交完成成功建立版本以后执行该钩子,提交已经完成,不可更改,所以,本脚本的返回值被忽略。提交完成时触发事务 |
pre-commit | 提交完成前触发执行该脚本 |
start-commit | 在客户端尚未向服务器提交数据以前,即尚未创建Subversion transaction以前,执行该脚本(提交前出发事务) |
(1)必定要定义变量,主要是用过的命令的路径。由于SVN的考虑的安全问题,没有调用系统变量,若是手动执行是没有问题,但SVN自动执行就会没法执行了。
(2)SVN的同步目录在 update以前必定要先checkout一份出来,还有这里必定要添加用户和密码。
(3)加上了对前一个命令的判断,若是update的时候出了问题,程序没有退出的话还会继续同步代码到Web服务器上,这样会形成代码有问题。
(4)建议最好记录日志,出错的时候能够很快的排错
(5)最后是数据同步,rsync的相关参数必定要清楚。
限制上传文件扩展名及大小,控制提交要输入的信息等。
SVN更新自动更新,发送通知,MSN,邮件或短信周知。
SVN更新触发checkout程序,而后实时rsync推送到服务器等。
(1)创建同步WEB目录 mkdir -p /data/www
(2)将SVN中内容checkout到WEB目录一份。
[root@localhost nange]# mkdir -p /data/www [root@localhost nange]# svn checkout svn://192.168.0.220/nange /data/www --username=nange --password=123123 A /data/www/xxxx A /data/www/111 A /data/www/120 A /data/www/112 A /data/www/113 A /data/www/114 A /data/www/ffff.txt A /data/www/115 A /data/www/116 A /data/www/117 A /data/www/118 A /data/www/119 Checked out revision 7. [root@localhost nange]# ll /data/www/ total 44 drwxr-xr-x. 3 root root 4096 Nov 13 21:32 111 drwxr-xr-x. 3 root root 4096 Nov 13 21:32 112 drwxr-xr-x. 3 root root 4096 Nov 13 21:32 113 drwxr-xr-x. 3 root root 4096 Nov 13 21:32 114 drwxr-xr-x. 3 root root 4096 Nov 13 21:32 115 drwxr-xr-x. 3 root root 4096 Nov 13 21:32 116 drwxr-xr-x. 3 root root 4096 Nov 13 21:32 117 drwxr-xr-x. 3 root root 4096 Nov 13 21:32 118 drwxr-xr-x. 3 root root 4096 Nov 13 21:32 119 drwxr-xr-x. 3 root root 4096 Nov 13 21:32 120 -rw-r--r--. 1 root root 30 Nov 13 21:32 ffff.txt -rw-r--r--. 1 root root 0 Nov 13 21:32 xxxx
(3)制做钩子脚本,post-commit
root@localhost nange]# cd /application/svndata/nange/hooks/ [root@localhost hooks]# cp post-commit.tmpl post-commit #复制模板一份 [root@localhost hooks]# egrep -v "#|^$" post-commit #模板原始内容 REPOS="$1" REV="$2" mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf [root@localhost hooks]# vim post-commit #修改post-commit脚本 [root@localhost hooks]# egrep -v "#|^$" post-commit REPOS="$1" #传参(未用上) REV="$2" #传参(未用上) SvnIP="192.168.0.220" #svn服务端的IP地址 ProjectName="nange" #svn服务端的项目库名称 UserName="nange" #帐户姓名 PassWord="123123" #帐户密码 LocalPath="/data/www" #位于svn本地的共享目录 SVN=/usr/bin/svn #svn命令的绝对路径 export LC_CTYPE="en_US.UTF-8" #中文字符集支持 export LC_ALL= if [ ! -d ${LocalPath} ];then mkdir -p ${LocalPaht} $SVN checkout svn://${SvnIP}/${ProjectName} ${LocalPath} --username=${UserName} --password=${PassWord} #新建立目录须要先通过checkout才能update else $SVN update --username nange --password 123123 /data/www #更新共享目录内容 fi if [ $? -eq 0 ];then /usr/bin/rsync -az --delete /data/www /tmp/ #数据同步推送到本地/tmp目录下(生产环境能够直接同步推送到Web测试服务器) fi
(4)进行钩子脚本同步测试 #删除以前的测试记录 [root@localhost hooks]# rm -rf /data/www/ [root@localhost hooks]# ll -d /data/www ls: cannot access /data/www: No such file or directory [root@localhost hooks]# rm -rf /tmp/* [root@localhost hooks]# ll /tmp/ total 0 [root@localhost hooks]# chmod 700 post-commit #给钩子脚本可执行权限
特别提示:
当用户经过svn更新钩子post-commit所在的项目库时,在更新完毕以后会自动触发钩子脚本
模拟更新项目库版本
#查看svn服务器端钩子脚本执行状况 [root@localhost hooks]# ll /data/www/ #svn服务器端本地共享目录 total 28 drwxr-xr-x. 3 root root 4096 Nov 13 23:07 111 drwxr-xr-x. 3 root root 4096 Nov 13 23:07 112 drwxr-xr-x. 3 root root 4096 Nov 13 23:07 113 drwxr-xr-x. 3 root root 4096 Nov 13 23:07 116 drwxr-xr-x. 3 root root 4096 Nov 13 23:07 117 drwxr-xr-x. 3 root root 4096 Nov 13 23:07 118 -rw-r--r--. 1 root root 0 Nov 13 23:07 test.txt -rw-r--r--. 1 root root 9 Nov 13 23:07 xxx.txt -rw-r--r--. 1 root root 0 Nov 13 23:07 xxxx [root@localhost hooks]# ll /tmp/www/ #推送后的数据目录 total 28 drwxr-xr-x. 3 root root 4096 Nov 13 23:07 111 drwxr-xr-x. 3 root root 4096 Nov 13 23:07 112 drwxr-xr-x. 3 root root 4096 Nov 13 23:07 113 drwxr-xr-x. 3 root root 4096 Nov 13 23:07 116 drwxr-xr-x. 3 root root 4096 Nov 13 23:07 117 drwxr-xr-x. 3 root root 4096 Nov 13 23:07 118 -rw-r--r--. 1 root root 0 Nov 13 23:07 test.txt -rw-r--r--. 1 root root 9 Nov 13 23:07 xxx.txt -rw-r--r--. 1 root root 0 Nov 13 23:07 xxxx
综上,post-commit钩子脚本测试成功。
由于并不经常使用,这部份内容,咱们略过
开发每次修改完代码就直接提交,而后经过FTP直接更新到Web服务器网页目录;没有专门的测试人员,彻底是由用户来进行测试体验。
小型企业现状:
小型公司通常只有几个开发人员,网站核心程序大多数都是PHP语言开发,为了方便,会直接经过FTP直接上传程序代码到线上服务器,随时随地上线更新。
上述上线方案的特色和问题:
小型企业上线架构方案建议:
中型企业上线,通常是规范运维人员操做步骤,制定统一的上线操做脚本,备份文件名称,备份文件路径。使操做人性化,统一化,自动化。
Web代码的上线流程演示图:
大型企业上线通常制度和流程控制较多,比较严谨,下面是某大型企业上线解决方案架构:
SVN里的内容:
1,程序代码
2,服务的配置
3,项目文档,设计文档,运维部署优化文档
门户大型网站架构环境代码上线具体方案:
IDC正式上线的过程对于JAVA程序,能够是AB分组上线的思路,即平滑下线一半的服务器,而后发布更新代码测试,无问题后,挂上服务器,同时在平滑下线另外一半的服务器,而后发布更新代码测试(或者直接发布后就挂上线)
PHP程序代码上线的具体方案:
对于PHP上线方法:发布代码时(也须要测试流程)能够直接发布到正式线临时目录,而后mv或更改link的方式发布到正式线目录,不须要重启http服务。这是sina,ganji的上线方案。
JAVA程序代码上线的具体方案:
对于java上线方法:较大公司须要分组平滑上线,例如,首先从负载均衡器上摘掉一半的服务器,发布代码后,重启服务器测试,没问题后,挂上通过测试的这一半,再下另一半。若是前端有DNS智能解析,上线还能够分地区上线若干服务器,逐渐普及到全国的服务器,这个被称为灰度发布。
(1)SINA网的代码发布流程逻辑图:
(2)和讯案例
ABCD 12:33:24 咱们这里代码发布都不太标准,所有都是开发本身搞 Mr.chen 12:35:14 目前是什么个方式呢 说下现状便可。 ABCD 12:36:04 就是很传统,开发有权限能够上机器,咱们就把应用部署好,他们随便折腾。 ABCD 12:41:05 源代码是svn,静态内容都是同步分发
(3)小米案例
XYZ 13:36:49 代码上线都是开发上,咱们运维这边没有流程...若是代码发布致使了问题,就是开发的问题。 XYZ 13:37:55 服务器上面有一个客户端,开发本身在页面上点发布,客户端就去拉代码了。 就是这么个额流程,就像你之前说的,项目责任制,谁的项目出问题了。找开发和运维 Mr.chen 13:49:08 不须要重启服务器么?还有直接拉到站点目录么? XYZ 13:49:17 嗯,都是自动的 他们有个管理系统 Mr.chen 13:49:49 如何保证不影响用户呢? 还有怎么回滚的。 XYZ 13:50:12 尚未作到这点把 那个管理系统能够回滚的,好像 平时把客户的部署上去,再把机器加入到那个系统中 他们就能够发了。 XYZ 13:58:16 运维这边就管添加机器和安装客户端,也有发布权限,项目上线后不多发。一教就会没有在这块搞过太多,那个程序和版本管理结合的。实现原理应该就是客户端收到服务器发来的clone命令和路径,就去执行了。
什么是配置管理员呢?
就是在开发和运维中间起一个链接纽带的一个职位,这个职位通常在大公司里会设置,负责SVN的管理,上线管理,申请,协调等工做。
对于门户网站或重视规范或开发能力较强的公司也许会结合系统服务和WEB界面管理来更科学更自动的进行上线代码管理,如开发一个自动化代码上线部署平台,其实就是一个web管理界面(界面底层调用相关脚本实现分发推送代码以及重启服务器),而后普通的初级上线人员就能够在平台里实现仅仅点鼠标,敲回车,就能实现平滑上线和平滑回滚代码了,固然,自动化和完善的程度也许没咱们说的这么好,可是,思路是这样的。下面就是管理平台的一个图例:
开发自动化部署平台的思路不少,例如:咱们能够经过nagios的被动模式实现上线管理平台原理思路:
实际上就是生成配置在分发服务器上执行命令请求,应用服务器,而后脚本在应用服务器处理完毕后回传结果到web界面显示:
例如:check_nrpe -h 10.0.0.178 -c check_load
业务变动管理平台优势: