Linux下搭建大型SNV平台
Subversion是什么?
Subversion是一个自由/开源的版本控制系统。也就是说,在Subversion管理下,文件和目录可以超越时空。也就是Subversion允许你数据恢复到早期版本,或者是检查数据修改的历史。正因为如此,许多人将版本控制系统当作一种神奇的“时间机器”。
Subversion的版本库可以通过网络访问,从而使用户可以在不同的电脑上进行操作。从某种程度上来说,允许用户在各自的空间里修改和管理同一组数据可以促进团队协作。因为修改不再是单线进行,开发速度会更快。此外,由于所有的工作都已版本化,也就不必担心由于错误的更改而影响软件质量—如果出现不正确的更改,只要撤销那一次更改操作即可。
某些版本控制系统本身也是软件配置管理(SCM)系统,这种系统经过精巧的设计,专门用来管理源代码树,并且具备许多与软件开发有关的特性—比如,对编程语言的支持,或者提供程序构建工具。不过Subversion并不是这样的系统。它是一个通用系统,可以管理任何类型的文件集。对你来说,这些文件这可能是源程序—而对别人,则可能是一个货物清单或者是数字电影。
Subversion的特性
在讲解Subversion为版本控制领域带来的特性时,我们会经常通过Subversion对CVS的改进进行说明。如果不熟悉CVS,了解所有Subversion的特性会有一定的困难。而如果根本就不熟悉版本控制,你就只有干瞪眼的份儿了。因此,最好首先阅读一下第 1 章 基本概念,这一章简单介绍了一些版本控制的基本思想和概念。
Subversion支持:
版本化的目录
CVS只能跟踪单个文件的变更历史,但是Subversion实现的“虚拟”版本化文件系统则可以跟踪目录树的变更。在Subversion中,文件和目录都是版本化的。
真实的版本历史
由于只能跟踪单个文件的变更,CVS无法支持如文件拷贝和改名这些常见的操作—这些操作改变了目录的内容。同样,在CVS中,一个目录下的文件只要名字相同即拥有相同的历史,即使这些同名文件在历史上毫无关系。而在Subversion中,可以对文件或目录进行增加、拷贝和改名操作,也解决了同名而无关的文件之间的历史联系问题。
原子提交
一系列相关的更改,要么全部提交到版本库,要么一个也不提交。这样用户就可以将相关的更改组成一个逻辑整体,防止出现只有部分修改提交到版本库的情况。
版本化的元数据
每一个文件和目录都有自己的一组属性—键和它们的值。可以根据需要建立并存储任何键/值对。和文件本身的内容一样,属性也在版本控制之下。
可选的网络层
Subversion在版本库访问的实现上具有较高的抽象程度,利于人们实现新的网络访问机制。Subversion可以作为一个扩展模块嵌入到Apache之中。这种方式在稳定性和交互性方面有很大的优势,可以直接使用服务器的成熟技术—认证、授权和传输压缩等。此外,Subversion自身也实现了一个轻型的,可独立运行的服务器软件。这个服务器使用了一个自定义协议,可以轻松的用SSH封装。
一致的数据操作
Subversion用一个二进制差异算法描述文件的变化,对于文本(可读)和二进制(不可读)文件其操作方式是一致的。这两种类型的文件压缩存储在版本库中,而差异信息则在网络上双向传递。
高效的分支和标签操作
在Subversion中,分支与标签操作的开销与工程的大小无关。Subversion的分支和标签操作用只是一种类似于硬链接的机制拷贝整个工程。因而这些操作通常只会花费很少且相对固定的时间。
可修改性
Subversion没有历史负担,它以一系列优质的共享C程序库的方式实现,具有定义良好的API。这使得Subversion非常容易维护,和其它语言的互操作性很强。
Subversion的架构
图 1 “Subversion的架构”给出了Subversion设计总体上的“俯视图”。
图 1. Subversion的架构
图中的一端是保存所有版本数据的Subversion版本库,另一端是Subvesion的客户程序,管理着所有版本数据的本地影射(称为“工作拷贝”),在这两极之间是各种各样的版本库访问(RA)层,某些使用电脑网络通过网络服务器访问版本库,某些则绕过网络服务器直接访问版本库。
Subversion的组件
安装好的Subversion由几个部分组成,下面将简单的介绍一下这些组件。下文的描述或许过于简略,不易理解,但不用担心—本书后面的章节中会用更多的内容来详细阐述这些组件。
svn
命令行客户端程序。
svnversion
此工具用来显示工作拷贝的状态(用术语来说,就是当前项目的修订版本)。
svnlook
直接查看Subversion版本库的工具。
svnadmin
建立、调整和修复Subversion版本库的工具。
svndumpfilter
过滤Subversion版本库转储数据流的工具。
mod_dav_svn
Apache HTTP服务器的一个插件,使版本库可以通过网络访问。
svnserve
一个单独运行的服务器程序,可以作为守护进程或由SSH调用。这是另一种使版本库可以通过网络访问的方式。
svnsync
一个通过网络增量镜像版本库的程序。
如果已经正确完成了Subversion的安装,我们就可以开始我们的学习之旅了。在后面的两章中,我们将讲解如何使用Subversion的客户端程序svn。
服务配置
一个Subversion的版本库可以和客户端同时运行在同一个机器上,使用file:///访问,但是一个典型的Subversion设置应该包括一个单独的服务器,可以被办公室的所有客户端访问—或者有可能是整个世界。
本小节描述了怎样将一个Subversion的版本库暴露给远程客户端,我们会覆盖Subversion已存在的服务器机制,讨论各种方式的配置和使用。经过阅读本小节,你可以决定你需要哪种网络设置,并且明白怎样在你的主机上进行配置。
概述
Subversion的设计包括一个抽象的网络层,这意味着版本库可以通过各种服务器进程访问,而且客户端“版本库访问”的API允许程序员写出相关协议的插件,理论上讲,Subversion可以使用无限数量的网络协议实现,目前实践中只有两种服务器。
Apache是最流行的web服务器,通过使用mod_dav_svn模块,Apache可以访问版本库,并且可以使客户端使用HTTP的扩展协议WebDAV/DeltaV进行访问,因为Apache是一个非常易于扩展的web服务器,它提供了许多“易于获取的”特性,例如加密的SSL通讯,日志和与第三方工具的集成,以及内置的版本库web浏览功能。
在另一个角落是svnserve:一个更小,轻型的服务器程序,同客户端使用自定义的协议。因为协议是为Subversion专门设计的,并且是有状态的(不像HTTP),它提供了更快的网络操作—但也有一些代价。它只理解CRAM-MD5的认证,然而它非常易于配置,是开始使用Subversion的小团队的最佳选择。
第三个选择是使用SSH连接包裹的svnserve,尽管这个场景依然使用svnserve,它与传统的svnserve部署非常不同,SSH在多所有的通讯中使用加密方式,SSH也使用排他的认证,所以在服务器主机(svnserve与之不同,它包含了自己的私有用户帐号)上必须要有真实的系统帐户。最后,因为这些配置需要每个用户发起一个私有的临时svnserve进程,这与允许一组本地用户通过file://协议访问等同(从访问许可的视点)。因此路径为基础的访问控制变得没有意义,因为每个用户都可以直接访问版本库。
下面是三种典型服务器部署的总结。
表 6.1.
特性 |
Apache + mod_dav_svn |
svnserve |
svnserve over SSH |
认证选项 |
HTTP(S) basic auth、X.509 certificates、LDAP、NTLM或任何Apache httpd已经具备的方式 |
CRAM-MD5 |
SSH |
用户帐号选项 |
私有的'users'文件 |
私有的'users'文件 |
系统帐号 |
授权选项 |
可以授予整个版本库的读/写权限,也可以指定目录的。 |
可以授予整个版本库的读/写权限,也可以指定目录的。 |
只能对版本库整体赋予读/写权限 |
加密 |
通过可选的 SSL |
无 |
SSH通道的 |
Logging |
对每个HTTP请求记录完全的Apache日志,通过选项“高级”记录普通的客户端操作。 |
no logging |
no logging |
交互性 |
可以部分的被其他WebDAV客户端使用 |
只同svn客户端通讯 |
只同svn客户端通讯 |
Web浏览能力 |
有限的内置支持,或者通过第三方工具,如ViewVC |
只有通过第三方工具,如 ViewVC |
只有通过第三方工具,如 ViewVC |
速度 |
有些慢 |
快一点 |
快一点 |
初始设置 |
有些复杂 |
极为简单 |
相当简单 |
以上介绍摘自Subversion 手册
http://www.subversion.org.cn/svnbook/1.4/svnbook.html#svn.foreword
本文以下只介绍SVN使用Apache http 服务,将完成多个项目版本库管理、SSL加密、web界面管理项目、mysql 存放用户密码等全套SVN解决方案。
好了,打起精神开始用功学习吧~
一、环境说明
Server : CentOS 5.5 IP: 10.1.254.241
Client : Win2003 IP:10.1.96.9
二、软件包安装
1、
[root@subversion-1 ~]# yum -y install mysql mysql-server mysql-devel per-DBI perl-DBD-MySQl mod_auth_mysql php-common Php-cli php http http-devel mod_sslsubversion subversion-devel subversion-perl mod_dav_svn php-mysql
Mod_auth_mysql 把用户名字和密码保存到MySQL数据库,然后直接使用它们进行身份验证。
Mod_dav_svn Apache通过Apache HTTP服务器用来维护Subversion版本库配置指示。(详见:
http://www.subversion.org.cn/svnbook/1.4/svnbook.html#svn.ref.mod_dav_svn)
2、查看subversion是否安装成功
[root@subversion-1 ~]# svnserve --version
svnserve, version 1.6.11 (r934486)
compiled Jun 8 2011, 16:21:54
三、配置mysql
1、新建一个账户
GRANT all privileges ON *.* TO usvn@localhost IDENTIFIED BY 'usvn';
四、配置svn管理程序usvn
下载地址:http://subversion.tigris.org/downloads/subversion-1.6.11.tar.gz
1、 程序环境要求
1) PHP 5 (5.1.2 <= ver < 5.3)
2) apache2
3) mod_dav enable (in Apache httpd.conf - DSO support - "LoadModule dav_module modules/mod_dav.so")
4) mod_dav_fs enable (in Apache httpd.conf - DSO support - "LoadModule dav_fs_module modules/mod_dav_fs.so")
5) mod_rewrite enable (in Apache httpd.conf - DSO support - "LoadModule rewrite_module modules/mod_rewrite.so")
6) proper AllowOverride configuration (see below example - "AllowOverride All")
7) Subversion - below modules are packed in most binary distributions
8) mod_authz_svn enable (in Apache httpd.conf - DSO support - "LoadModule authz_svn_module modules/mod_authz_svn.so")
9) mod_dav_svn enable (in Apache httpd.conf - DSO support - "LoadModule dav_svn_module modules/mod_dav_svn.so")
2、 解压到/var/www/html/usvn
3、 配置apache,httpd.conf添加以下几行,并注释Listen 80。
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
LoadModule ssl_module modules/mod_ssl.so
Alias /usvn /var/www/html/usvn/public/
<Directory "/var/www/html/usvn/public">
Options +SymLinksIfOwnerMatch
AllowOverride all
Order allow,deny
Allow from all
</Directory>
4、 apache启动后查看https的端口443是否打开,你就可以使用安全的http ssl传输数据了
[root@subversion-1 ~]# netstat -antp | grep 443
tcp 0 0 :::443 :::* LISTEN 4239/httpd
不要忘记修改防火墙允许访问本机的443端口
5、 在浏览器上输入地址:http://10.1.254.241/usvn/
将以上配置添加到httpd.conf末尾,然后重启。接下来就可以通过usvn管理subversion了。
五、简单使用usvn
1、登录后显示台下,赶快创建一个项目吧
2、点击管理---》添加新项目
3、添加项目用户,点击管理----用户-----添加新用户
4、登录client安装TortoiseSVN
下载地址http://tortoisesvn.net/downloads.html,安装完成后,右键选择checkout
当然,你也可以通过https来浏览
还可以登录到usvn中来浏览
具体使用这里不再详述。
六、使用编译安装httpd,php时遇到的问题及解决方法
1、 要使用usvn就要注意PHP的版本5.1.2 <= ver < 5.3,httpd要把模块mod_rewrite、mod_dav mod_ssl
2、 Apache相关的软件包apr apr-util httpd 可以从http://lab.renren.com获得
Subversion包下载地址 http://subversion.apache.org/download/#pre-releases
3、 以下编译代码:
? install apr-1.4.5
./configure
make && make install
? install apr-util
/configure --with-apr=/usr/local/apr
make && make install
? install httpd
./configure --prefix=/usr/local/httpd-2.2.192 \
–-enable-rewrite \
--enable-dav \
--enable-so \
--enable-maintainer-mode \
--enable-ssl \
--with-apr=/usr/local/apr/bin/apr-1-config\ --with-apr-util=/usr/local/apr/bin/apu-1-config &&make && make install
? install subversion
./configure
--prefix=/usr/local/subversion-1.6.11 \
--with-apxs=/usr/local/httpd/bin/apxs \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr && make && make install
? install php
./configure --prefix=/usr/local/php \
--with-apxs2=/usr/local/httpd/bin/apxs \
--with-config-file-path=/usr/local/php \
--with-mysql=/usr/local/mysql --with-freetype-dir \
--with-gd --with-jpeg-dir --with-curl --with-png-dir \
--with-zlib --enable-mbstring \
--enable-exif \
--with-openssl && make && make install
? Install mysqli
cd /mysql-ser/ext/mysqi/
/usr/local/php/bin/phpize (产生configure文件)
./configure \
-prefix=/usr/local/mysqli \
-with-php-config=/usr/local/php/bin/php-config \
-with-mysqli=/usr/local/mysql/bin/mysql_config && make && make install
在/usr/local/php/php.ini 添加mysqli.so模块
extension_dir=”/path/to/mysqli.so/dir” 这个mysqli.so文件的目录在安装完成会显示
extension=mysqli.so
4、错误解决方法
? 在编译mysqli.so的错误
vi /usr/local/mysql/include/mysql.h
在第221行
... ...
enum mysql_protocol_type
{
MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET,
MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY
};
/*
There are three types of queries - the ones that have to go to
the master, the ones that go to a slave, and the adminstrative
type which must happen on the pivot connectioin
*/
#添加下面的4行
enum mysql_rpl_type
{
MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, MYSQL_RPL_ADMIN
};
2、如果出现以下错误:
/root/tmp/php-5.2.3/ext/mysqli/mysqli_api.c: In function 'zif_mysqli_stmt_bind_param':
/root/tmp/php-5.2.3/ext/mysqli/mysqli_api.c:144: error: 'gptr' undeclared (first use in this function)
/root/tmp/php-5.2.3/ext/mysqli/mysqli_api.c:144: error: (Each undeclared identifier is reported only once
/root/tmp/php-5.2.3/ext/mysqli/mysqli_api.c:144: error: for each function it appears in.)
/root/tmp/php-5.2.3/ext/mysqli/mysqli_api.c: In function 'zif_mysqli_stmt_execute':
/root/tmp/php-5.2.3/ext/mysqli/mysqli_api.c:603: error: 'gptr' undeclared (first use in this function)
make: *** [mysqli_api.lo] 错误 1
修改一下这个文件就可以
vi mysqli_api.c
查找所有gptr,有四处分别位于行144、行150、行603、行607,以 char* 替换
? 在进行到usvn第六步时要出现type=innodb错误,将报错的文件type=innodb全替换成engine=innodb,因为新的mysql版本不在支持type命令。
好了,休息一下。