1.SVN服务实战php
1) 什么是SVN(Subversion)?css
2) svn与git的区别前端
svn版本控制系统是集中式的数据管理,存在一个中央版本库,全部开发人员本地开发所使用的代码都是来自于这个版本库,提交代码也都必须提交到这个中央版本库。java
svn版本控制系统工做流程以下:git
缺点:程序员
当没法链接到中央版本库的环境下,你没法提交代码,将代码加入版本控制; 你没法查看代码的历史版本以及版本的变化过程。提交到版本控制系统中的代码咱们都默认经过自测可运行的,若是某个模块的代码比较复杂,不能短期内实现为可测试的功能,那么你须要等很长的时间才能提交本身的代码,因为代码库集中管理,所以,须要对中央版本库的存储作备份。这点分布式的版本控制系统要好一些。Svn的备份要备份全部代码数据以及全部更改的版本记录。web
从上面的描述咱们能够看到,咱们每一个开发人员的本地都会有一个git库,咱们能够随时进行commit而不须要联网,能够随时查看历史版本,当某一个功能点开发完了以后咱们能够将commit后的内容push到远程git库了,若是远程git库的版本在你上次clone或者pull以后变化了,那么你须要进行pull并处理冲突,提交以后,再push到远程git库。apache
运维人员掌握版本管理vim
对于版本管理系统,运维人员须要掌握的技术点:windows
3)SVN服务端运行方式
svn服务常见的运行访问方式有3种:
(1)独立服务器访问
访问地址如:svn://svn.yunjisuan.org/sadoc;
(2)借助apache等http服务
访问地址如:http://svn.yunjisuan.com/sadoc;
a,单独安装apache+svn(不要用) b,CSVN(apache+svn)是一个单独的整合的软件,带web界面管理的SVN软件
(3)本地直接访问(例如:file://application/svndata/sadoc)
2.搭建SVN服务端
yum -y install subversion
mkdir -p /application/svndata #数据存储根目录
建立一个新的Subversion项目test,其实,相似yunjisuan这样的项目能够建立多个,每一个项目对应不一样的代码,这里只是以建立一个项目为例演示:
svnadmin create /application/svndata/test
tree /application/svndata/test 查看项目目录结构
cd /application/svndata/test/conf/
cp svnserve.conf{,.bak}
vim svnserve.conf 修改配置文件
anon-access = none #禁止匿名访问
auth-access = write #验证访问可写
password-db = passwd #密码文件位置
authz-db = authz #验证文件位置
此配置文件里的每条配置代码必须顶格写,不能有空格。
启动svn服务
svnserve -d -r /application/svndata/ 启动服务
netstat -antup | grep 3690 查看服务
vim /application/svndata/test/conf/passwd
test= 123123 #设置帐号密码
yst = 123123 #设置帐号密码
权限配置说明
vim /application/svndata/test/conf/authz
[groups]
yun= test,yst #新增本行,定义组名
[test:/] #定义受权的范围
yunjisuan = rw #用户单独受权
benet = r #用户单独受权
@sagroup = r #组用户受权
重启动svnserve
3.搭建SVN客户端
使用svn客户端(windows版)
推荐:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7
一路 下一步,安装成功
先在本地建立一个目录,起名任意,好比data
选择右键菜单里的SVN Checkout,输入svn地址, 本例为svn://192.168.1.11/test
点ok,输入前面建立的用户名和密码test,123123,从版本库中取得代码
在本地修改,后要提交到版本库,右键点commit,提交生成初版本,其余程序员修改会生成不一样版本,咱们本地要下载代码,右键点 update,下载最新的代码版本
4.SVN钩子脚本
1)经常使用钩子脚本
post-commit:在提交完成成功建立版本以后执行该钩子,提交已经完成,不可更改,所以,本脚本的返回值被忽略。提交完成时触发事务
pre-commit提交完成前触发执行该脚本
start-commit在客户端尚未向服务器提交数据以前,即尚未创建Subversion transaction以前,执行该脚本(提交前出发事务)
利用钩子脚本触发同步数据的注意事项
(1)必定要定义变量,主要是用过的命令的路径。由于SVN的考虑的安全问题,没有调用系统变量,若是手动执行是没有问题,但SVN自动执行就会没法执行了。
(2)SVN的同步目录在 update以前必定要先checkout一份出来,还有这里必定要添加用户和密码。
(3)加上了对前一个命令的判断,若是update的时候出了问题,程序没有退出的话还会继续同步代码到Web服务器上,这样会形成代码有问题。
(4)建议最好记录日志,出错的时候能够很快的排错
(5)最后是数据同步,rsync的相关参数必定要清楚。
svn钩子生产应用场景举例
2)svn钩子生产应用实战
(1)创建同步WEB目录
mkdir -p /data/www
(2)将SVN中内容checkout到WEB目录一份。
svn checkout svn://192.168.1.13/test /data/www --username=test --password=123123
3)制做钩子脚本,post-commit
root@localhost yunjisuan]# cd /application/svndata/test/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.1.13" #svn服务端的IP地址 ProjectName="test" #svn服务端的项目库名称 UserName="test" #帐户姓名 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 ${LocalPath} $SVN checkout svn://${SvnIP}/${ProjectName} ${LocalPath} --username=${UserName} --password=${PassWord} #新建立目录须要先通过checkout才能update else $SVN update --username $UserName --password $PassWord /data/www #更新共享目录内容 fi if [ $? -eq 0 ];then /usr/bin/rsync -az --delete /data/www /tmp/ #数据同步推送到本地/tmp目录下(生产环境能够直接同步推送到Web测试服务器) fi
chmod 700 post-commit
特别提示:
当用户经过svn更新钩子post-commit所在的项目库时,在更新完毕以后会自动触发钩子脚本
模拟更新项目库版本
在windows系统中的data目录中添加代码文件,而后右键点commit,成功后触发钩子脚本
ll /tmp/www/ #推送后的数据目录
显示所有提交后的代码文件
综上,post-commit钩子脚本测试成功。
5.大中小型企业上线解决方案
1)小型公司代码上线案例(十几台服务器)
开发每次修改完代码就直接提交,而后经过FTP直接更新到Web服务器网页目录;没有专门的测试人员,彻底是由用户来进行测试体验。
小型公司通常只有几个开发人员,网站核心程序大多数都是PHP语言开发,为了方便,会直接经过FTP直接上传程序代码到线上服务器,随时随地上线更新。
小型企业上线架构方案建议:
2)中型企业上线解决方案
中型企业上线,通常是规范运维人员操做步骤,制定统一的上线操做脚本,备份文件名称,备份文件路径。使操做人性化,统一化,自动化。
3)大型企业上线解决方案
大型企业上线通常制度和流程控制较多,比较严谨,下面是某大型企业上线解决方案架构:
SVN里的内容:
1,程序代码
2,服务的配置
3,项目文档,设计文档,运维部署优化文档
门户大型网站架构环境代码上线具体方案:
IDC正式上线的过程对于JAVA程序,能够是AB分组上线的思路,即平滑下线一半的服务器,而后发布更新代码测试,无问题后,挂上服务器,同时在平滑下线另外一半的服务器,而后发布更新代码测试(或者直接发布后就挂上线)
PHP程序代码上线的具体方案:
对于PHP上线方法:发布代码时(也须要测试流程)能够直接发布到正式线临时目录,而后mv或更改link的方式发布到正式线目录,不须要重启http服务。这是sina,ganji的上线方案。
JAVA程序代码上线的具体方案:
对于java上线方法:较大公司须要分组平滑上线,例如,首先从负载均衡器上摘掉一半的服务器,发布代码后,重启服务器测试,没问题后,挂上通过测试的这一半,再下另一半。若是前端有DNS智能解析,上线还能够分地区上线若干服务器,逐渐普及到全国的服务器,这个被称为灰度发布。
和讯案例
ABCD 12:33:24 咱们这里代码发布都不太标准,所有都是开发本身搞 12:35:14 目前是什么个方式呢 说下现状便可。 ABCD 12:36:04 就是很传统,开发有权限能够上机器,咱们就把应用部署好,他们随便折腾。 ABCD 12:41:05 源代码是svn,静态内容都是同步分发
(3)小米案例
XYZ 13:36:49 代码上线都是开发上,咱们运维这边没有流程...若是代码发布致使了问题,就是开发的问题。 XYZ 13:37:55 服务器上面有一个客户端,开发本身在页面上点发布,客户端就去拉代码了。 就是这么个额流程,就像你之前说的,项目责任制,谁的项目出问题了。找开发和运维 13:49:08 不须要重启服务器么?还有直接拉到站点目录么? XYZ 13:49:17 嗯,都是自动的 他们有个管理系统 13:49:49 如何保证不影响用户呢? 还有怎么回滚的。 XYZ 13:50:12 尚未作到这点把 那个管理系统能够回滚的,好像 平时把客户的部署上去,再把机器加入到那个系统中 他们就能够发了。 XYZ 13:58:16 运维这边就管添加机器和安装客户端,也有发布权限,项目上线后不多发。一教就会没有在这块搞过太多,那个程序和版本管理结合的。实现原理应该就是客户端收到服务器发来的clone命令和路径,就去执行了。
什么是配置管理员呢?
就是在开发和运维中间起一个链接纽带的一个职位,这个职位通常在大公司里会设置,负责SVN的管理,上线管理,申请,协调等工做。
自动化部署和上线代码管理
对于门户网站或重视规范或开发能力较强的公司也许会结合系统服务和WEB界面管理来更科学更自动的进行上线代码管理,如开发一个自动化代码上线部署平台,其实就是一个web管理界面(界面底层调用相关脚本实现分发推送代码以及重启服务器),而后普通的初级上线人员就能够在平台里实现仅仅点鼠标,敲回车,就能实现平滑上线和平滑回滚代码了,固然,自动化和完善的程度也许没咱们说的这么好,可是,思路是这样的。