码迷,mamicode.com
首页 > Web开发 > 详细

svn详细介绍,独立安装配置,hooks的配置管理以及大型门户网站代码上线流程

时间:2015-10-24 19:03:25      阅读:867      评论:0      收藏:0      [点我收藏+]

标签:svn   hooks   代码上线   shell   

 


代码发布方案:

1,安装,优化 软件环境,(nginx,lvs)  《-------运维工程师

2,程序代码(不断更新)。   《--------开发工程师,(开发,运维都可以发布)

3,配置变更(不断变更)。   《--------运维工程师。



一、版本控制管理工具SVN详解


1.1 什么是SVN(subversion) ?

   

   SVN是近年来非常优秀的版本管理工具,与CSV管理工具一样,SVN是一个跨平台开元版本控制系统,但是SVN与众不同的是,SVN会备份并记


录每个文件每一次的修改更新变动。这样我们可以把任意一个时间点档案恢复到想要的某一个旧版本,当然也可以直接浏览指定文件的更新历


史记录


SVN的相关站点:

http://subversion.tigris.org/

http://subversion.apache.org/

SVN客户端:http://tortoisesvn.net/

SVN中文网站:http://svndoc.iusesvn.com/



目前为止:常见的版本管理软件有:vss,CVS,SVN,git



1.1.2 SVN 与git的区别 ?


SVN是一个集中式数据管理中心,存在一个中央版本库,所有开发人员所使用的代码都是来源于版本库,提交代码也是这个中央版本库。


SVN版本控制系统工作流程:

a,在中央库上创建或者从主干复制一个分支

b,从中央库check out下这个分支代码

c,增加自己的代码,修改,删除代码文件

d, commit 代码。假设有人刚刚在分支提交了代码,你就会被提醒代码过期

  你需要先update你的代码,然后在提交。


优缺点:

 

当无法连接到中央版本库的环境下,你无法提交代码,将代码加入版本控制。

你无法查看代码的历史版本以及版本的变化过程。提交到版本控制系统的代码我们都默认通过自测可运行。如果某个模块的代码比较复杂,不


能短时间内实现可测试的功能,那么需要更长时间提交自己的代码,因此需要备份存储做备份。这点分布式的版本控制系统比较好点


SVN的备份要备份所有代码数据以及所有更改的新版本记录




1.1.2.2 git分布式版本控制


git中没有了中央分布式,但是为了开发小组的代码共享,我们通常还是会搭建一个远程git仓库,从某种意义上说,本地的git和远程的git仓


库没有主从之分.


a.如果你本地创建一个git库,并将其add到远程git库中

b,你在本地添加或者删除文件,然后commit,当然commit操作都是提交到本地的git库中了,(也就是提交到了本地git目录的object目录中去了)

c,将本地的git库的分支push到远程git库的分支,如果这时候远程git库中,以及分别有了别人的push,那么远程git的分支不允许你push,到


这个时候需要先pull,然后如果有冲突处理好冲突,commit到本地git,在push到远程git库




1.1.3 运维需要掌握的技术点:

a,安装,部署,维护,排障 

b,简单应用,很多公司由开发来管理,包括建立新仓库,添加,删除账号




1.2.0 svn服务运行方式与访问方式

1.2.1 SVN服务端运行方式

      SVN服务常见的运行访问方式有3种:

     a,独立服务器访问

       访问地址:SVN://svn.etiantian.org/sadoc

     b,借助Apache等http服务

       访问地址如: http://svn.etiantian.org/sadoc

       b1,单独安装Apache+svn   不推荐,比较土

       b2,csvn(apache+svn)是一个单独的整合软件,带web界面管理的SVN软件.


     c,本地直接访问

      访问方式file://application/svndata/sadoc  一般在SVN服务器本地使用

 我们主要以第一种和第二种的CSVN web 管理方式  



1.2.1.1 SVN客户端访问方式


file://           直接本地磁盘或者网络磁盘访问版本库

http://           通过webDAV 协议访问subversion的Apache服务器

https://           与http://相似,但是用ssl加密访问

SVN://             通过头tcp/ip自定义协议访问SVNsever

svn+ssh             通过认证加密tcp/ip自动以协议访问SVNserver服务器,


1.3.1 SVN档案库数据格式

SVN存储版本数据有2种方式:BDB(一种事务安全型表类型 berkley DB) ,FSFS(一种不需要数据库的存储系统)BDB方式在服务器中断时候,


可能锁住数据,所以还是FSFS方式更安全


FSFS 一个专门用于subversion版本库的文件系统后端,可以使用网络文件 系统(NFS,SMBFS)



SVN是一个基于关系型数据库BDB或者一系列二进制文件的FSFS


 

1.4.1 SVN集中式版本管理系统

SVN是一种集中式文件系统版本管理系统,集中式管理的工作流程如下图


技术分享










集中式代码管理的核心是svn服务器,所有开发者新来的第一天必须从服务器获取代码,然后开发,最后解决冲突,提交,所有信息都放在svn


服务器上。


1.4.2 开发者利用svn版本管理系统工作过程


举例说明:

a,从svn服务器下载项目最新代码。

b,进入自己的 分支,进行开发工作,每隔一段时间,提交一次,

c,下班时间,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器

缺点:

a,由于每次提交都会有一个原始副本,因此svn数据库容量会暴增

b,如果不能连接到svn服务器上,基本上不可以工作

c,不适合开源系统开发,开发人数较多,但是集中式管理非常明确权限管理机制,可以分层次管理


优点:

a,管理方便,逻辑清晰,明确。

b,易于管理,集中式svn服务器更容易保证数据安全性

c,代码一致性非常高

d,适合开发人数不多的项目开发



2.0安装配置svn服务


2.0.1准备操作系统并查看系统环境


[root@localhost ~]# cat /etc/redhat-release 

CentOS release 6.5 (Final)

[root@localhost ~]# uname -r

2.6.32-431.el6.x86_64


[root@localhost ~]# yum install subversion -y 


[root@localhost ~]# rpm -qa | grep subversion 

subversion-1.6.11-15.el6_7.x86_64



[root@localhost ~]# sed  -i ‘s#keepcache=0#keepcache=1#g‘ /etc/yum.conf 

[root@localhost ~]# grep keepcache  /etc/yum.conf 

keepcache=1   rpm包安装后不清除


2.0.2配置并启动svn

建立svn版本数据存储根目录svndata,用户,密码,权限目录

[root@localhost ~]# mkdir -p /application/svndata/   --数据存储的根目录

[root@localhost ~]# mkdir -p /application/svnpasswd  --用户,密码权限目录


启动svn服务,指定svn服务的根目录

[root@localhost ~]# svnserve -d -r /application/svndata/ 


[root@localhost ~]# ps -ef | grep svn

root      1838     1  0 16:56 ?        00:00:00 svnserve -d -r /application/svndata/


2.0.3 建立项目版本库,并且配置版本库

创建一个新的subversion项目sadoc,类似的这样显目可以创建多个,并对于不同的代码、


[root@localhost ~]# svnadmin create /application/svndata/sadoc    -创建一个新的项目



2.0.4 修改,调整svn配置文件以及权限文件

配置允许用户wyb读写访问

cd  /application/svndata/sadoc/conf


[root@localhost conf]# cp svnserve.conf svnserve.conf.bak 

[root@localhost conf]# vim svnserve.conf

修改完之后如下


[root@localhost conf]# grep -Ev "^#|^$" svnserve.conf

[general]

anon-access = none

auth-access = write

password-db = /application/svnpasswd/passwd

authz-db =  /application/svnpasswd/authz

[sasl]


把密码认证文件模块复制到相关的目录,这样方便同意管理


[root@localhost conf]# ls /application/svnpasswd/

[root@localhost conf]# cp passwd  authz  /application/svnpasswd/

[root@localhost conf]# ls /application/svnpasswd/

authz  passwd

[root@localhost conf]# ll /application/svnpasswd/

total 8

-rw-r--r-- 1 root root 1080 Oct 22 17:19 authz

-rw-r--r-- 1 root root  309 Oct 22 17:19 passwd

[root@localhost conf]# chmod 700 /application/svnpasswd/*

[root@localhost conf]# ll /application/svnpasswd/

total 8

-rwx------ 1 root root 1080 Oct 22 17:19 authz

-rwx------ 1 root root  309 Oct 22 17:19 passwd

[root@localhost conf]# 


新增用户,密码

提示:

1,等号前为SVN账号,等好后为密码,密码是明晚,注意密码权限700

2,更改svnserve.conf时候,需要重启svn,更改authz,passwd文件时候不需要重启svn


 [root@localhost svnpasswd]#vim passwd

[root@localhost svnpasswd]# cat passwd 

 


[users]

# harry = harryssecret

# sally = sallyssecret

wyb = 123456 

zhiyan = zhiyan 

[root@localhost svnpasswd]# 



[root@localhost svnpasswd]# vim authz   权限配置文件

格式说明

版本库目录格式:

[<版本库>:/项目/目录]

@<用户组名>=<权限>

<用户名>=<权限>

[/] 表示根目录。根目录就是svnserver启动时候,我们制定的/application/svndata [/]就表示对全部版本库设置权限

[repos:/]   表示对版本库repository设置权限

[repos:/sadoc] 表示对版本库repo中sadoc项目设置权限

[repos:/sadoc/wyb] 表示对版本库repos中的sadoc项目的wyb目录设置权限



权限主体可以是用户组,用户,* ,用户组前面加@,*表示全部用户

权限可以是w ,r,wr和 空表示没有任何权限

authz 中每个参数都要定格写,开头不能有空格

对于组,要以开头@开头,用户不需要@开头



[root@localhost svnpasswd]#cat authz 

新增部分

sagroup = wyb,zhiyan

[sadoc:/]

wyb = rw

zhiyan = r

@sagroup = r

 

注意:

* 权限配置文件中出现的用户名必须是用户配置文件中定义

* 对权限配置文件的修改立即生效,不必重启svn


用户格式

[groups]

其中,1个用户组可以包含1个或者多个用户,用户可以逗号分隔。

此时svn安装完毕


3.1  windows客户端软件tortoisesSVN


下载地址:http://tortoisesvn.net/downloads.html


由于目前安装的是svn独立访问方式,所以svn客户端链接服务器的方式如下

svn://192.168.2.48/sadoc

用户名:gongli

密码:123456


3.1.2 linux客户端命令行使用说明

co  checkout

up  update

ci  commit


3.1.2.1 从svn库提取数据

a, 将文件checkout到本地目录   Linux客户端,是checkout ,而不是update



[root@localhost sadoc]# mkdir /svndata


/svndata   ---项目代码下载到、/svndata/ 下 

svn co  svn://192.168.2.48/sadoc/  /svndata/  --username=gongli  --password=123456


3.1.2.2-查看服务器端的数据


[root@localhost svndata]# svn  ls   svn://192.168.2.48/sadoc/   --username=wyb  --password=123456  -查看服务器端的数据

svn.txt

ww.txt

新建文本文档.txt

[root@localhost svndata]# 


[root@localhost svndata]# svn  ls   svn://192.168.2.48/sadoc/   --username=wyb  --password=123456  --verbose

      5 wyb                   Oct 23 10:59 ./

      1 wyb              8011 Oct 23 09:49 svn.txt

      4 wyb                 0 Oct 23 10:37 ww.txt

      5 wyb                 0 Oct 23 10:59 新建文本文档.txt


3.1.2.3 从本地提交到svn服务器

[root@localhost svndata]# touch a.html 



[root@localhost svndata]# svn add  a.html 

A         a.html

[root@localhost svndata]# svn commit 

svn: Commit failed (details follow):

svn: Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the 


--message (-m) or --file (-F) options

svn: None of the environment variables SVN_EDITOR, VISUAL or EDITOR are set, and no ‘editor-cmd‘ run-time configuration 


option was found

[root@localhost svndata]# svn commit  -m "svn ci data" 

Adding         a.html

Transmitting file data .

Committed revision 6.

[root@localhost svndata]# 


[root@localhost svndata]# svn  ls   svn://192.168.2.48/sadoc/   --username=wyb  --password=123456  --verbose

      6 wyb                   Oct 23 11:09 ./

      6 wyb                 0 Oct 23 11:09 a.html

      1 wyb              8011 Oct 23 09:49 svn.txt

      4 wyb                 0 Oct 23 10:37 ww.txt

      5 wyb                 0 Oct 23 10:59 新建文本文档.txt


#############################################################################################################################


#####

二、svn  hooks 


1.1.1钩子脚本:


写法就是系统中shell脚本程序的写法



当svn版本库发生改变时候,hooks就会触发相应作出执行命令 ,根据hooks输出或者返回的状态,hooks程序能够以某种方式执行该动作继续执


行,停止或者挂起、


-rw-r--r-- 1 root root 2780 Oct 22 17:05 start-commit.tmpl

[root@localhost hooks]# pwd

/application/svndata/sadoc/hooks

[root@localhost hooks]# ll

total 36

-rw-r--r-- 1 root root 1977 Oct 22 17:05 post-commit.tmpl

-rw-r--r-- 1 root root 1638 Oct 22 17:05 post-lock.tmpl

-rw-r--r-- 1 root root 2289 Oct 22 17:05 post-revprop-change.tmpl

-rw-r--r-- 1 root root 1567 Oct 22 17:05 post-unlock.tmpl

-rw-r--r-- 1 root root 3426 Oct 22 17:05 pre-commit.tmpl

-rw-r--r-- 1 root root 2410 Oct 22 17:05 pre-lock.tmpl

-rw-r--r-- 1 root root 2786 Oct 22 17:05 pre-revprop-change.tmpl

-rw-r--r-- 1 root root 2100 Oct 22 17:05 pre-unlock.tmpl

-rw-r--r-- 1 root root 2780 Oct 22 17:05 start-commit.tmpl

[root@localhost hooks]# 



对每种subversion版本库支持的钩子都有一个模板,通过查看这些脚本的内容,我们可以看到 的是什么事件触发了脚本以及如何给脚本传递数


同时,这些模板也是如何使用这些脚本,结合subversion支持的工具来完成任务的例子。

要实际安装一个可用的钩子,你需要在repo/hooks 目录下安装一些与钩子同名的可执行的程序或者脚本


注意:

由于安全原因,subversion版本库在一个空环境中执行钩子脚本就是没有任何环境变量,甚至没有$PATH或者%PATH% 由于这个原因,许多管理


员会感到困惑,  他们的钩子脚本手工运行时正常,可以在subversion中却不能运行。 要注意,必须在你的钩子中设置好“环境变量”或者为


你的程序制定好“绝对路径”



1.1.2 svn的hooks模板

1.1.2.1常用的钩子脚本



post-commit                          在提交完成成功创建版本之后执行该钩子,提交已经完成,不可更改,因此,本脚本的返回值被忽略


。提                                       交完成时候出发事务

pre-commit                           提交完成触发执行该脚本  

start-commit                         在客户端还没有向服务器提交数据之前,即还没有建立 subversion transaction之前              


                          执行该脚本


1.2 svn hooks生产环境应用场景举例

pre-commit 

限制上传文件大小扩展名及大小,控制提交要输入的信息等、


post-commit 

svn 更新自动周知,MSN,邮件短信周知

svn更新触发checkout程序,然后实时rsync送到服务器等


1.2.1 svn钩子生产应用实战。


案例一:rsync与svn钩子结合实现数据同步某企业小案例


a,建立同步web目录:

[root@localhost hooks]# mkdir  -p  /data/www


b,将svn中内容checkout到WEB目录一份

[root@localhost www]# svn co svn://192.168.2.48/sadoc  /data/www/ --username=wyb  --password=123456


[root@localhost www]# ls

a.html  b.html  c.html   svn.txt  ww.txt


修改hooks脚本,进行同步

 chmod 755 /application/svndata/sadoc/hooks/post-commit


[root@localhost svndata]# more /application/svndata/sadoc/hooks/post-commit

#!/bin/bash

REPOS="$1"

REV="$2"

export LC_CTYPE="en_US.UTF-8"

export LC_ALL= 


LOGPATH="app/log"

[! -d ${LOGPATH} ] && mkdir ${LOGPATH} -p

##update content from svn 

SVN=/usr/bin/svn

$SVN  update --username wyb --password 123456 /data/www/

if [ $? -eq 0 ]

   then

     /usr/bin/rsync  -az  --delete  /data/www/   /tmp/

fi


[root@localhost svndata]# touch wwwwwwwwwwwwwwwww

[root@localhost svndata]# svn add wwwwwwwwwwwwwwwww 

A         wwwwwwwwwwwwwwwww

[root@localhost svndata]# svn commit -m "wwwwwwww"

Adding         wwwwwwwwwwwwwwwww

Transmitting file data .

Committed revision 13.


[root@localhost svndata]# svn  ls   svn://192.168.2.48/sadoc/   --username=wyb  --password=123456  --verbose

     13 wyb                   Oct 23 15:11 ./

      9 wyb                15 Oct 23 11:34 a.html

     12 wyb                 0 Oct 23 15:09 asd.txt

      7 wyb                 0 Oct 23 11:28 b.html.txt

      8 wyb                 0 Oct 23 11:30 c.html.txt

     11 wyb                 0 Oct 23 15:08 hh.txt

      1 wyb              8011 Oct 23 09:49 svn.txt

      4 wyb                 0 Oct 23 10:37 ww.txt

     13 wyb                 0 Oct 23 15:11 wwwwwwwwwwwwwwwww

[root@localhost svndata]# 


[root@localhost svndata]# ls /tmp/

a.html  asd.txt  b.html.txt  c.html.txt  hh.txt  svn.txt  ww.txt  wwwwwwwwwwwwwwwww



写钩子脚本的注意事项:

a,钩子脚本的权限要允许svn执行,一般可以设置 chmod 755 post-commit


b,钩子脚本尽可能定义环境变量,主要是用过的命令的路径,因为svn考虑安装的问题,不会调用系统环境变量,所以如果发现手动执行post-


commit没有问题,但是自动还有可能无法执行


c,这个笔记的案例脚本,在svn update之前先要手动checkout一份出来,还有尽可能要加上用户密码,如果只是手动一样会更新,但是如果触


发可能就会不能更新


#####################################################

SVN 远程同步程序代码到远端的WEB服务器参考方法

方法一:http://biancheng.dnbcw.info/linux/345531.html

方法二:http://os.51cto.com/art/201410/454887.htm

#######################################################



案例二:

利用pre-commit 限制上传文件扩展名及大小

.

.

.

.

.

.

.

.

.


###############################################################

代码上线的解决方案,案例

 1.1小型格式的代码上线案例


技术分享



1.2 中型企业上线解决方案:


技术分享




1.3大型企业上线解决方案:

ITIL  BSWx




技术分享






集群环境中分批更新

 



代码上线解决方案注意事项:

1,上线的流程里,办公测试环境---》IDC测试环境----》正式生产环境,所有环境软件版本均应统一,否咋后患无穷;


2,开发团队小组办公内部测试环境(该环境由开发小组维护,或者定时自动更新代码),代码有问题返回给某个开发人员

3,有专门的测试工程师,程序有问题直接返回给开发人员

4,IDC测试有测试和运维参与,叫IDCtest,进行程序压力测试,有问题直接返回给开发人员。无问题上生产环境


5,数台服务器代码分发上线方案例子(Java程序)::::::

a,假设同业服务器有6台,分为2组,A组三台,B组三台,先对A进行平滑下线,B组正常提供服务,避免影响业务

b, 下线是通过脚本将A组的服务器从RS池(LVS,NGINX,HAPROXY,F5)等负载均衡器平滑提出,避免负载均衡器将请求送给

A组服务器,(此时在流量低峰期)






本文出自 “crazy_sir” 博客,请务必保留此出处http://douya.blog.51cto.com/6173221/1705833

svn详细介绍,独立安装配置,hooks的配置管理以及大型门户网站代码上线流程

标签:svn   hooks   代码上线   shell   

原文地址:http://douya.blog.51cto.com/6173221/1705833

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!