一、在linux上创建SVN服务器及进行正确配置的全流程
今天老板有了新项目,今天又开始部署新项目源代码至SVN上,步骤也很简单。
我这里因为之前已经有几个项目了,所以SVNserver已经装过了,现在只是加个SVN项目,也简单很多。
第一步:当然是创建项目了,很简单,一句命令:
svnadmin create /usr/svn/newpro
当然这后面跟的就是你的项目存放的地址。
这一步操作之后就会在svn下面新建一个newpro目录以及其下的子目录和文件:如下
conf db format hooks locks README.txt
比较重要的就是conf目录,里面有三个文件:authz passwd svnserve.conf
svnserve.conf是SVN服务器的配置文件:里面有些比较重要的项目:
anon-access = none #指明没有验证过的用户没有权限
auth-access = write #验证过的用户有写的最高权限
password-db = /usr/svn/newpro/conf/passwd #账号密码文件所在
authz-db =/usr/svn/newpro/conf/authz #权限验证文件所在
记住上面这些行最前面不要有空格,我也不记得是啥时候碰到过这个问题,就是前面有空格导致的。
然后就是配置passwd和authz文件了,passwd比较容易就是账写密码一一对应写即可,中间用=号隔开,一行一个账号密码,比如:
test =123456
hello=123456789
即表示两个用户,一个是test(密码123456)等等。
另一个文件authz里需要配置用户分级,然后对组进行权限设置,如:
[groups]
adminers = hellome,helloyou #将这两个用户分到adminers分组里(在passwd里指定这两个用户的账号密码,即上方的hello和test)
[newpro:/]
@adminers = rw #指明这个用户组具有读写的权限。
到此SVN服务器的配置已经完成,使用如下命令启动项目svn服务,(-d表示后台运行, -r 指定根目录是 /usr/svn/newpro )
svnserve -d -r /usr/svn/newpro
如遇到错误:svnserve: Can't bind server socket: Address already in use (原因:默认的启动svn服务,系统默认开启的端口为3690,当你启动第二个版本库时还是开启3690,所以就冲突了,因此再启动时只要更改端口号即可。)
启动命令改为:svnserve -d -r /usr/svn/newpro --listen-port 3691 就可以了。
二、使用命令svnsync将SVN仓库数据完整迁移的操作过程
新的服务器上需要把原来的SVN代码同步过来,因为想把历史的提交记录也保存下来,因此需要对SVN仓库记录进行保留,当然通过dump出源机器SVN代码,然后再load到新服务器上也是可以的,我这里是通过命令直接同步svn的数据(dump我没试,估计dump出来的文件非常大)。
我原SVN仓库版本是svn, version 1.6.11 (r934486)。新的服务器使用docker搭建,版本为svn, version 1.14.1 (r1886195)。版本并不相同,不过通过实践这并没影响我操作。操作步骤记录如下:
1、在新服务器上部署好SVN仓库:
#创建仓库repostory
docker exec -it svn-server svnadmin create repostory
cd /usr/opt/svn/repostory
cp hooks/pre-revprop-change.tmpl hooks/pre-revprop-change
chmod 777 hooks/pre-revprop-change
#修改hooks/pre-revprop-change 最后一行exit 1代码为exit 0,如下
vim hooks/pre-revprop-change
exit 0
2、执行仓库迁移
#初始化仓库迁移
svnsync init file:///usr/opt/svn/repostory svn://ip或域名/repostory(源地址)
#此步操作会提示输入源地址所在服务器的root账号密码和SVN账号密码
#执行仓库迁移
#此步操作会提示输入SVN账号密码
svnsync sync file:///usr/opt/svn/repostory
执行上面的命令后,就会把原SVN仓库下的文件拷贝到新服务器,每个仓库需要进行独立操作。
三、PHP里执行svn命令以同步SVN服务器和网站服务器的代码
现在很多都使用github作为代码托管了,好处这里不说,不过也有很多使用SVN管理代码协同开发,我也觉得SVN也挺好用的。
不过代码上传到了SVN后的存储并不是和编写的代码文件一样的文件存储格式,所以SVN服务器上的代码不能直接当作网站运行代码,SVN里本身有一个hooks可以实现当提交代码后直接更改网站代码文件夹里的内容。
PHP也能实现这样的功能,在网站根目录下加上一个PHP文件,代码如下:
header("Content-type:text/html;charset=utf-8");
echo "----------------------------update start--------------------------------<br><br>";
error_reporting(E_ALL);
putenv('export LANG=C.UTF-8');
error_reporting(E_ALL);
$handle = popen('LANG=en_US.UTF-8 svn update --username 0407 --password 123456 --config-dir /home/www/web/.subversion /home/www/web/ 2>&1','r');
while(!feof($handle)) {
$buffer = fgets($handle);
echo "$buffer<br/>\n";
ob_flush();
flush();
}
pclose($handle);
echo "<br><br><br><br>----------------------------".date("Y-m-d H:i:s");
注意更改上面的账号密码内容,这样执行一下这个文件就可以将提交到SVN服务器上的代码更新到网站文件夹了。