结构:

开发人员本地提交——内网SVN server——同步至公网SVN server——更新至各WEB机。

环境:centos5.5    svn+apache

一、内网Svn配置

主Svn
系统环境
所需软件包 均64位
Centos5.5/64
subversion-1.6.13-0.1.el5.rfx.x86_64.rpm
subversion-devel-1.6.13-0.1.el5.rfx.x86_64.rpm依赖及工具包
mod_dav_svn-1.6.13-0.1.el5.rfx.x86_64.rpm
(apache+subversion所需的加载模块)
httpd-2.2.3-43.el5.centos
apr-1.2.7-11.el5_3.1, apr-util-1.2.7-11.el5编译依赖组件

1.针对每项目建库
  1. svnadmin create /data/svnproj/test  
  2. svnadmin create /data/svnproj/testen  
  3. chown –R apache:apache /data/svnproj/test  
  4. chmod –R 755 /data/svnproj/testen 
更改属主apache 755权限
 
2.建立用户认证文件
htpasswd –c /data/conf.d/svn_user_list sourcesync第一次参数-c创建svn_user_list用户验证文件,并创建sourcesync同步帐户
htpasswd –m /data/conf.d/svn_user_list user1   创建svn帐户user1
3.建立权限认证文件
创建/data/conf.d/project.access配置如下:
  1. #svn group list  
  2. [groups]  
  3. tc_nginx_grp = user1   
  4. [/]  
  5. sourcesync = r  
  6. * = r  
  7.    
  8. [test:/]  
  9. @tc_nginx_grp = rw 
  10. [testen:/]  
  11. user1 = rw 
设置tc_nginx_grp组内用户可以访问test库根目录读写权限,testen库根目录只能user1读写权限。
 
4.修改配置文件/etc/httpd/conf/subversion.conf
 
  1. <Location /svn/> 
  2.    DAV svn  
  3.    SVNListParentPath on  
  4.    SVNParentPath /data/svnproj   库路径/dat/svnproj/...  
  5.    
  6.       AuthType Basic  
  7.       AuthName "Authorization Realm"  
  8.       AuthUserFile /data/conf.d/svn_user_list    指定用户验证文件  
  9.       AuthzSVNAccessFile /data/conf.d/project.access 指定权限验证文件  
  10.       Require valid-user  
  11. </Location> 
5.启动服务,设置开机启动
service httpd start
Chkconfig --level 35 httpd on

二、公网Svn配置(配置步骤大致同主SVN)

1.建SVN库

  1. svnadmin create /data/svnbak/test 并修改属主apache 755权限 
2.建用户认证文件
htpasswd –c /data/conf.d/svn_user_list desync  公网SVN同步帐号
权限认证文件
  1. /data/conf.d/project.access  
  2. [/]  
  3. dessync = rw 
  4. [test:/]  
  5. testupdate = r 
  6. [testen:/]  
  7. testenupdate = r 
svn同步帐号对所有库读写权,为了安全,web服务器从公网SVN拉取代码的web更新帐号只对对应库读权限。
3.修改配置文件/etc/httpd/conf/subversion.conf
  1. <Location /svn/> 
  2.    DAV svn  
  3.    SVNListParentPath on  
  4.    SVNParentPath /data/svnbak  库路径/dat/svnbak/...  
  5.    
  6.       AuthType Basic  
  7.       AuthName "Authorization Realm"  
  8.       AuthUserFile /data/conf.d/svn_user_list 指定用户验证文件  
  9.       AuthzSVNAccessFile /data/conf.d/project.access 指定权限验证文件  
  10.       Require valid-user  
  11. </Location> 
4.启动服务
service httpd start
Chkconfig –level 35 httpd on

三、同步配置(主要通过触发SVN钩子脚本同步实现)

 1.从SVN服务器

各库hooks下拷贝模板建立pre-revprop-change钩子脚本,属主apache 权限 +x执行
-rwxr-xr-x 1 apache apache 2788 Nov 19 08:15 pre-revprop-change
修改pre-revprop-change
  1. REPOS="$1" 
  2. REV="$2" 
  3. USER="$3" 
  4. PROPNAME="$4" 
  5. ACTION="$5" 
  6.    
  7. exit 0 
2. 内网SVN服务器
1)      建立系统帐户syncconf并切换到syncconf帐户.实现同步操作.
初始化建立关联要求认证,保存源svnsync和目标库dessync同步帐户密码自动生成至syncconf家目录下:
/home/syncconf/.subversion/auth/svn.simple/
2)各库hooks下拷贝模板建立post-commit钩子脚本实现自动同步
/data/svnproj/test/hooks/post-commit 属主apache 权限+x执行
添加内容
sudo -u syncconf /usr/bin/svnsync sync --non-interactive http://公网SVN-IP/svn/test --config-dir /home/syncconf/.subversion

----------------------------------------------------------------------------------------------

SVN问题总结:

认证类型
1.Mod_auth_basic基本认证 从客户端密码发送到服务器的加密,不适合高敏感的数据,除非伴随mod_ssl.
 
  1. AuthType Basic   
  2. AuthName "By Invitation Only"   
  3. # Optional line:  
  4.  
  5. AuthBasicProvider file       
  6. file是个指令默认值,也可以将密码存储在数据库中,需要mod_authn_dbm和mod_auth_dbd两个模块,  
  7. AuthBasicProvider dbm  选择dbm/dbd作为存储格式.  
  8.  
  9. AuthUserFile /usr/local/apache/passwd/passwords   
  10. AuthGroupFile /usr/local/apache/passwd/groups   
  11. Require group GroupName   任何人被列在goupname组,并有一个条目在password文件中.  
  12. 注:Require valid-user限定用户只有输入正确的用户名及密码后才能访问这个路径,好处让多个用户不那么具体,而不是创建一个组文件. 
2.Mod_auth_digest采用md5摘要式身份认证,更加安全,需要最新浏览器的支持.

Simply set up authentication normally, using AuthType Digest and AuthDigestProvider instead of the normal AuthType Basic and AuthBasicProvider . Then add a AuthDigestDomain directive containing at least the root URI(s) for this protection space.添加一个AuthDigestDomain指令空间至少包含根的URI(s)为这种保护。

  1. <Location /private/>   
  2. AuthType Digest   
  3. AuthName "private area"   
  4. AuthDigestDomain /private/ http://mirror.my.dom/private2/   
  5.  
  6. AuthDigestProvider file   
  7. AuthUserFile /web/auth/.digest_pw   
  8. Require valid-user   
  9. </Location>  

注:摘要式身份验证需要浏览器上运行的支持(火孤浏览器不支持.)

多库模式问题

每个项目列一库,针对目录再具体细分.认证文件指向同一目录下 

实现多库浏览问题:以下两个库:repos,mail

使用SVNParentPath的时候,直接访问ParentPath的时候,总是得到以下错误提示:
403 Forbidden
Forbidden
You don't have permission to access /svn/ on this server.

想通过http://ip/svn/ 查看其中的版本库列表,其中修改apache配置文件httpd.conf 中的选项:

  1. <Location /svn/>  定义的访问服务名svn  
  2.    DAV svn  
  3.  SVNListParentPath on  
  4.   SVNParentPath /opt/svndata  
  5. #   Options Indexes MultiViews  
  6. #   allow from all  
  7. #   AllowOverride None  
  8.  
  9.    AuthType Basic  
  10.    AuthName "Subversion Ralm"  
  11.    AuthUserFile /opt/svn_user_list  
  12.    AuthzSVNAccessFile /opt/project.access  
  13.  #  Satisfy Any  
  14.   Require valid-user  
  15.  RedirectMatch ^(/svn)$ $1/  访问时/ip/svn/  加/和不加/都可支持  
  16. </Location> 

同步初始化

1. 从源库上推向目标库,同步的钩子安全,初始化时出现找不到pre-revprop-change钩子。

注意:pre-revprop-change的执行权限问题.
多库同步:先创建各个库再分开同步
同步时隐藏明文形式的用户名密码,
Eg:在新建系统账户confcheck下来执行初始化后,会生成.subversion文件保存初始化时的用户名密码.
Sudo –u confcheck svnsync sync –non-interactive http://192.168.40.243/svn/repos
--config-dir /home/confcheck/.subversion(调用配置文件)
同步初始化时svnsync: DAV request failed it's possible that the repository's pre-revprop-change hook either failed or is non-existent svnsync问题 
建库时更改库下目录属主apache,但创建hooks子目录时pre-revprop-change文件是在root帐户下,属主是root.属主和权限问题.
2. svn同步密码安全问题:
[mailcheck@SN118_SVN01 ~]$ svnsync init http://192.168.40.243/svn/mailbak http://192.168.40.242/svn/mail
初始化建立关联会在mailcheck系统家目录下生成.subversion对目标库的认证密码文件.
 
[mailcheck@SN118_SVN01 ~]$ svnsync sync http://192.168.40.243/svn/mailbak
先手动执行一次同步会在mailcheck系统家目录下生成.subversion对源库认证的密码文件.
[root@SN118_SVN01 ~]# sudo -u mailcheck svnsync sync --non-interactive http://192.168.40.243/svn/mailbak --config-dir /home/mailcheck/.subversion
以mailcheck用户来执行同步,注意TAB键时.subversion后面的/去掉 否则提示出错.

写入post-commit脚本.

3.删除原库重建同名库后,同步时UUID出错问题:
[configcheck@SN118_SVN01 ~]$ svnsync sync http://192.168.40.243/svn/dbproj
svnsync: Repository UUID 'dd510a9b-2ca4-41f6-8dd0-e4f4774348ed' doesn't match expected UUID 'b52694bd-2c6a-40bc-92e5-5d4c479db616'
 
原来Repository创建者的UUID是前者,而现在所操作的是后者的UUID。目前的解决办法是:使用相关命令更新Repository的UUID。
 
首先查看项目的所有者的UUID:
svnlook uuid /opt/svndata/dbproj/dd510a9b-2ca4-41f6-8dd0-e4f4774348ed
更新项目的UUID:
sudo -u root svnadmin setuuid /opt/svndata/dbproj b52694bd-2c6a-40bc-92e5-5d4c479db616
例:svnadmin setuuid 库名 UUID
4.提交需要tty终端
sudo: sorry, you must have a tty to run sudo问题:
修改/etc/sudoers文件内容:
两种方法: 
1)在/etc/sudoers中添加如下内容:
Defaults:apache   !requiretty   重启httpd
2)默认当启用Defaults    requiretty时,会需要一个终端,注释掉.
添加:apache ALL=(mailcheck,chemcheck) NOPASSWD:/usr/bin/svnsync
     apache ALL=(ALL) NOPASSWD:ALL
apache用户通过mailcheck,chemcheck的身份来执行svnsync命令.对所有主机
 
5.subversion和apache都是基于apr构建的.apr全称apache portable runtime library,是一个独立且移植性很好的程序库,任何应该程序都可以使用它.无论在使用http/https模式访问时,都需要apr apr-util编译的支持.
SVN 依赖的APR版本要正确,如果Apache为2.0.x,对应的APR版本应为0.9.x;Apache为2.2.x,对应的APR版本应为1.2.x.
由于subversion-deps包里的APR是0.9.x的,因此编译svn时要删除从deps里解压出来的apr, apr-util,改而使用apache 2.2里提供的.
如果apache不是安装在默认路径,configure必須加上--with-apxs选项,如:./configure --with-apxs=/home/apache2/bin/apxs
 
6.库解锁问题
$ svn propdelete svn:sync-lock --revprop -r 0 目标IP/库路径
 
7.sudo: /etc/sudoers is mode 0640, should be 0440 sudo: no valid sudoers sources found, quitting
这种情况是修改了/etc/sudoers文件权限所致。
/etc/sudoers文件必须只有只读权限,有的人可能为了修改该文件而加上了可写的权限,所以解决方法就是用chmod命令回复该文件只读权限。
 
8.svn密码修改:
htpasswd -D passwordpath username 删除用户密码
htpasswd -bm passwordpath username newpasswd
-m加密
 
9. subversion bug问题
Subversion Version Control Bug: attempt to write a readonly database,
After adding group-write permission to the file "/svn/repopath/db/rep-cache.db 
需rep-cache.db属主组apache用户,可写权限755
 
10. sudoer问题
1). 注释Defaults requiretty
Defaults requiretty修改为 #Defaults requiretty, 表示不需要控制终端。
否则会出现sudo: sorry, you must have a tty to run sudo
2). 增加行 Defaults visiblepw
否则会出现 sudo: no tty present and no askpass program specified
我发现sudo-1.6.9p17-5.el5是不支持这个参数的,sudo-1.7.2p1-10.el5支持。
3). 赋予www用户执行svn权限
如,增加行:www  ALL=(ALL) NOPASSWD: /data0/shell/svnvp.sh
注:NOPASSWD可以使在命令执行时不需要交互输入www 用户的密码www用户为nginx或apache的运行用户
4).重启nginx或apache,让用户重新获得权限。