代码发布方案:php
1,安装,优化 软件环境,(nginx,lvs) 《-------运维工程师html
2,程序代码(不断更新)。 《--------开发工程师,(开发,运维均可以发布)linux
3,配置变动(不断变动)。 《--------运维工程师。nginx
1、版本控制管理工具SVN详解git
1.1 什么是SVN(subversion) ?web
SVN是近年来很是优秀的版本管理工具,与CSV管理工具同样,SVN是一个跨平台开元版本控制系统,可是SVN不同凡响的是,SVN会备份并记录每一个文件每一次的修改更新变更。这样咱们能够把任意一个时间点档案恢复到想要的某一个旧版本,固然也能够直接浏览指定文件的更新历史记录shell
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,gitapache
1.1.2 SVN 与git的区别 ?vim
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是一种集中式文件系统版本管理系统,集中式管理的工做流程以下图
集中式代码管理的核心是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
|
###########################################################################################
2、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小型格式的代码上线案例
1.2 中型企业上线解决方案:
1.3大型企业上线解决方案:
ITIL BSWx
集群环境中分批更新
代码上线解决方案注意事项:
1,上线的流程里,办公测试环境---》IDC测试环境----》正式生产环境,全部环境软件版本均应统一,否咋后患无穷;
2,开发团队小组办公内部测试环境(该环境由开发小组维护,或者定时自动更新代码),代码有问题返回给某个开发人员
3,有专门的测试工程师,程序有问题直接返回给开发人员
4,IDC测试有测试和运维参与,叫IDCtest,进行程序压力测试,有问题直接返回给开发人员。无问题上生产环境
5,数台服务器代码分发上线方案例子(Java程序)::::::
a,假设同业服务器有6台,分为2组,A组三台,B组三台,先对A进行平滑下线,B组正常提供服务,避免影响业务
b, 下线是经过脚本将A组的服务器从RS池(LVS,NGINX,HAPROXY,F5)等负载均衡器平滑提出,避免负载均衡器将请求送给
A组服务器,(此时在流量低峰期)