svn 结合rsync 的代码发布系统

由开发提交到测试环境,经测试,在由运维统一上线。试验需求一台测试服务器,一台线上(生产环境)服务器。测试服务器上跑svn是开发用于代码管理,而线上跑的svn是运维用来代码上线的。结合rsync保持测试端的代码与 svn的线上控制端(线上svn,在测试服务器上的一个workcopy)的代码保持一致。开发结合运维,并由运维周期性的提交代码,如果有问题,回滚,保证线上正常!!

svn服务器上chackout 一个workcopy 在用户端:(注意防火墙)

[[email protected] ~]# svn co svn://192.168.1.35/webtest client_webtest
Authentication realm: <svn://192.168.1.35:3690> 18ab87c6-8455-4174-a313-7b6fd3775a73
Password for ‘root‘:
Authentication realm: <svn://192.168.1.35:3690> 18ab87c6-8455-4174-a313-7b6fd3775a73
Username: svnadmin
Password for ‘svnadmin‘:
Authentication realm: <svn://192.168.1.35:3690> 18ab87c6-8455-4174-a313-7b6fd3775a73
Username: user01
Password for ‘user01‘: 

-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

   <svn://192.168.1.35:3690> 18ab87c6-8455-4174-a313-7b6fd3775a73

can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the ‘store-plaintext-passwords‘ option to either ‘yes‘ or ‘no‘ in
‘/root/.subversion/servers‘.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? yes
A    client_webtest/default.html
A    client_webtest/default1.html
A    client_webtest/k.txt
A    client_webtest/index.html
A    client_webtest/index.php
Checked out revision 40.
[[email protected] ~]# tree client_webtest/
client_webtest/
├── default1.html
├── default.html
├── index.html
├── index.php
└── k.txt

0 directories, 5 files
[[email protected] www]# svn co svn://192.168.1.35/online

上面的一条命令是在网站根目录下check out 个workcopy (online)同时新建一个目录localsvn,同过rsync同步online(除.svn)的所欲文件 到localsvn

[[email protected] www]# ls
authz       index.php  online  phpwind  rsync_test.sh  webtest
index.html  localsvn   passwd  project  svnserve.conf
[[email protected] www]# svn co svn://192.168.1.65/webtest localsvn#从线上的svn服务器上chackout个文化workcopy 并重命名为localsvn 为以后网线上提价代码用

编写svn(测试服务器上) 钩子代码:

[[email protected] hooks]# ls
post-commit               post-unlock.tmpl         pre-unlock.tmpl
post-commit.tmpl          pre-commit.tmpl          start-commit.tmpl
post-lock.tmpl            pre-lock.tmpl
post-revprop-change.tmpl  pre-revprop-change.tmpl
[[email protected] hooks]# pwd
/svn/webtest/hooks
[[email protected] www]# cd /svn/webtest/hooks/
[[email protected] hooks]# vi post-commit
REPOS="$1"
REV="$2"
SVN=/usr/bin/svn
LOCALSVN=/alidata/www/localsvn
WEB=/alidata/www/online
RSYNC=/usr/bin/rsync
LOG=/alidata/log/svn/svn.log
export LANG=en_US.UTF-8
$SVN update $WEB --username user01 --password 123
if [ $? == 0 ];then
echo "" >>$LOG
echo `date` >>$LOG
echo "############################" >>$LOG
$RSYNC -vr --exclude=".svn" --delete $WEB/ $LOCALSVN >>$LOG
fi
#rsync  参数--exclude =".svn" 是除.svn都同步;--delete 删除目标目录的在源目录中不存在的文件,保证目标目录与源目录保持一致(这一点很关键!!)
[[email protected] client_webtest]# pwd
/root/client_webtest
[[email protected] client_webtest]# echo "客服端提交代码到svn服务上">> test.txt
[[email protected] client_webtest]# cat test.txt
客服端提交代码到svn服务上
[[email protected] client_webtest]# svn status
?       test.txt
[[email protected] client_webtest]# svn add test.txt
A  (bin)  test.txt
[[email protected] client_webtest]# svn ci -m "客服端添加文件" test.txt
Adding  (bin)  test.txt
Transmitting file data .
Committed revision 43.
[[email protected] online]# svn status
[[email protected] online]# cat test.txt
客服端提交代码到svn服务上
[[email protected] online]# # 代码成功同步到测试环境
[[email protected] localsvn]# ls
default1.html  default.html  index.html  index.php  test.txt
[[email protected] localsvn]# cat test.txt
客服端提交代码到svn服务上
[[email protected] localsvn]# svn status
?       test.txt
#通过rsync -vr --exclude=".svn" --delete /alidata/www/online/  /alidata/www/localsvn 来实现代码同步

然后根据开发统一上线(可以全部,也可一特定代码上线!!)

[[email protected] client_webtest]# echo "更新代码---》1" >> test.txt
[[email protected] client_webtest]# touch test2.txt #添加新的代码test.txt
[[email protected] client_webtest]# svn status
?       test2.txt
M       test.txt
[[email protected] client_webtest]# svn add test2.txt
A         test2.txt
[[email protected] client_webtest]# svn ci -m "‘更新代码---》1‘>> test.txt 添加新的代码test.txt"
Sending        test.txt
Adding         test2.txt
Transmitting file data ..
Committed revision 44.
[[email protected] online]# pwd
/alidata/www/online
[[email protected] online]# ls
default1.html  default.html  index.html  index.php  test2.txt  test.txt
[[email protected] online]# cat test.txt
客服端提交代码到svn服务上
更新代码---》1
[[email protected] online]# svn status
[[email protected] online]# 代码根新成功!!!
[[email protected] localsvn]# pwd
/alidata/www/localsvn
[[email protected] localsvn]# ls
default1.html  default.html  index.html  index.php  test2.txt  test.txt
[[email protected] localsvn]# cat test.txt
客服端提交代码到svn服务上
更新代码---》1
[[email protected] localsvn]# svn status
?       test2.txt
?       test.txt
#通过rsync同步成功!

验证:目标于源目录文件是否时时同步,包裹删除!

[[email protected] client_webtest]# ls
default1.html  default.html  index.html  index.php  test2.txt  test.txt
[[email protected] client_webtest]# svn status
[[email protected] client_webtest]# ls
default1.html  default.html  index.html  index.php  test2.txt  test.txt
[[email protected] client_webtest]# svn delete test2.txt
D         test2.txt
[[email protected] client_webtest]# svn status
D       test2.txt
[[email protected] client_webtest]# ls
default1.html  default.html  index.html  index.php  test.txt
[[email protected] client_webtest]# svn ci -m "delete test2.txt" test2.txt
Deleting       test2.txt

Committed revision 45.
[[email protected] online]# pwd
/alidata/www/online
[[email protected] online]# ls
default1.html  default.html  index.html  index.php  test.txt
[[email protected] online]# svn status
[[email protected] www]# cd localsvn/
[[email protected] localsvn]# ls
default1.html  default.html  index.html  index.php  test.txt
[[email protected] localsvn]# cat test.txt
客服端提交代码到svn服务上
更新代码---》1
[[email protected] localsvn]# svn status
?       test.txt
[[email protected] client_webtest]# cat test.txt
客服端提交代码到svn服务上
更新代码---》1
[[email protected] client_webtest]# ls
default1.html  default.html  index.html  index.php  test.txt
[[email protected] client_webtest]# svn status
[[email protected] client_webtest]# echo "更新代码----》2" >> test.txt
[[email protected] client_webtest]# svn status
M       test.txt
[[email protected] client_webtest]# svn ci -m "echo‘更新代码----》2‘ >> test.txt "
Sending        test.txt
Transmitting file data .
Committed revision 46.
[[email protected] client_webtest]# svn status
[[email protected] client_webtest]#
[[email protected] online]# pwd
/alidata/www/online
[[email protected] online]# ls
default1.html  default.html  index.html  index.php  test.txt
[[email protected] online]# svn status
[[email protected] online]# cat test.txt
客服端提交代码到svn服务上
更新代码---》1
更新代码----》2
[[email protected] online]#

线上正式环境的svn的钩子脚本:

[[email protected] ~]# cat /svn/webtest/hooks/post-commit

REPOS="$1"
REV="$2"
SVN=/usr/bin/svn
WEB=/alidata/www/webtest
LOG=/alidata/log/svn/svn.log
export LANG=en_US.UTF-8
$SVN update $WEB --username user001 --password 123 >>$LOG
#mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf

(切忌防火墙不果没配的话,可以先关了!)

[[email protected] localsvn]# pwd
/alidata/www/localsvn
[[email protected] localsvn]# ls
default1.html  default.html  index.html  index.php  test.txt
[[email protected] localsvn]# svn status
?       test.txt
[[email protected] localsvn]# cat test.txt
客服端提交代码到svn服务上
更新代码---》1
更新代码----》2
[[email protected] localsvn]# svn add test.txt
A         test.txt
[[email protected] localsvn]# svn ci -m ”定时网线上发布代码“ test.txt
svn: Commit failed (details follow):
svn: Can‘t connect to host ‘192.168.1.65‘: No route to host(因为防火请端口没开)
[[email protected] localsvn]# svn ci -m ”定时网线上发布代码“ test.txt
Adding         test.txt
Transmitting file data .
Committed revision 30.
[[email protected] webtest]# pwd
/alidata/www/webtest
[[email protected] webtest]# ls
default1.html  default.html  index.html  index.php  test.txt  xxxzz.tar  xxzz.zip
[[email protected] webtest]# cat test.txt
客服端提交代码到svn服务上
更新代码---》1
更新代码----》2
[[email protected] webtest]# 上线成功!
[[email protected] client_webtest]# echo "更新-----》3" > test.txt
[[email protected] client_webtest]# svn status
M       test.txt
[[email protected] client_webtest]# cat test.txt
更新-----》3
[[email protected] client_webtest]#
[[email protected] client_webtest]# svn ci -m "echo "更新-----》3" > test.txt "
Sending        test.txt
Transmitting file data .
Committed revision 47.
[[email protected] client_webtest]#
[[email protected] online]# svn status
[[email protected] online]# ls
default1.html  default.html  index.html  index.php  test.txt
[[email protected] online]# cat test.txt
更新-----》3
[[email protected] online]#
[[email protected] localsvn]# pwd
/alidata/www/localsvn
[[email protected] localsvn]# ls
default1.html  default.html  index.html  index.php  test.txt
[[email protected] localsvn]# svn status
M       test.txt
[[email protected] localsvn]# cat test.txt
更新-----》3
[[email protected] localsvn]#
[[email protected] localsvn]# svn ci -m "更新-----》3 test.txt" test.txt
Sending        test.txt
Transmitting file data .
Committed revision 31.
[[email protected] localsvn]#
[[email protected] webtest]# cat test.txt
更新-----》3
[[email protected] webtest]#

回滚代码:

[[email protected] localsvn]# svn  diff -r 31:30
Index: test.txt
===================================================================
--- test.txt	(revision 31)
+++ test.txt	(revision 30)
@@ -1 +1,3 @@
-更新-----》3
+客服端提交代码到svn服务上
+更新代码---》1
+更新代码----》2
[[email protected] localsvn]# svn diff -r 31:30 test.txt
Index: test.txt
===================================================================
--- test.txt	(revision 31)
+++ test.txt	(revision 30)
@@ -1 +1,3 @@
-更新-----》3
+客服端提交代码到svn服务上
+更新代码---》1
+更新代码----》2
[[email protected] localsvn]# svn -r 31:30 "" test.txt
[[email protected] localsvn]# svn merge -r31:30 ""
svn: Cannot reverse-merge a range from a path‘s own future history; try updating first
[[email protected] localsvn]# svn up
At revision 31.
[[email protected] localsvn]# svn merge -r31:30 ""
--- Reverse-merging r31 into ‘.‘:
U    test.txt
[[email protected] localsvn]# cat test.txt
客服端提交代码到svn服务上
更新代码---》1
更新代码----》2
[[email protected] localsvn]# svn log -v test.txt
------------------------------------------------------------------------
r31 | user001 | 2016-05-19 11:57:52 +0800 (Thu, 19 May 2016) | 1 line
Changed paths:
   M /test.txt

更新-----》3 test.txt
------------------------------------------------------------------------
r30 | user001 | 2016-05-19 11:38:30 +0800 (Thu, 19 May 2016) | 1 line
Changed paths:
   A /test.txt

”定时网线上发布代码“
------------------------------------------------------------------------
[[email protected] localsvn]#
[[email protected] localsvn]# svn ci -m "merge -r31:30" test.txt
Sending        test.txt
Transmitting file data .
Committed revision 32.
[[email protected] webtest]# cat test.txt
客服端提交代码到svn服务上
更新代码---》1
更新代码----》2
[[email protected] webtest]# svn log test.txt
------------------------------------------------------------------------
r32 | user001 | 2016-05-19 13:27:47 +0800 (Thu, 19 May 2016) | 1 line

merge -r31:30
------------------------------------------------------------------------
r31 | user001 | 2016-05-19 11:57:52 +0800 (Thu, 19 May 2016) | 1 line

更新-----》3 test.txt
------------------------------------------------------------------------
r30 | user001 | 2016-05-19 11:38:30 +0800 (Thu, 19 May 2016) | 1 line

”定时网线上发布代码“
------------------------------------------------------------------------
[[email protected] webtest]# 回滚成功!
时间: 2024-11-08 19:31:53

svn 结合rsync 的代码发布系统的相关文章

自动化代码发布系统实现

日常运维问题 在我日常运维工作中,代码发布可能是最普遍的一项工作之一,尤其是网页代码的更新,碎片化发布需求非常频繁.在前期开发人员比较少时,还可以由自己来上服务器通过脚本来发布代码.但随着公司项目的增多,更多的开发人员加入到公司,发布代码需求开始增多,这就占用了我大部分时间,经常的被打断其它工作来发布代码,非常地不爽,然后开始想解决方法. 尝试解决问题 当然,发布代码肯定是运维的职责之一了,但频繁的发布导致运维大部分时间浪费在重复的操作上,非常的不值得.基于此,开始限制代码发布频率,要求把不是很

代码发布系统实现

文章目录 [隐藏] 关于项目开源 日常运维问题 尝试解决问题 最终解决方案 开源技术使用 代码发布流程 最后想说的话 关于项目开源 由于挺多同学请求开源此项目,在这里说明一下:其实本人是想开源的,由于是本人写的第一个运维方面的系统,且写这个项目的时间时间紧,只达到了可以使用的程度,完全没有达到开源的要求,希望理解! 日常运维问题 在我日常运维工作中,代码发布可能是最普遍的一项工作之一,尤其是网页代码的更新,碎片化发布需求非常频繁.在前期开发人员比较少时,还可以由自己 来上服务器通过脚本来发布代码

代码发布系统三

django基于channels完成群聊功能 后端框架不一定默认支持websocket 三步走前期配置 """ http协议还是走 urls.py 与 views.py /index/ index 浏览器地址栏输入网址即可 websocket协议走routing.py 与 consumers.py /chat/ ChatConsumer 借助于js内置对象new WebSocket('ws://127.0.0.1:8080/chat/') """

代码发布系统二

服务端如何给客户端推送消息 轮询(效率低.基本不用) """ 让客户端浏览器定时朝服务端发送请求数据的请求(比如每隔5s一次) 不足之处 消息延迟明显 消耗资源 """ 长轮询(兼容性好.使用较多) """ 服务端给每一个第一次来链接的客户端浏览器创建一个队列,之后客户端浏览器通过ajax朝各自的队列索要数据,如果没有数据会阻塞但是不会一直阻塞(pending),用了timeout加异常处理经过30s自动回去然后再次

【代码发布系统之Ansible初使用】 &#439461;

原文: http://blog.gqylpy.com/gqy/372 "# 下载安装 1.先准备好epel源: wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 2.开始下载安装: yum -y install ansible ansible 命令格式 基本命令格式:ansible [模块] 参数如下 -a MODULE_ARGS 模块参数 -C --check 检查语法 -f FORKS

基于saltstack svn写的一个发布系统

之前写了一个代码发布系统,功能,体验还有待完善,先放截图,想获得源码的,私聊我 1.登录页 2.分组管理页 3.添加项目页 4.项目列表和项目编辑页 5.项目发布回滚页

代码发布

代码发布系统 腾讯(蓝鲸) http://bk.tencent.com Murder(推特)  基于管理工具[capistrano]+比特流[bittornado]                             Ruby                  python 代码发布流程 l 程序员开发 l 合并代码 l 发布 --编译 --非编译 --推送(扩展)到指定服务器  注册事件       在互联网产品的发布过程中也较多采用此种发布方式:产品的发布过程不是一蹴而就,而是逐步扩大使

Linux系统架构师之代码发布解决方案

我今年19了!人生有多少22K? 所有实验环境初始化: 创建本地光盘Yum源,安装tree lrzsz vim,关闭iptables和selinux. 定义别名cls='clear',ll='ls -Alh'. 代码发布解决方案: 1.安装优化软件环境 2.程序代码 3.配置变更 SVN是跨平台的开源版本控制系统.SVN会备份并记录文件每一次的修改更新的变动. SVN是通用的软件系统,常用来管理程序代码.常见的版本控制软件有:VSS.CVS.SVN.Git. Git与SVN的区别: SVN是一个

【牛腩新闻发布系统 一】如何高效写代码

在看牛腩老师讲新闻发布系统的时候,它讲到一个TODO任务,于是就百度了一下VS的任务列表功能,才发现它的功能是如此的强大啊,我们直接就可以在VS中制定任务,完成任务了!还有一些设置模板库的功能,这在无形之中提高了我们编写代码的效率.   1.VS的任务列表查看,可以通过 依次点击:视图--其他窗口--任务列表,或者直接按Ctrl+Alt+K,然后在你代码的下方就可以看到任务列表的内容了.VS的任务列表有两个基本功能:用户任务以及注释. (1)用户任务 我觉得这个用户任务就像是我们平常给自己定的计