我今年19了!人生有多少22K?
所有实验环境初始化:
创建本地光盘Yum源,安装tree lrzsz vim,关闭iptables和selinux。
定义别名cls=’clear’,ll=’ls -Alh’。
1.安装优化软件环境
2.程序代码
3.配置变更
SVN是跨平台的开源版本控制系统。SVN会备份并记录文件每一次的修改更新的变动。
SVN是通用的软件系统,常用来管理程序代码。常见的版本控制软件有:VSS、CVS、SVN、Git。
SVN是一个集中式的版本控制系统,SVN版本控制系统的工作流程:
1.在中央库中创建或者从主干复制一个分支。
2.从中央库check out下这个分支的代码。
3.增加自己的代码文件,修改现存代码或删除代码文件。
4.Commit代码,,假设有人刚刚提交了代码,系统就会提示就会提示代码过期。
5.所以就要下up自己的代码再提交代码,up代码的时候发现冲突就需要解决冲突再次提交。
1.当无法连接到中央版本控制库,就会无法提交代码,将代码加入版本控制。
2.由于代码库集中管理,因此需要对中央版本库存储做备份。这点分布式的版本控制系统,SVN的备份要备份所有的代码数据以及所有更改的版本记录。
3.提交到代码版本控制系统的时候默认都是通过自测运行的,如果某个模块的代码比较复杂,不能短时间内实现可测试的功能,那么就需要等待很长的时间提交自己的代码。
Git是Linus开发,Git有本地的Git版本仓库,在某种角度上可以说Git本地仓库和远程的仓库是等价的,没有主从之分。
1.独立服务器访问:
访问地址:svn://....
2.借助Web服务器:
访问地址:http://...
(1)安装Apache+SVN
(2)CSVN(Apache+SVN)单独整合的软件,带Web管理界面。
3.本地直接访问:
访问地址:file://...
访问方式 | 说明 |
file:// | 直接通过本地磁盘或网络的方式访问 |
http:// | 通过WebDAV协议访问支持SVN的Web服务器 |
https:// | 和http://相似,但是用SSL加密访问 |
svn:// | 通过TCP/IP自定义协议访问SVN服务器 |
svn+ssh:// | 通过认证并加密的TCP/IP自定义协议访问SVN服务器 |
1.BDB:(伯克利)版本库可以使用的一种经过充分测试的后台数据库实现,不能通过网络共享的文件系统使用,BDB是SVN以前的缺省版本库格式。
2.FSFS:一个专门用于SVN的文件系统后端,可以使用网络文件系统,比如NFS或SMBFS
SVN是基于关系型数据库的或者是基于二进制文件的,一方面解决了并行文件读写的问题,也添加了事务的特性;但是另一方面数据也会变得不透明,不会看到数据的实体文件。
缺点:
1.由于每一次提交都要保留一个原始的副本,因此SVN数据库的容量会增速较快。
2.如果不能连接到SVN服务器上,基本上不可以工作。
3.不适合开源系统开发,但是一般集中式管理的有非常明确的权限管理机制,可以实现分层管理,从而很好解决开发人员多的问题。
优点:
1.管理方便,逻辑清晰明确。
2.易于管理,集中式SVN服务器更能保证数据安全性。
3.代码一致性非常高
4.适合开发人数不多项目开发。
5.普及度比较高。
实验环境:
一台CentOS6x64的node0服务器,IP地址为:192.168.10.2
实验步骤:
1.查看系统版本:
[root@node0 ~]# uname-rm
2.6.32-573.el6.x86_64x86_64
2.检查是否安装subversion软件:
[root@node0 ~]# rpm-qa subversion
3.使用Yum安装SVN软件:
[root@node0 ~]# yuminstall subversion -y
4.创建目录:用于SVN数据代码和用户数据密码
[root@node0 ~]# mkdir-p /app/svndata
[root@node0 ~]# mkdir-p /app/svnpwd
5.启动SVN服务:
[root@node0 ~]#svnserve -d -r /app/svndata/
6.查看进程是否启动:
[root@node0 ~]# psaux | grep svn
root 2074 0.0 0.0 156532 748 ? Ss 02:02 0:00 svnserve -d -r /app/svndata/
7.查看服务是否启动:
[root@node0 ~]#netstat -tunlap | grep 3690
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 2074/svnserve
8.查看支持的命令:
[root@node0 ~]#svnserve --help
用法: svnserve [-d | -i | -t | -X] [options]
有效选项:
-d [--daemon] : 后台模式
-i [--inetd] :inetd 模式
-t [--tunnel] : 隧道模式
-X [--listen-once] : 监听一次方式(调试用)
-r [--root] ARG : 服务的根目录
-R [--read-only] : 强制只读;覆盖版本库配置文件
--config-file ARG : 从文件 ARG 读取配置
--listen-port ARG : 监听端口
[方式:daemon, listen-once]
--listen-host ARG : 监听主机名称或IP地址
[方式:daemon, listen-once]
-T [--threads] : 使用线程代替进程 [方式:daemon]
--foreground : 在前台运行(调试用)
[方式:daemon]
--log-file ARG : svnserve 日志文件
--pid-file ARG : 写进程 PID 到文件ARG
[方式:daemon, listen-once]
--tunnel-user ARG : 隧道用户名(默认是当前UID对应的用户名)
[方式:tunnel]
-h [--help] : 显示本帮助
--version : 显示程序版本信息
9.修改配置文件:
(1)备份配置文件:
[root@node0 ~]#cd /app/svndata/sadoc/conf/
[root@node0 conf]# cpsvnserve.conf svnserve.conf.bak
(2)修改配置文件:
[root@node0 conf]#vim svnserve.conf
12 anon-access = none #关闭匿名访问
13 auth-access = write #允许写入权限
20 password-db = /app/svnpwd/passwd #配置统一管理密码文件
27 authz-db = /app/svnpwd/authz #配置统一管理权限文件
(3)使用diff检查配置文件:
[root@node0 conf]#diff svnserve.conf svnserve.conf.bak
12,13c12,13
< anon-access =none
< auth-access =write
---
> # anon-access =read
> # auth-access =write
20c20
< password-db =/app/svnpwd/passwd
---
> # password-db =passwd
27c27
< authz-db =/app/svnpwd/authz
---
> # authz-db =authz
(4)重启SVN服务:
[root@node0 svnpwd]#ps -elf | grep svn
1 S root 2074 1 0 80 0- 39133 inet_c 02:02 ? 00:00:00svnserve -d -r /app/svndata/
0 S root 25453 1836 0 80 0- 25831 pipe_w 04:14 pts/0 00:00:00grep svn
[root@node0 svnpwd]#kill 2074
[root@node0 svnpwd]#ps -elf | grep svn
0 S root 25457 1836 0 80 0- 25831 pipe_w 04:14 pts/0 00:00:00 grep svn
[root@node0 svnpwd]#svnserve -d -r /app/svndata/
[root@node0 svnpwd]#ps -elf | grep svn
1 S root 25465 1 0 80 0- 39133 inet_c 04:17 ? 00:00:00svnserve -d -r /app/svndata/
0 S root 25467 1836 0 80 0- 25831 pipe_w 04:17 pts/0 00:00:00grep svn
(5)修改文件权限:
[root@node0 svnpwd]#cd /app/svndata/sadoc/conf/
[root@node0 conf]# ll
[root@node0 ~]# cp/app/svndata/sadoc/conf/passwd /app/svnpwd/
[root@node0 ~]# cp/app/svndata/sadoc/conf/authz /app/svnpwd/
总用量 16K
-rw-r--r-- 1 rootroot 1.1K 11月 702:11 authz
-rw-r--r-- 1 rootroot 309 11月 7 02:11 passwd
-rw-r--r-- 1 rootroot 2.3K 11月 704:08 svnserve.conf
-rw-r--r-- 1 rootroot 2.3K 11月 703:58 svnserve.conf.bak
[root@node0 conf]#chmod 700 *
[root@node0 conf]# ll
总用量 16K
-rwx------ 1 rootroot 1.1K 11月 702:11 authz
-rwx------ 1 rootroot 309 11月 7 02:11 passwd
-rwx------ 1 rootroot 2.3K 11月 704:08 svnserve.conf
-rwx------ 1 rootroot 2.3K 11月 703:58 svnserve.conf.bak
1.创建版本库:
[root@node0 ~]#svnadmin create /app/svndata/sadoc
[root@node0 ~]# tree/app/svndata/sadoc/
/app/svndata/sadoc/
├── conf
│ ├── authz
│ ├── passwd
│ └── svnserve.conf
├── db
│ ├── current
│ ├── format
│ ├── fsfs.conf
│ ├── fs-type
│ ├── min-unpacked-rev
│ ├── rep-cache.db
│ ├── revprops
│ │ └──0
│ │ └── 0
│ ├── revs
│ │ └──0
│ │ └── 0
│ ├── transactions
│ ├── txn-current
│ ├──txn-current-lock
│ ├── txn-protorevs
│ ├── uuid
│ └── write-lock
├── format
├── hooks
│ ├──post-commit.tmpl
│ ├── post-lock.tmpl
│ ├──post-revprop-change.tmpl
│ ├──post-unlock.tmpl
│ ├──pre-commit.tmpl
│ ├── pre-lock.tmpl
│ ├──pre-revprop-change.tmpl
│ ├──pre-unlock.tmpl
│ └──start-commit.tmpl
├── locks
│ ├── db.lock
│ └── db-logs.lock
└── README.txt
10 directories, 28files
[root@node0 ~]#
2.使用help命令获取帮助:
[root@node0 ~]#svnadmin help create
create: 用法:svnadmin create REPOS_PATH
在 REPOS_PATH 创建一个新的空版本库。
有效选项:
--bdb-txn-nosync : 在提交事务时禁用fsync [BDB]
--bdb-log-keep : 禁用自动删除日志文件 [BDB]
--config-dir ARG : 从目录 ARG 读取用户配置文件
--fs-type ARG : 版本库类型: “fsfs”(默认)或“bdb”
--pre-1.4-compatible : 使用与1.4之前版本兼容的格式
--pre-1.5-compatible : 使用 Subversion 1.5 之前版本的格式
--pre-1.6-compatible : 使用与 1.6 之前版本兼容的格式
[root@node0 ~]#
3.创建用户并授权访问:
[root@node0 conf]# cd/app/svndata/sadoc/conf/
[root@node0 conf]#vim passwd
1 ### This file is an example password filefor svnserve.
2 ### Its format is similar to that of svnserve.conf.As shown in the
3 ### example below it contains one sectionlabelled [users].
4 ### The name and password for each userfollow, one account per line.
5
6 [users]
7 # harry = harryssecret
8 # sally = sallyssecret
添加密码:
9 user0 = user0123
10 user1 = user1123
当更改svnserve.conf的时候需要重启svn服务,但是更改其他文件的时候不需要重启。
[root@node0 conf]#vim authz
1 ###This file is an example authorization file for svnserve.
2 ### Its format is identical to that ofmod_authz_svn authorization
3 ### files.
4 ### As shown below each section definesauthorizations for the path and
5 ### (optional) repository specified by thesection name.
6 ### The authorizations follow. Anauthorization line can refer to:
7 ### - a single user,
8 ### - a group of users defined in a special [groups] section,
9 ### - an alias defined in a special [aliases] section,
10 ### - all authenticated users, using the ‘$authenticated‘ token,
11 ### - only anonymous users, using the ‘$anonymous‘ token,
12 ### - anyone, using the ‘*‘ wildcard.
13 ###
14 ### A match can be inverted by prefixingthe rule with ‘~‘. Rules can
15 ### grant read (‘r‘) access, read-write(‘rw‘) access, or no access
16 ### (‘‘).
17
18 [aliases]
19 # joe = /C=XZ/ST=Dessert/L=Snake City/O=SnakeOil, Ltd./OU=Research Institute/CN=Joe Average
20
21 [groups]
22 # harry_and_sally = harry,sally
23 # harry_sally_and_joe =harry,sally,&joe
24
25 # [/foo/bar]
26 # harry = rw
27 # &joe = r
28 # * =
29
30 # [repository:/baz/fuz]
31 # @harry_and_sally = rw
32 # * = r
一个用户组可以包含多个用户,用户名通过英文逗号分隔,版本库目录格式:
[版本库:项目目录]
用户名 = 权限
用户组名 = 权限
如果项目目录指定为/,指的是SVN服务的根目录,即/app/svndata/,表示对全部的版本库设置权限。
添加用户:
34 [sadoc:/]
35 user0 = r
36 user1 = r
另一种添加方式:
33 sagroup = user0,user1
34 [sadoc:/]
35 @sagroup = r
要保证authz文件和passwd文件中存在该用户。
4.使用SVN客户端TortoiseSVN或者是:
(1)check outSVN服务器端的数据:
[root@node0 ~]# mkdir/svnproject
[root@node0 ~]# svnco svn://192.168.10.2/sadoc/ /svnproject/ --username=user0 --password=user0123
-----------------------------------------------------------------------
注意! 你的密码,对于认证域:
<svn://192.168.10.2:3690>122a9f5c-c2da-46d5-9344-e27b4139d4be
只能明文保存在磁盘上! 如果可能的话,请考虑配置你的系统,让 Subversion
可以保存加密后的密码。请参阅文档以获得详细信息。
你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,
来避免再次出现此警告。
-----------------------------------------------------------------------
保存未加密的密码(yes/no)?yes
取出版本 0。
(2)查看Linux服务器端的数据:
svn list SVN服务器地址/项目目录
(3)提交客户端数据:
svn ci -m “信息”
钩子脚本的具体写法就是操作系统中Shell脚本的写法,可以根据SVN服务器和Shell程序进行相应的开发。每个钩子脚本本来就是某些版本库事件触发的程序,根据钩子的输出或者是返回状态,钩子程序能以某种方式控制该动作继续执行,停止或者是挂起、开启。
钩子脚本的目录:
常用的钩子脚本:
post-commit、pre-commit、start-commit
1.post-commit:在提交完成成功创建版本之后执行这个钩子,提交已经完成,不可以更改,因此本脚本的返回值会被忽略,提交完成时触发事务。
2.pre-commit:提交完成客户端触发执行该脚本。
3.start-commit:在客户端还没有向服务器提交数据之前,即还没有建立Subversiontransation(缩写为TXN)之前,执行该脚本(提交前触发事务)。
不常用的钩子脚本:
1.pre-revprop-change属性之前,执行该脚本。
2.post-revprop-change属性之后,执行该脚本。因为修改稿已经完成,不可更改,因此本脚本的返回值会被忽略(不过实际上的实现似乎是该脚本的正确执行与否影响属性修改)。
3.pre-unlock对文件进行解锁操作之前执行的脚本。
4.post-unlock对文件进行加锁操作之前执行该脚本。
5.pre-lock对文件加锁操作之前执行该脚本。
6.post-lock对文件进行加锁操作之后执行该脚本。
pre-commit用来限制文件扩展名及大小,控制提交要输入的信息。
post-commit是在SVN更新时自动通知。SVN触发check out程序,然后实时rsync推送到服务器。
Can’t convert string from ‘UTF-8’ to nativeencoding :...
说明文件名称或文件夹名称存在中文,Linux不支持中文。
[root@node0 ~]# mkdir-p /app/svndata /app/svnpwd #创建数据和密码目录
[root@node0 ~]# yuminstall subversion -y #安装SVN软件
[root@node0 ~]#svnserve -d -r /app/svndata/ #启动SVN软件
[root@node0 ~]#netstat -tunlap | grep svn
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 1993/svnserve
[root@node0 ~]#svnadmin create /app/svndata/code #创建项目
[root@node0 ~]# cd/app/svndata/code/
[root@node0 code]# cphooks/post-commit.tmpl hooks/post-commit #修改脚本
[root@node0 code]#more /app/svndata/code/hooks/post-commit # 脚本代码,实现自动部署代码
REPOS="$1"
REV="$2"
export LC_CTYPE="en_US.UTF-8"
export LC_ALL
LOGPATH="/app/log"
[ ! -d ${LOGPATH} ] && ${LOGPATH}-p
svn update --username user0--password=user0123 /app/web/data
if[ $? -eq 0 ];then
rsync -az -delete /app/web/data /tmp/
Fi
[root@node0 ~]# cp/app/svndata/code/hooks/pre-commit.tmpl /app/svndata/code/hooks/pre-commit #修改脚本
[root@node0 ~]# vim/app/svndata/code/hooks/pre-commit
1#!/bin/sh
2REPOS="$1"
3TXN="$2"
4MAX_SIZE=5000
5FILTER=‘\.(zip|rar|o|7z|obj|tar|gz|tgz)$‘
6 #LOGMSG=`svnlook log -t "$TXN" "$REPOS" | grep"[a-zA-Z0-9]" | wc -c`
7LOGMSG=`svnlook log -t "$TXN" "$REPOS" | wc -c`
8if [ "$MSGLOG" -lt 9 ]
9then
10 echo -e "nLog message can not ne empty,you must input more than 8chars as commit." 1>$2
11exit 1
12fi
13
14files=$(svnlook changed -t $TXN $REPOS | cut -d " " -f 4-)
15rc=0
16echo "$files" | while read f;
17do
18if echo $f|tr A-Z a-z|grep -Eq #FILTER;
19then
20 echo "File $f is not allow ($FILTER) file" >$2
21 exit 1;
22fi
23
24filesize=`svnlook cat -t "$TXN" "$REPOS" "$f" |wc -c`
25if [ "$filesize" -gt "$MAX_SIZE" ];
26then
27 echo "File $f is too large(must <=$MAX_SIZE) B" >&2
28 exit 1
29fi
[root@node0 code]#chmod 755 /app/svndata/code/hooks/* #修改执行权限
[root@node0 code]#mkdir -p /app/web/data #创建Web服务器目录
[root@node0 code]#mkdir /svnpro
[root@node0 code]# cp/app/svndata/code/conf/* /app/svnpwd/ #修改配置文件
[root@node0 code]#chmod 700 /app/svnpwd/* #修改配置文件权限
[root@node0 code]# ll/app/svnpwd/
总用量 12K
-rwx------ 1 root root 1.1K 11月 8 03:46 authz
-rwx------ 1 root root 309 11月 8 03:46 passwd
-rwx------ 1 root root 2.3K 11月 8 03:46 svnserve.conf
[root@node0 code]#vim /app/svnpwd/svnserve.conf
[root@node0 code]#grep -Ev ‘^$|^#‘ /app/svnpwd/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = /app/svnpwd/passwd
authz-db = /app/svnpwd/authz
[sasl]
[root@node0 code]#vim /app/svnpwd/authz
33[repos:/code/]
34user0 = rw
[root@node0 code]#vim /app/svnpwd/passwd
6[users]
7user0 = user0123
[root@node0 code]#netstat -tunalp | grep svn
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 1993/svnserve
[root@node0 code]#kill 1993
[root@node0 code]#netstat -tunalp | grep svn
[root@node0 code]#svnserve -d -r /app/svndata/
[root@node0 code]#netstat -tunalp | grep svn
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 25227/svnserve
[root@node0 code]#svn co svn://192.168.10.2/code/ /svnpro/ --username=user0 --password=user0123
取出版本 0。
[root@node0 code]#svn commit /svnpro/ -m "first"
[root@node0 code]#svn ls svn://192.168.10.2/code/ --username=user0 --password=user0123
小型企业现状:
小型公司一般只有几个开发人员,并且网站核心程序大多是PHP语言开发的,为了方便,会直接通过FTP直接上传程序代码到线上服务器,随时随地上线更新。
问题和特点:
1.发布快,及时,随时随地就可以发布代码。
2.开发人员发布的代码不经过测试人员测试,并且用户访问页面刷新后页面就会改变,也可能刷新瞬间程序在更新,导致无法访问,用户对网站的体验度较差。
3.中小公司网站出了问题一般是运维人员的问题,但是这种情况下一般是由于开发人员或程序代码异常造成的。
建议:
1.开发人员需要在PC上搭建LAML环境测试,并且在IDC机房或者是办公室测试通过,最好有专职测试人员。
2.程序代码上线规定时间,看网站业务性质决定。
3.代码上传之前进行备份,方便网站回滚。先传输到版本目录,使用软连接链接到业务目录。
4.使运维人员管理业务上线。
Java代码更新具体思想:
上线的时候一般是大型服务器集群环境,同时需要更新或者是分批更新。
1.本地开发人员从SVN中取出代码,当天上线的提交到trunk,否则,长期项目单独开一个分之开发,然后合并到主线(trunk)。
2.办公内网开发测试时,有开发人员或配置管理员通过部署平台jenkins实现统一部署,也就是在部署平台控制开发机器从SVN服务器取出代码,编译,打包,发布到机器。
3.开发人员通知或者是和测试人员一起测试程序,没有问题后,打上新的tag标记。
4.配置管理员根据上一步的tag标记,检出上线代码,并配置好IDC测试环境的所有配置,执行编译,打包(Java需要使用MVN或ANT,PHP不需要),然后发布到IDC内统一分发服务器,这里需要注意的是,不同的环境的配置文件是随着代码同事发布的。
5.配置管理员或者是SA上线人员,把分发的程序代码内容推送到相关的测试服务器,然后通知开发人员及测试人员进行测试。如果有问题向上回滚,继续修改。
6.如果测试没有问题,继续打好tag标记,此时配置管理员根据上一步的标记检出测试好的代码,并配置好IDC正式环境的所有配置,执行编译打包(MVN,ANT,PHP不需要),然后发布代码到IDC内的统一分发服务器,准备批量发布。
7.配置管理员或者是SA上线人员,把分发内容推送到相关正式服务器。然后通知开发人员和测试人员进行测试,如果有问题直接发布回滚指令。
8.IDC正式上线的过程对于Java程序可以是分为A、B组上线的思路,即平滑下线一部分,然后分布代码更新测试,无问题后挂上服务器,同时平滑下线另一部分,发布代码更新测试,或者直接发布上线。
PHP代码更新具体思想:
对于PHP代码的上线,发布代码的时候可以发布到正式上线的临时目录,然后使用移动或者是软连接发布到上线目录,不需要重启HTTP服务。Sina和Ganji的上线方法。
Java代码的上线操作:
对于上线方法,较大的公司需要分组平滑上线,首先在负载均衡器上下线一半服务器,进行代码更新,然后重启服务器进行测试,无问题后上线更新后的服务器并下线另一半服务器进行更新。如果前端有DNS智能解析,上线还可以分地区进行,逐渐普及到全国,这个成为灰度分布。
对于门户网站或者重视规范或者开发能力比较强的公司也许结合系统服务和Web界面来更科学的自动进行上线代码管理。
业务变更管理平台的优点:
1.变更管理制度有利于业务稳定。
2.保留变更业务的历史,便于核查发现业务问题。
3.故障跟踪平台,有利于跟踪服务问题的解决进度。
4.相关常用的软件:
Jira:用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪、敏捷管理等领域。
Mantis:一款PHP开源Bug跟踪系统,比较适合中小型项目的管理和跟踪。具有多特性包括易于安装、易于操作、基于Web、支持任何可运行的PHP平台(Windows、Linux、Mac、Solaris、AS400/i5等),已经被f翻译成68种语言,支持多个项目,为每一个项目设置不同的用户访问级别,跟踪缺陷变更历史,定制视图页面,提供全文搜索功能,内置生成报表功能,包括图形报表,通过Email报告缺陷,用户可以监视特殊的Bug。附件可以保存在Web服务器上或者是数据库中(也可以是FTP服务器),自定义缺陷处理工作流,支持输出格式包括CVS/MSExcel/MSWord/,集成源代码控制(SVN与CVS),集成WiKi知识库与聊天工具,支持多种数据库(MySQL/MSSQL/PostgreSQL/Oracle/DB2),提供WebService(SOAP)接口,提供Wep访问。
即日起执行,请所有员工仔细阅读,各个组长及其他复杂人推进执行。
请开发人员严格按照本流程,出去XXX项目之外的所有项目。
要点:
1.大于2天的项目要架构组参与设计评审。
2.有数据库变动的项目需要DBA参与设计评审。
3.项目负责制,由负责人随时发Email进行通知。
4.有数据库变更的上线,需要签订上线单,由DBA进行签字确认执行。
数据库库变更申请单:
本文出自 “许俊杰” 博客,请务必保留此出处http://xvjunjie.blog.51cto.com/12360960/1981832
原文:http://xvjunjie.blog.51cto.com/12360960/1981832