结构:
开发人员本地提交——内网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.针对每项目建库
- svnadmin create /data/svnproj/test
- svnadmin create /data/svnproj/testen
- chown –R apache:apache /data/svnproj/test
- 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配置如下:
- #svn group list
- [groups]
- tc_nginx_grp = user1
- [/]
- sourcesync = r
- * = r
-
- [test:/]
- @tc_nginx_grp = rw
- [testen:/]
- user1 = rw
设置tc_nginx_grp组内用户可以访问test库根目录读写权限,testen库根目录只能user1读写权限。
4.修改配置文件/etc/httpd/conf/subversion.conf
- <Location /svn/>
- DAV svn
- SVNListParentPath on
- SVNParentPath /data/svnproj 库路径/dat/svnproj/...
-
- AuthType Basic
- AuthName "Authorization Realm"
- AuthUserFile /data/conf.d/svn_user_list 指定用户验证文件
- AuthzSVNAccessFile /data/conf.d/project.access 指定权限验证文件
- Require valid-user
- </Location>
5.启动服务,设置开机启动
service httpd start
Chkconfig --level 35 httpd on
二、公网Svn配置(配置步骤大致同主SVN)
1.建SVN库
- svnadmin create /data/svnbak/test 并修改属主apache 755权限
2.建用户认证文件
htpasswd –c /data/conf.d/svn_user_list desync 公网SVN同步帐号
权限认证文件
- /data/conf.d/project.access
- [/]
- dessync = rw
- [test:/]
- testupdate = r
- [testen:/]
- testenupdate = r
svn同步帐号对所有库读写权,为了安全,web服务器从公网SVN拉取代码的web更新帐号只对对应库读权限。
3.修改配置文件/etc/httpd/conf/subversion.conf
- <Location /svn/>
- DAV svn
- SVNListParentPath on
- SVNParentPath /data/svnbak 库路径/dat/svnbak/...
-
- AuthType Basic
- AuthName "Authorization Realm"
- AuthUserFile /data/conf.d/svn_user_list 指定用户验证文件
- AuthzSVNAccessFile /data/conf.d/project.access 指定权限验证文件
- Require valid-user
- </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
- REPOS="$1"
- REV="$2"
- USER="$3"
- PROPNAME="$4"
- ACTION="$5"
-
- exit 0
2. 内网SVN服务器
1) 建立系统帐户syncconf并切换到syncconf帐户.实现同步操作.
svnsync init http://公网SVN-IP/svn/test http://内网SVN-IP/svn/test
svnsync sync http://公网SVN-IP/svn/test
初始化建立关联要求认证,保存源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.
- AuthType Basic
- AuthName "By Invitation Only"
- # Optional line:
-
- AuthBasicProvider file
- file是个指令默认值,也可以将密码存储在数据库中,需要mod_authn_dbm和mod_auth_dbd两个模块,
- AuthBasicProvider dbm 选择dbm/dbd作为存储格式.
-
- AuthUserFile /usr/local/apache/passwd/passwords
- AuthGroupFile /usr/local/apache/passwd/groups
- Require group GroupName 任何人被列在goupname组,并有一个条目在password文件中.
- 注: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)为这种保护。
- <Location /private/>
- AuthType Digest
- AuthName "private area"
- AuthDigestDomain /private/ http://mirror.my.dom/private2/
-
- AuthDigestProvider file
- AuthUserFile /web/auth/.digest_pw
- Require valid-user
- </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 中的选项:
- <Location /svn/> 定义的访问服务名svn
- DAV svn
- SVNListParentPath on
- SVNParentPath /opt/svndata
- # Options Indexes MultiViews
- # allow from all
- # AllowOverride None
-
- AuthType Basic
- AuthName "Subversion Ralm"
- AuthUserFile /opt/svn_user_list
- AuthzSVNAccessFile /opt/project.access
- # Satisfy Any
- Require valid-user
- RedirectMatch ^(/svn)$ $1/ 访问时/ip/svn/ 加/和不加/都可支持
- </Location>
同步初始化
1. 从源库上推向目标库,同步的钩子安全,初始化时出现找不到pre-revprop-change钩子。
注意:pre-revprop-change的执行权限问题.
多库同步:先创建各个库再分开同步
同步时隐藏明文形式的用户名密码,
Eg:在新建系统账户confcheck下来执行初始化后,会生成.subversion文件保存初始化时的用户名密码.
Svnsync init http://
目标机IP/库 http://
源IP/库 同步用户,密码
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,让用户重新获得权限。