分享一个生产环境中利用SVN上线代码的脚本

本文讲述的是利用SVN+RSYNC上线代码的生产案例,适用于小型公司及企业,让运维从频繁的上线代码中解脱出来。以下对应的web服务器也适用于Windows服务器及Linux服务器

REPOS="$1"
REV="$2"
export LANG=zh_CN.UTF-8
export RSYNC_PASSWORD=RSYNC_PASSWORD
RSYNC_USER=RSYNC_USER

PROJECT_NAME=`basename $REPOS`

SVN_DIR=/svndata/project/${PROJECT_NAME}/
WEB_DIR=/app/${PROJECT_NAME}/

HOST_CONF="/svndata/conf/host/${PROJECT_NAME}"
EXCLUDE_CONF="/svndata/conf/exclude/${PROJECT_NAME}.txt"

if [ ! -d $WEB_DIR ];then
mkdir -p $WEB_DIR
/usr/bin/svn checkout file://$SVN_DIR $WEB_DIR
else
/usr/bin/svn update $WEB_DIR
fi

test -f $HOST_CONF || exit 3

DEV_VERSION=`/usr/bin/svnlook changed $SVN_DIR|grep "dev"|awk ‘{print $2}‘|awk -F‘/‘ ‘{print $2}‘|head -n1`
if [ $DEV_VERSION ];then
        for HOST in `cat $HOST_CONF|sed ‘s/^[ \t]*//g‘|grep -v ‘^#‘|grep ‘dev:‘|awk -F‘:‘ ‘{print $2}‘`
        do
        /usr/bin/rsync -rvzP --delete --port=873 --exclude=‘.svn/‘  $WEB_DIR/dev/  [email protected]${HOST}::${PROJECT_NAME} >>/tmp/dev_${PROJECT_NAME}_`date +%Y%m%d`.log
        done
fi
tags_check=`/usr/bin/svnlook changed $SVN_DIR|grep ‘tags‘|awk ‘{print $1}‘|grep -E "A|U" |wc -l`
if [ $tags_check -ne 0 ];then
        TAGS_VERSION=`/usr/bin/svnlook changed $SVN_DIR|grep "tags"|awk ‘{print $2}‘|awk -F‘/‘ ‘{print $2}‘|head -n1`
        TAGS_SIZE=`du -s $WEB_DIR/tags/${TAGS_VERSION}|awk ‘{print $1}‘`
        if [ $TAGS_VERSION ] && [ $TAGS_SIZE -gt 20 ];then

        for HOST in `cat $HOST_CONF|sed ‘s/^[ \t]*//g‘|grep -v ‘^#‘|grep ‘tags:‘|awk -F‘:‘ ‘{print $2}‘`
        do
        echo "`date +%Y-%m-%d_%H:%M:%S` start to sync $PROJECT_NAME to ${HOST} WebServer ">>/tmp/tags_${PROJECT_NAME}_`date +%Y%m%d`.log
        /usr/bin/rsync -rvzP --delete --port=873 --exclude-from=${EXCLUDE_CONF}  $WEB_DIR/tags/${TAGS_VERSION}/ [email protected]${HOST}::${PROJECT_NAME} >>/tmp/tags_${PROJECT_NAME}_`date +%Y%m%d`.log
        echo "sync end to ${HOST}">>/tmp/tags_${PROJECT_NAME}_`date +%Y%m%d`.log
        done

        echo "###`date +%Y-%m-%d_%H:%M:%S`###############################################">>/tmp/tags_${PROJECT_NAME}_`date +%Y%m%d`.log
        fi
fi

unset RSYNC_PASSWORD
exit 0

主机配置文件HOST_CONF

dev:192.168.2.21
tags:192.168.2.30
tags:192.168.2.30

#dev只有一个

#tags可以有多个

排除文件EXCLUDE_CONF

.svn/
check_chk.html
index.html

可以实现某些文件不做同步,如生成的缓存及上传的图片等等

流程说下:

项目下面有2个文件夹,SVN判断提交的文件夹目录来判断同步的是测试服务器还是生产服务器

dev

tags

2个目录

开发人员将在本机测试好的程序提交到dev目录,程序自动同步到测试服务器进行测试。

由测试人员,测试OK后,将应用程序增量或者全量上线到生产服务器

增量上线:

比如开发在dev下增加或者修改了a.php文件,现在只需要将此文件放到最近的一个tags/{版本号}/对应的目录下面即可

全量上线:

只需要利用svn的新建分支功能即可,分支的路径为/dev/{自定义版本号},即可实现全量上线

回滚:

利用svn找回上一版本,然后覆盖提交即可

如有问题,不吝赐教!

时间: 2024-08-25 23:46:15

分享一个生产环境中利用SVN上线代码的脚本的相关文章

在生产环境中安全执行更新删除SQL脚本的技巧

今天在生产环境上解决问题,由于广发银行的管理制度是开发公司是不允许确生产环境的,所以我们只能把要更新的语句发给运营中心,由运营中心的投产人员执行,我们则在旁边看着:在他执行的时候发现了一个很有趣的技巧,现在分享出来. 我们知道每一次在生产环境中执行中执行更新删除语句的时候都要格外小心,要做好数据备份,但是即便这样对于一个做了分库分表设计,有十几个G的库来说更新一句SQL后发现忘记写WHERE语句或是语句写错了,恢复备份的成本都是相当高的. 我注意到运营中心的人在拿到我的SQL语句后,把它放到MS

.NET跨平台之旅:在生产环境中上线第一个运行于Linux上的ASP.NET Core站点

2016年7月10日,我们在生产环境中上线了第一个运行于Linux上的ASP.NET Core站点,这是一个简单的提供后端服务的ASP.NET Core Web API站点. 项目是在Windows上用V2015开发的,以self-contained应用部署方式发布到Linux服务器.Linux服务器用的是Ubuntu 14.04,站点通过supervisor以服务方式运行,部署在2台阿里云服务器上,用了1台阿里云内网负载均衡. 虽然是很简单的站点,虽然是很小的一步,但是进入生产环境就意味着对性

Confluence 6 从生产环境中恢复一个测试实例

请参考 Restoring a Test Instance from Production 页面中的内容获得更多完整的说明. 很多 Confluence 的管理员将会使用生产实例运行完整数据和服务的 Confluence 服务器,同时还会设置一个测试实例来测试升级等.在这种情况下,你的 Confluence 可以回运行 2 个不同的版本,而且也是非常常见的.这个文档将会知道你如何拷贝生产环境中的数据到一个测试实例中,同时测试环境的版本和生产环境中的版本还有可能是不同的. 在开始这个操作指南之前,

Dubbo Mesh 在闲鱼生产环境中的落地实践

本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是"借力开源.反哺开源",也讲到了 Service Mesh 在阿里巴巴的发路径将经历以下三大阶段: 撬动做透价值***实现技术换代Dubbo Mesh 在闲鱼生产环境的落地,分享的是以多语言为撬动点的阶段性总结. 文章首发于「QCon」,阿里巴巴中间件授权转载. 闲鱼场景的特点闲鱼采用的编程语言是 Dart,思

生产环境中CentOS7部署NET Core应用程序

NET Core应用程序部署至生产环境中(CentOS7) 阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Core SDK for CentOS7. 部署ASP.NET Core应用程序 配置Nginx 配置守护服务(Supervisor) 这段时间在使用Rabbit RPC重构公司的一套系统(微信相关),而最近相关检验(逻辑测试.压力测试)已经完成,接近部署至线上生产环境从而捣鼓了ASP.NET Core应用程序在CentOS上的部署方案,今天

理解Docker(6):若干企业生产环境中的容器网络方案

本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5)Docker 网络 (6)若干企业生产环境中的容器网络方案 Docker 在早期只有单机上的网络解决方案,在 1.19 版本引入了原生的 overlay 网络解决方案,但是它的性能损耗较大,可能无法适应一些生产环

.NET跨平台之旅:生产环境中第2个跑在Linux上的ASP.NET Core站点

今天我们在生产环境中上线了第2个跑在Linux上的ASP.NET Core站点.这是一个简单的Web API站点,通过命令行的方式调用安装在Linux服务器上的程序完成操作.之前用的是nodejs,现在换成了ASP.NET Core,主要代码如下: var psi = new ProcessStartInfo(command, arguments) { RedirectStandardOutput = true, RedirectStandardInput = true, CreateNoWin

Liu Junqiao:生产环境中shell脚本实例

在生产环境中,我们时常要注意主机的各种硬件状态,如果是规模较大的服务集群zabbix等健康工具当然好用,如果只是一些小规模的服务主机,shell就会表现的更灵活,也更适用,今天就和大家分享一个系统巡检脚本! 1 #!/bin/bash 2 3 function system(){ 4 echo "#########################系统信息#########################" 5 OS_TYPE=`uname` 6 OS_VER=`cat /etc/red

[virtualenv]生产环境中使用virtualenv

virtualenv 对于python开发和部署都是好工具,可以隔离多个python版本和第三方库的版本,这里作者总结了几个常用python服务怎么样结合virtual部署 原文链接 Python 中我最喜欢的东西之一就是可以使用 virtualenv 去创建隔离的环境.非常简单的就可以在不同的项目中部署不同的python类库. 有一个比较棘手的问题就是在生产环境中使用virtualenv 部署几个不同的服务有一些配置上的不同. 于是我就从我的项目中收集了几种不同的服务的不同配置方式. 可以肯定