文章目录
Linux云计算架构-搭建SVN版本控制服务器并在windows下管理版本
1. SVN版本控制服务介绍
SVN
即Subversion,是一个开放源代码的版本控制系统。采用分支管理系统,逐步取代了CVS。
常见的版本控制服务器:CVS
、SVN
、Git
、GitLab
Git是一个开源的分布式版本控制服务。以有效、高速的处理,管理从很小到非常大的项目版本。
GitLab利用Ruby on Rails,是一个开源的版本管理系统。可以通过web界面访问公开或私人项目。可以浏览源代码,管理缺陷和注释。可以浏览提交过的版本并提供一个文件历史库。可以使用简单的wall聊天工具交流。可以使用代码片段收集功能实现代码复用。
SVN官网:http://subversion.apache.org/
windows客户端tortoisesvn:http://tortoisesvn.net/
SVN数据存储方式:
①BDB:BerkeleyDB是一种事务安全型表类型
②FSFS:文件系统方式,较于BDB更安全。不会锁表。
SVN运行方式为C/S模式
,默认占用3690
端口号,访问方式为SVN://
若借助apache
运行,还需占用80
端口号。
SVN工作流程【核心:集中式代码管理】:
①上班时下载项目组最新代码
②选择自己的分支,并开始工作,定时提交更新代码。
③下班前整合分支到服务器对应的分支。
SVN+Apache运行机制:
2. 部署SVN版本控制服务器
# 安装subversion httpd mod_dav_svn
[root@server ~]# yum install -y subversion httpd mod_dav_svn
# 查看已注册端口
[root@server ~]# cat /etc/services | grep svn
svn 3690/tcp # Subversion
svn 3690/udp # Subversion
# 创建版本库的主目录以及版本库data1和data2
[root@server ~]# mkdir /web_version
[root@server ~]# svnadmin create /web_version/data1
[root@server ~]# svnadmin create /web_version/data2
# 查看下版本库下的文件
# dav目录提供apache和mod_dav_svn使用,用于存储内部数据。新建的版本库没有该目录。
[root@server ~]# ll /web_version/data1
总用量 8
drwxr-xr-x 2 root root 54 9月 4 22:06 conf # 存放配置文件的目录。包含用户的访问账号、权限等。
drwxr-sr-x 6 root root 233 9月 4 22:06 db # 所有版本控制的数据存放目录
-r--r--r-- 1 root root 2 9月 4 22:06 format # 当前文件库配置的版本号
drwxr-xr-x 2 root root 231 9月 4 22:06 hooks # 存放hook脚本文件的目录
drwxr-xr-x 2 root root 41 9月 4 22:06 locks # 存放subversion监控锁定数据的目录,用于追踪存放文件库的客户端。
-rw-r--r-- 1 root root 229 9月 4 22:06 README.txt
# 查看下版本库的配置文件
[root@server ~]# ll /web_version/data1/conf/
总用量 12
-rw-r--r-- 1 root root 1080 9月 4 22:06 authz # 认证、权限
-rw-r--r-- 1 root root 309 9月 4 22:06 passwd # 用户名和密码
-rw-r--r-- 1 root root 3090 9月 4 22:06 svnserve.conf # svn主配置文件
修改svn主配置文件:
# 顶格配置
[root@server ~]# vim /web_version/data1/conf/svnserve.conf
19 anon-access = read # 允许匿名用户读,设置为none,表示匿名用户不允许访问。
20 auth-access = write # 允许认证用户写
27 password-db = passwd
34 authz-db = authz
39 realm = my data1 version # 登录提示信息
# 设置用户名和密码【用户名 = 密码】
[root@server ~]# vim /web_version/data1/conf/passwd
[users] # 这里表示使用用户认证
abong = 123456
haha = 123456
# 配置用户及用户组权限
[root@server ~]# vim /web_version/data1/conf/authz
[groups]
data_group1 = haha # 组名 = 用户1,用户2
[/] # 当前版本库目录,这里指data1
@data_group1 = r # @组名 = 权限 rw
abong = rw # 用户名 = 权限
*= # 其他成员均无权限
启动SVN服务并创建测试代码
# man svnserve
svnserve允许使用svn网络协议访问Subversion仓库。它可以运行为独立的服务器进程,也可以在xinetd控制下运行。在启动svnserver时,必须选择操作的模式。下列选项也被识别:
-d, --daemon # 使得svnserve以守护进程方式运行。svnserve使自身运行在后台,在svn端口(默认是 3690)监听并提供服务。
--listen-port=port #使得svnserve在以守护进程方式运行时监听port端口。
--listen-host=host #使得svnserver监听host指定的接口,可以是一个主机名或是一个IP地址。
--foreground #当与-d一同使用时,这个选项使得svnserve在前台运行。这个选项主要用于调试。
-i, --inetd # 使得svnserve使用标准输入/标准输出文件描述符,当它在xinetd控制下运行时应该这样做。
-h, --help # 显示用法信息,然后退出。
-r root, --root=root # 为它提供服务的所有仓库设置虚根目录。客户端给出的URL中的路径名将被解释为相对于此“根”目录的路径,不允许超出根目录的范围。
-t, --tunnel # 使得svnserver运行于隧道模式,操作与xinetd模式类似(在标准输入/标准输出提供一个连接),但是将连接视为已认证的,认证用户就是当前的uid。这个选项是在客户端运行于一个隧道代理上时使用。
-T, --threads # 当运行在守护进程模式时,使得 svnserve为每个连接产生新线程而不是新进程。svnserve进程在启动时仍然将自身放到后台。
-X, --listen-once # 使得svnserve接受svn端口的一个连接,提供服务,然后退出。这个选项主要用于调试。一旦客户端通过传递URL选择了一个仓库,snvserve读取这个仓库中名为conf/svnserve.conf的文件,判断特定于仓库的设置信息,例如使用什么认证数据库,接受什么样的认证规则。
# svnserve以守护进程方式运行,指定根目录,即版本库的所在目录。
[root@server ~]# svnserve -d -r /web_version/
# 可以看到有svnserver进程,并且监听端口正常。
[root@server ~]# ps aux | grep svn
root 8309 0.0 0.0 197708 1036 ? Ss 09:34 0:00 svnserve -d -r /web_version/
root 8318 0.0 0.0 112724 988 pts/0 S+ 09:35 0:00 grep --color=auto svn
[root@server ~]# netstat -antup | grep svn
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 8309/svnserve
使用svn导入测试代码:
# svn 选项 源码 svn://server ip/项目名/ -m 备注信息
选项:
import # 提交版本
checkout # 下载版本
update # 更新版本
add\delete\copy\move # 目录操作
status # 检查状态差异
diff # 检查文件行级详细差异
revert # 恢复
resolve # 解决冲突
switch # 切换工作拷贝对应的版本库分支
log # 查看历史记录
list # 显示文件目录
cat # 查看某个文件内容
commit # 提交,类似数据库的事务提交
# 创建文件并提交版本
[root@server ~]# mkdir localsvn
[root@server ~]# cd localsvn/
[root@server localsvn]# touch {1,2}.html
[root@server localsvn]# ll
总用量 0
-rw-r--r-- 1 root root 0 9月 5 09:49 1.html
-rw-r--r-- 1 root root 0 9月 5 09:49 2.html
[root@server localsvn]# echo aaa > a.txt
[root@server localsvn]# echo bbb > b.txt
[root@server localsvn]# ll
总用量 8
-rw-r--r-- 1 root root 0 9月 5 09:49 1.html
-rw-r--r-- 1 root root 0 9月 5 09:49 2.html
-rw-r--r-- 1 root root 4 9月 5 09:49 a.txt
-rw-r--r-- 1 root root 4 9月 5 09:49 b.txt
# 提交代码,在服务器本地提交代码可以使用file
[root@server ~]# svn import /root/localsvn/ file:///web_version/data1/ -m "version 1"
正在增加 localsvn/1.html
正在增加 localsvn/2.html
正在增加 localsvn/a.txt
正在增加 localsvn/b.txt
提交后的版本为 1。
# 下载代码,一般用于第一次导出版本
[root@server ~]# svn checkout svn://192.168.8.192/data1/ download_version
[root@server ~]# ll download_version/
总用量 8
-rw-r--r-- 1 root root 0 9月 5 10:04 1.html
-rw-r--r-- 1 root root 0 9月 5 10:04 2.html
-rw-r--r-- 1 root root 4 9月 5 10:04 a.txt
-rw-r--r-- 1 root root 4 9月 5 10:04 b.txt
# add 增加代码,是做了一个新添加的标识
# 需要commit将新添加的代码提交到版本库
# haha用户为下载的版本增加代码,只拥有r权限,不可新增。
# 但是新增的内容还是在本地版本中,没有提交版本到svn服务器。
[root@server ~]# cd download_version/
[root@server download_version]# ll
总用量 8
-rw-r--r-- 1 root root 0 9月 5 10:04 1.html
-rw-r--r-- 1 root root 0 9月 5 10:04 2.html
-rw-r--r-- 1 root root 4 9月 5 10:04 a.txt
-rw-r--r-- 1 root root 4 9月 5 10:04 b.txt
[root@server download_version]# echo ccc > c.txt
[root@server download_version]# svn add c.txt
A c.txt
[root@server download_version]# svn commit -m "version 2"
# 使用用户abong提交新增的代码,abong用户拥有rw权限
3. SVN版本控制服务器的Apache展示
从SVN+Apache运行机制可以看出需要mod_dav_svn
模块。使用apache展示,本质上就是建立一台虚拟主机。
# 可以看到是有mod_dav_svn.so模块的
[root@server ~]# cat /etc/httpd/conf.modules.d/10-subversion.conf
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
LoadModule dontdothat_module modules/mod_dontdothat.so
配置apache支持svn,如果没有该文件,可以手动配置。
[root@server ~]# vim /etc/httpd/conf.d/subversion.conf
<Location /web_version>
DAV svn
SVNParentPath /web_version
AuthType Basic
AuthName "data1"
AuthUserFile /web_version/svn/passwd
AuthzSVNAccessFile /web_version/svn/authz
Require valid-user
</Location>
创建用户认证文件:
# 创建密码文件
[root@server ~]# mkdir /web_version/svn
[root@server ~]# htpasswd -c /web_version/svn/passwd user1
New password:
Re-type new password:
Adding password for user user1
[root@server ~]# htpasswd -m /web_version/svn/passwd user2
New password:
Re-type new password:
Adding password for user user2
[root@server ~]# htpasswd -m /web_version/svn/passwd user3
New password:
Re-type new password:
Adding password for user user3
[root@server ~]# cat /web_version/svn/passwd
user1:$apr1$uML2vHoq$p.Ey4TC6nH9RJiVFR.E1a1
user2:$apr1$ICnCXt99$PFEvFL6AJoVaUKW2Gjyl5/
user3:$apr1$9cScLoWb$Ujv6xSObG4TWtBZo0fvjY/
# 用户及用户组授权文件
[root@server ~]# cat /web_version/svn/authz
[groups]
all = user1,user2 # 用户组all
# [/] 所有版本库
[data1:/] # data1版本库
@all = rw # 对用户组授权
[data2:/] # data2版本库
user2 = rw # 对用户授权
user3 = rw
# 重启httpd服务,并加入到开机自启。
# 如果在重启httpd服务时,遇到无法重启,可以检查下默认端口号80是否被占用。
[root@server ~]# systemctl restart httpd
[root@server ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
# 开放80端口号,没有开放的要开放访问。
[root@server ~]# firewall-cmd --list-ports
80/tcp
输入网址:http://192.168.8.192/web_version/data1/
4. windows下使用tortoiseSVN工具下载和提交版本
tortoiseSVN
工具下载地址:https://tortoisesvn.net/downloads.html
一直下一步即可安装“小乌龟”。
创建一个目录svn,用于存放本地版本。
从svn服务器上下载版本到本地:
输入用户名和密码:
可以看到data1版本库的所有内容都已经从SVN服务器上下载下来了。
新增一个文件,并把该文件提交到SVN服务器:
提交失败,原因可能是通过apache的url上传,data1版本库的所有者和所属组要改为apache。
[root@server ~]# chown -R apache:apache /web_version/data1
再提交一次,可以看到已经提交成功了。
通过该工具,可以实现版本的下载、修改后提交等功能。通过版本库的URL也可以看到文件test已经提交到版本库了。