svn详细介绍,独立安装配置,hooks的配置管理以及大型门户网站代码上线流程

简介:

代码发布方案:

1,安装,优化 软件环境,(nginx,lvs)  《-------运维工程师

2,程序代码(不断更新)。   《--------开发工程师,(开发,运维都可以发布)

3,配置变更(不断变更)。   《--------运维工程师。



一、版本控制管理工具SVN详解


1.1 什么是SVN(subversion) ?

   

   SVN是近年来非常优秀的版本管理工具,与CSV管理工具一样,SVN是一个跨平台开元版本控制系统,但是SVN与众不同的是,SVN会备份并记录每个文件每一次的修改更新变动。这样我们可以把任意一个时间点档案恢复到想要的某一个旧版本,当然也可以直接浏览指定文件的更新历史记录


SVN的相关站点:

1
2
3
4
http: //subversion.tigris.org/
http: //subversion.apache.org/
SVN客户端:http: //tortoisesvn.net/
SVN中文网站:http: //svndoc.iusesvn.com/



目前为止:常见的版本管理软件有:vss,CVS,SVN,git



1.1.2 SVN 与git的区别 ?


SVN是一个集中式数据管理中心,存在一个中央版本库,所有开发人员所使用的代码都是来源于版本库,提交代码也是这个中央版本库。


SVN版本控制系统工作流程:

a,在中央库上创建或者从主干复制一个分支

b,从中央库check out下这个分支代码

c,增加自己的代码,修改,删除代码文件

d, commit 代码。假设有人刚刚在分支提交了代码,你就会被提醒代码过期

  你需要先update你的代码,然后在提交。


优缺点:

 

当无法连接到中央版本库的环境下,你无法提交代码,将代码加入版本控制。

你无法查看代码的历史版本以及版本的变化过程。提交到版本控制系统的代码我们都默认通过自测可运行。如果某个模块的代码比较复杂,不能短时间内实现可测试的功能,那么需要更长时间提交自己的代码,因此需要备份存储做备份。这点分布式的版本控制系统比较好点


SVN的备份要备份所有代码数据以及所有更改的新版本记录




1.1.2.2 git分布式版本控制


git中没有了中央分布式,但是为了开发小组的代码共享,我们通常还是会搭建一个远程git仓库,从某种意义上说,本地的git和远程的git仓库没有主从之分.


a.如果你本地创建一个git库,并将其add到远程git库中

b,你在本地添加或者删除文件,然后commit,当然commit操作都是提交到本地的git库中了,(也就是提交到了本地git目录的object目录中去了)

c,将本地的git库的分支push到远程git库的分支,如果这时候远程git库中,以及分别有了别人的push,那么远程git的分支不允许你push,到这个时候需要先pull,然后如果有冲突处理好冲突,commit到本地git,在push到远程git库




1.1.3 运维需要掌握的技术点:

a,安装,部署,维护,排障 

b,简单应用,很多公司由开发来管理,包括建立新仓库,添加,删除账号


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1.2.0 svn服务运行方式与访问方式
1.2.1 SVN服务端运行方式
       SVN服务常见的运行访问方式有3种:
      a,独立服务器访问
        访问地址:SVN://svn.etiantian.org/sadoc
      b,借助Apache等http服务
        访问地址如: http://svn.etiantian.org/sadoc
        b1,单独安装Apache+svn   不推荐,比较土
        b2,csvn(apache+svn)是一个单独的整合软件,带web界面管理的SVN软件.
      c,本地直接访问
          访问方式file://application/svndata/sadoc  一般在SVN服务器本地使用
 
我们主要以第一种和第二种的CSVN web 管理方式 
  
1.2.1.1 SVN客户端访问方式
 
file://           直接本地磁盘或者网络磁盘访问版本库
http://           通过webDAV 协议访问subversion的Apache服务器
https://          与http://相似,但是用ssl加密访问
SVN://            通过头tcp/ip自定义协议访问SVNsever
svn+ssh           通过认证加密tcp/ip自动以协议访问SVNserver服务器,


1.3.1 SVN档案库数据格式

SVN存储版本数据有2种方式:BDB(一种事务安全型表类型 berkley DB) ,FSFS(一种不需要数据库的存储系统)BDB方式在服务器中断时候,可能锁住数据,所以还是FSFS方式更安全


FSFS 一个专门用于subversion版本库的文件系统后端,可以使用网络文件 系统(NFS,SMBFS)



SVN是一个基于关系型数据库BDB或者一系列二进制文件的FSFS


 

1.4.1 SVN集中式版本管理系统

SVN是一种集中式文件系统版本管理系统,集中式管理的工作流程如下图


wKiom1YrUo6STGugAAE73J7ZiJQ067.jpg










集中式代码管理的核心是svn服务器,所有开发者新来的第一天必须从服务器获取代码,然后开发,最后解决冲突,提交,所有信息都放在svn服务器上。


1.4.2 开发者利用svn版本管理系统工作过程


举例说明:

a,从svn服务器下载项目最新代码。

b,进入自己的 分支,进行开发工作,每隔一段时间,提交一次,

c,下班时间,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器

缺点:

a,由于每次提交都会有一个原始副本,因此svn数据库容量会暴增

b,如果不能连接到svn服务器上,基本上不可以工作

c,不适合开源系统开发,开发人数较多,但是集中式管理非常明确权限管理机制,可以分层次管理


优点:

a,管理方便,逻辑清晰,明确。

b,易于管理,集中式svn服务器更容易保证数据安全性

c,代码一致性非常高

d,适合开发人数不多的项目开发



2.0安装配置svn服务


2.0.1准备操作系统并查看系统环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
[root@localhost ~] # cat /etc/redhat-release 
CentOS release 6.5 (Final)
[root@localhost ~] # uname -r
2.6.32-431.el6.x86_64
[root@localhost ~] # yum install subversion -y 
[root@localhost ~] # rpm -qa | grep subversion 
subversion-1.6.11-15.el6_7.x86_64
[root@localhost ~] # sed  -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf 
[root@localhost ~] # grep keepcache  /etc/yum.conf 
keepcache=1   rpm包安装后不清除
2.0.2配置并启动svn
建立svn版本数据存储根目录svndata,用户,密码,权限目录
[root@localhost ~] # mkdir -p /application/svndata/   --数据存储的根目录
[root@localhost ~] # mkdir -p /application/svnpasswd  --用户,密码权限目录
启动svn服务,指定svn服务的根目录
[root@localhost ~] # svnserve -d -r /application/svndata/ 
[root@localhost ~] # ps -ef | grep svn
root      1838     1  0 16:56 ?        00:00:00 svnserve -d -r  /application/svndata/
2.0.3 建立项目版本库,并且配置版本库
创建一个新的subversion项目sadoc,类似的这样显目可以创建多个,并对于不同的代码、
[root@localhost ~] # svnadmin create /application/svndata/sadoc    -创建一个新的项目
2.0.4 修改,调整svn配置文件以及权限文件
配置允许用户wyb读写访问
cd   /application/svndata/sadoc/conf
[root@localhost conf] # cp svnserve.conf svnserve.conf.bak 
[root@localhost conf] # vim svnserve.conf
修改完之后如下
[root@localhost conf] # grep -Ev "^#|^$" svnserve.conf
[general]
anon-access = none
auth-access = write
password-db =  /application/svnpasswd/passwd
authz-db =   /application/svnpasswd/authz
[sasl]
把密码认证文件模块复制到相关的目录,这样方便同意管理
[root@localhost conf] # ls /application/svnpasswd/
[root@localhost conf] # cp passwd  authz  /application/svnpasswd/
[root@localhost conf] # ls /application/svnpasswd/
authz   passwd
[root@localhost conf] # ll /application/svnpasswd/
total 8
-rw-r--r-- 1 root root 1080 Oct 22 17:19 authz
-rw-r--r-- 1 root root  309 Oct 22 17:19  passwd
[root@localhost conf] # chmod 700 /application/svnpasswd/*
[root@localhost conf] # ll /application/svnpasswd/
total 8
-rwx------ 1 root root 1080 Oct 22 17:19 authz
-rwx------ 1 root root  309 Oct 22 17:19  passwd
[root@localhost conf]
新增用户,密码
提示:
1,等号前为SVN账号,等好后为密码,密码是明晚,注意密码权限700
2,更改svnserve.conf时候,需要重启svn,更改authz, passwd 文件时候不需要重启svn
  [root@localhost svnpasswd] #vim passwd
[root@localhost svnpasswd] # cat passwd 
  
[ users ]
# harry = harryssecret
# sally = sallyssecret
wyb = 123456 
zhiyan = zhiyan 
[root@localhost svnpasswd]
[root@localhost svnpasswd] # vim authz   权限配置文件
格式说明
版本库目录格式:
[<版本库>:/项目/目录]
@<用户组名>=<权限>
<用户名>=<权限>
[/] 表示根目录。根目录就是svnserver启动时候,我们制定的 /application/svndata  [/]就表示对全部版本库设置权限
[repos:/]   表示对版本库repository设置权限
[repos: /sadoc ] 表示对版本库repo中sadoc项目设置权限
[repos: /sadoc/wyb ] 表示对版本库repos中的sadoc项目的wyb目录设置权限
权限主体可以是用户组,用户,* ,用户组前面加@,*表示全部用户
权限可以是w ,r,wr和 空表示没有任何权限
authz 中每个参数都要定格写,开头不能有空格
对于组,要以开头@开头,用户不需要@开头
[root@localhost svnpasswd] #cat authz 
新增部分
sagroup = wyb,zhiyan
[sadoc:/]
wyb = rw
zhiyan = r
@sagroup = r
  
注意:
* 权限配置文件中出现的用户名必须是用户配置文件中定义
* 对权限配置文件的修改立即生效,不必重启svn
用户格式
[ groups ]
其中,1个用户组可以包含1个或者多个用户,用户可以逗号分隔。
此时svn安装完毕
3.1  windows客户端软件tortoisesSVN
下载地址:http: //tortoisesvn .net /downloads .html
由于目前安装的是svn独立访问方式,所以svn客户端链接服务器的方式如下
svn: //192 .168.2.48 /sadoc
用户名:gongli
密码:123456
3.1.2 linux客户端命令行使用说明
co  checkout
up  update
ci  commit
3.1.2.1 从svn库提取数据
a, 将文件checkout到本地目录   Linux客户端,是checkout ,而不是update
[root@localhost sadoc] # mkdir /svndata
/svndata    ---项目代码下载到、 /svndata/  下 
svn co  svn: //192 .168.2.48 /sadoc/   /svndata/   --username=gongli  --password=123456
3.1.2.2-查看服务器端的数据
[root@localhost svndata] # svn  ls   svn://192.168.2.48/sadoc/   --username=wyb  --password=123456  -查看服务器端的数据
svn.txt
ww.txt
新建文本文档.txt
[root@localhost svndata]
[root@localhost svndata] # svn  ls   svn://192.168.2.48/sadoc/   --username=wyb  --password=123456  --verbose
       5 wyb                   Oct 23 10:59 ./
       1 wyb              8011 Oct 23 09:49 svn.txt
       4 wyb                 0 Oct 23 10:37 ww.txt
       5 wyb                 0 Oct 23 10:59 新建文本文档.txt
3.1.2.3 从本地提交到svn服务器
[root@localhost svndata] # touch a.html 
[root@localhost svndata] # svn add  a.html 
A         a.html
[root@localhost svndata] # svn commit 
svn: Commit failed (details follow):
svn: Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the 
--message (-m) or -- file  (-F) options
svn: None of the environment variables SVN_EDITOR, VISUAL or EDITOR are  set , and no  'editor-cmd'  run- time  configuration 
option was found
[root@localhost svndata] # svn commit  -m "svn ci data" 
Adding         a.html
Transmitting  file  data .
Committed revision 6.
[root@localhost svndata]
[root@localhost svndata] # svn  ls   svn://192.168.2.48/sadoc/   --username=wyb  --password=123456  --verbose
       6 wyb                   Oct 23 11:09 ./
       6 wyb                 0 Oct 23 11:09 a.html
       1 wyb              8011 Oct 23 09:49 svn.txt
       4 wyb                 0 Oct 23 10:37 ww.txt
       5 wyb                 0 Oct 23 10:59 新建文本文档.txt

###########################################################################################



二、svn  hooks 


1.1.1钩子脚本:


写法就是系统中shell脚本程序的写法



当svn版本库发生改变时候,hooks就会触发相应作出执行命令 ,根据hooks输出或者返回的状态,hooks程序能够以某种方式执行该动作继续执行,停止或者挂起、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-rw-r--r-- 1 root root 2780 Oct 22 17:05 start-commit.tmpl
[root@localhost hooks] # pwd
/application/svndata/sadoc/hooks
[root@localhost hooks] # ll
total 36
-rw-r--r-- 1 root root 1977 Oct 22 17:05 post-commit.tmpl
-rw-r--r-- 1 root root 1638 Oct 22 17:05 post-lock.tmpl
-rw-r--r-- 1 root root 2289 Oct 22 17:05 post-revprop-change.tmpl
-rw-r--r-- 1 root root 1567 Oct 22 17:05 post-unlock.tmpl
-rw-r--r-- 1 root root 3426 Oct 22 17:05 pre-commit.tmpl
-rw-r--r-- 1 root root 2410 Oct 22 17:05 pre-lock.tmpl
-rw-r--r-- 1 root root 2786 Oct 22 17:05 pre-revprop-change.tmpl
-rw-r--r-- 1 root root 2100 Oct 22 17:05 pre-unlock.tmpl
-rw-r--r-- 1 root root 2780 Oct 22 17:05 start-commit.tmpl
[root@localhost hooks] #



对每种subversion版本库支持的钩子都有一个模板,通过查看这些脚本的内容,我们可以看到 的是什么事件触发了脚本以及如何给脚本传递数据

同时,这些模板也是如何使用这些脚本,结合subversion支持的工具来完成任务的例子。

要实际安装一个可用的钩子,你需要在repo/hooks 目录下安装一些与钩子同名的可执行的程序或者脚本


注意:

由于安全原因,subversion版本库在一个空环境中执行钩子脚本就是没有任何环境变量,甚至没有$PATH或者%PATH% 由于这个原因,许多管理员会感到困惑,  他们的钩子脚本手工运行时正常,可以在subversion中却不能运行。 要注意,必须在你的钩子中设置好“环境变量”或者为你的程序制定好“绝对路径”



1.1.2 svn的hooks模板

1.1.2.1常用的钩子脚本



post-commit        在提交完成成功创建版本之后执行该钩子,提交已经完成,不可更改,因此,本脚本的返回值被忽略提交完成时候出发事务

pre-commit        提交完成触发执行该脚本  

start-commit       

在客户端还没有向服务器提交数据之前,即还没有建立  subversiontransaction之前执行该脚本


1.2 svn hooks生产环境应用场景举例

pre-commit 

限制上传文件大小扩展名及大小,控制提交要输入的信息等、


post-commit 

svn 更新自动周知,MSN,邮件短信周知

svn更新触发checkout程序,然后实时rsync送到服务器等


1.2.1 svn钩子生产应用实战。


案例一:rsync与svn钩子结合实现数据同步某企业小案例


a,建立同步web目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[root@localhost hooks] # mkdir  -p  /data/www
b,将svn中内容checkout到WEB目录一份
[root@localhost www] # svn co svn://192.168.2.48/sadoc  /data/www/ --username=wyb  --password=123456
[root@localhost www] # ls
a.html  b.html  c.html   svn.txt  ww.txt
修改hooks脚本,进行同步
  chmod  755  /application/svndata/sadoc/hooks/post-commit
[root@localhost svndata] # more /application/svndata/sadoc/hooks/post-commit
#!/bin/bash
REPOS= "$1"
REV= "$2"
export  LC_CTYPE= "en_US.UTF-8"
export  LC_ALL= 
LOGPATH= "app/log"
[! -d ${LOGPATH} ] &&  mkdir  ${LOGPATH} -p
##update content from svn 
SVN= /usr/bin/svn
$SVN  update --username wyb --password 123456  /data/www/
if  [ $? - eq  0 ]
    then
      /usr/bin/rsync   -az  --delete   /data/www/    /tmp/
fi
[root@localhost svndata] # touch wwwwwwwwwwwwwwwww
[root@localhost svndata] # svn add wwwwwwwwwwwwwwwww 
A         wwwwwwwwwwwwwwwww
[root@localhost svndata] # svn commit -m "wwwwwwww"
Adding         wwwwwwwwwwwwwwwww
Transmitting  file  data .
Committed revision 13.
[root@localhost svndata] # svn  ls   svn://192.168.2.48/sadoc/   --username=wyb  --password=123456  --verbose
      13 wyb                   Oct 23 15:11 ./
       9 wyb                15 Oct 23 11:34 a.html
      12 wyb                 0 Oct 23 15:09 asd.txt
       7 wyb                 0 Oct 23 11:28 b.html.txt
       8 wyb                 0 Oct 23 11:30 c.html.txt
      11 wyb                 0 Oct 23 15:08 hh.txt
       1 wyb              8011 Oct 23 09:49 svn.txt
       4 wyb                 0 Oct 23 10:37 ww.txt
      13 wyb                 0 Oct 23 15:11 wwwwwwwwwwwwwwwww
[root@localhost svndata]
[root@localhost svndata] # ls /tmp/
a.html  asd.txt  b.html.txt  c.html.txt  hh.txt  svn.txt  ww.txt  wwwwwwwwwwwwwwwww



写钩子脚本的注意事项:

a,钩子脚本的权限要允许svn执行,一般可以设置 chmod 755 post-commit


b,钩子脚本尽可能定义环境变量,主要是用过的命令的路径,因为svn考虑安装的问题,不会调用系统环境变量,所以如果发现手动执行post-


commit没有问题,但是自动还有可能无法执行


c,这个笔记的案例脚本,在svn update之前先要手动checkout一份出来,还有尽可能要加上用户密码,如果只是手动一样会更新,但是如果触


发可能就会不能更新


#####################################################

SVN 远程同步程序代码到远端的WEB服务器参考方法

方法一:http://biancheng.dnbcw.info/linux/345531.html

方法二:http://os.51cto.com/art/201410/454887.htm

#######################################################



案例二:

利用pre-commit 限制上传文件扩展名及大小

.

.

.

.

.

.

.

.

.


###############################################################

代码上线的解决方案,案例

 1.1小型格式的代码上线案例


wKioL1YrUiCTui9cAAMs6naCrBc100.jpg



1.2 中型企业上线解决方案:


wKiom1YrUi7xhfPtAAHTYHIAYCs400.jpg




1.3大型企业上线解决方案:

ITIL  BSWx




wKioL1YrUpOQmEUEAARMMIlWO8M494.jpg






集群环境中分批更新

 



代码上线解决方案注意事项:

1,上线的流程里,办公测试环境---》IDC测试环境----》正式生产环境,所有环境软件版本均应统一,否咋后患无穷;


2,开发团队小组办公内部测试环境(该环境由开发小组维护,或者定时自动更新代码),代码有问题返回给某个开发人员

3,有专门的测试工程师,程序有问题直接返回给开发人员

4,IDC测试有测试和运维参与,叫IDCtest,进行程序压力测试,有问题直接返回给开发人员。无问题上生产环境


5,数台服务器代码分发上线方案例子(Java程序)::::::

a,假设同业服务器有6台,分为2组,A组三台,B组三台,先对A进行平滑下线,B组正常提供服务,避免影响业务

b, 下线是通过脚本将A组的服务器从RS池(LVS,NGINX,HAPROXY,F5)等负载均衡器平滑提出,避免负载均衡器将请求送给

A组服务器,(此时在流量低峰期)








      本文转自crazy_charles 51CTO博客,原文链接:http://blog.51cto.com/douya/1705833,如需转载请自行联系原作者



相关文章
|
6月前
|
存储 网络协议 Ubuntu
如何在Ubuntu安装配置SVN服务端并实现无公网ip访问内网资料库
如何在Ubuntu安装配置SVN服务端并实现无公网ip访问内网资料库
196 0
|
6月前
|
程序员 Linux 开发工具
Git基本概念、工作流程及与SVN的对比
Git基本概念、工作流程及与SVN的对比
119 0
5-20|本文目标为svn合并代码
5-20|本文目标为svn合并代码
|
6月前
SVN 如何将分支代码合并回主干
SVN 如何将分支代码合并回主干
49 0
|
6月前
|
自然语言处理 Shell 网络安全
Liunx服务器搭建SVN服务,并通过钩子实现代码自动部署
Liunx服务器搭建SVN服务,并通过钩子实现代码自动部署
83 3
|
6月前
idea右击项目却不显示svn提交按钮菜单Subversion选项,无法提交代码
idea右击项目却不显示svn提交按钮菜单Subversion选项,无法提交代码
1211 0
idea右击项目却不显示svn提交按钮菜单Subversion选项,无法提交代码
|
Java Android开发
eclipse中向svn提交代码冲突的解决
eclipse中向svn提交代码冲突的解决
|
Android开发
Android 中使用SVN恢复原来的代码
Android 中使用SVN恢复原来的代码
72 0
|
6月前
|
存储 网络协议 Ubuntu
Linux环境下的SVN服务器搭建并结合内网穿透实现远程连接
Linux环境下的SVN服务器搭建并结合内网穿透实现远程连接
223 0
|
6月前
|
Ubuntu 安全 网络安全
百度搜索:蓝易云【Ubuntu系统SVN服务器搭建教程】
现在,你已经成功在Ubuntu系统上搭建了SVN服务器。其他用户可以通过SVN客户端连接到你的SVN服务器,进行代码版本管理和协作开发。注意,为了安全起见,建议配置SSL加密以保护数据传输。
79 1