代码发布方案:
1,安装,优化 软件环境,(nginx,lvs) 《-------运维工程师
2,程序代码(不断更新)。 《--------开发工程师,(开发,运维都可以发布)
3,配置变更(不断变更)。 《--------运维工程师。
一、版本控制管理工具SVN详解
1.1 什么是SVN(subversion) ?
SVN是近年来非常优秀的版本管理工具,与CSV管理工具一样,SVN是一个跨平台开元版本控制系统,但是SVN与众不同的是,SVN会备份并记录每个文件每一次的修改更新变动。这样我们可以把任意一个时间点档案恢复到想要的某一个旧版本,当然也可以直接浏览指定文件的更新历史记录
SVN的相关站点:
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.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准备操作系统并查看系统环境
[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程序能够以某种方式执行该动作继续执行,停止或者挂起、
-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目录:
[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组服务器,(此时在流量低峰期)