博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于同步的半自动化发布方式
阅读量:4317 次
发布时间:2019-06-06

本文共 4608 字,大约阅读时间需要 15 分钟。

  说到生产代码发布,每个公司不同的语言或者相同语言业务的流程不一样,发布方式有很多不同。笔者从事过两个行业,分别是游戏行业和金融,由于经验很短所以还有很多东西没有学到位,在这里只能用自己学到的东西来尽量减少由于自己操作失误带来的发布影响。下面讲一下我的思路:

在这里我要讲一下由于我们的后端是基于spring cloud的java项目,是目前比较火的基于微服务架构开发的,所以每个项目都相对比较小,很多lib包只同步一次基本不会改,除了会改几个公共common包。我们大概有20个项目

  首先我是基于rsync+inotify实时同步的方式来同步代码,这里有两种方式来做同步,第一种就是第一次同步所有代码,第二种就是同步修改的代码,由于我们代码都是基于jar包的形式,所以我选择了第二种,再者是因为不想直接同步到生产项目所在的路径下面。我是把同步的jar包放到一个指定目录下面,然后需要发布的时候再去执行那台机器上的脚本,或者也可以全部机器都执行,当然为了保证线上业务的可用性,我们应该在发布代码的之前需要将要发布的节点从nginx upstream里面拿出来,但是由于很多原因主要是权限的问题,现在这里就没有考虑这种情况,所以我们的发布总对用户来说还不是很友好,anyway,我要讲的重点不是这个。下面是rsync服务器后来一直运行的脚本,

#!/bin/bashinotify_rsync_fun (){dir=`echo $1 | awk -F"," '{print $1}'`ip=`echo $1 | awk -F"," '{print $2}'`des=`echo $1 | awk -F"," '{print $3}'`user=`echo $1 | awk -F"," '{print $4}'` /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib ${
dir} |while read DATE TIME DIR FILEdoFILECHAGE=${DIR}${FILE}/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.password ${
dir} ${user}@${ip}::${des} >> /tmp/rsyncd.logecho "At ${TIME} on ${DATE}, file $FILECHAGE was backed up via rsync" >> /tmp/rsyncd.logdone}count=28# localdir,host,rsync_module,user of rsync_module,sync1="/home/ops/update/应用名称目录,ip,activity,rsync_backup"sync2="/home/ops/update/应用名称目录,ip,activity,rsync_backup"sync3="/home/ops/update/应用名称目录,ip,pdms,rsync_backup"sync4="/home/ops/update/应用名称目录,ip,pdms,rsync_backup"sync5="/home/ops/update/应用名称目录,ip,pdms,rsync_backup"sync6="/home/ops/update/应用名称目录,ip,apply,rsync_backup"sync7="/home/ops/update/应用名称目录,ip,apply,rsync_backup"sync8="/home/ops/update/应用名称目录,ip,apply,rsync_backup"sync9="/home/ops/update/应用名称目录,ip,apply,rsync_backup"sync10="/home/ops/update/应用名称目录,ip,config,rsync_backup"sync11="/home/ops/update/应用名称目录,ip,config,rsync_backup"sync12="/home/ops/update/应用名称目录,ip,config,rsync_backup"sync14="/home/ops/update/应用名称目录,ip.128,gateway,rsync_backup"sync15="/home/ops/update/应用名称目录,ip.129,gateway,rsync_backup"sync16="/home/ops/update/应用名称目录,ip.130,gateway,rsync_backup"sync17="/home/ops/update/应用名称目录,ip,gateway,rsync_backup"sync18="/home/ops/update/应用名称目录,ip,gateway,rsync_backup"sync19="/home/ops/update/应用名称目录,ip,gateway,rsync_backup"sync20="/home/ops/update/应用名称目录,ip,gateway,rsync_backup"sync21="/home/ops/update/应用名称目录,ip,gateway,rsync_backup"sync22="/home/ops/update/应用名称目录,ip,quartz,rsync_backup"sync23="/home/ops/update/应用名称目录,ip,quartz,rsync_backup"sync24="/home/ops/update/应用名称目录,ip,sms,rsync_backup"sync25="/home/ops/update/应用名称目录,ip,sms,rsync_backup"sync26="/home/ops/update/应用名称目录,ip,smsquartz,rsync_backup"sync27="/home/ops/update/应用名称目录,ip,smsquartz,rsync_backup"sync28="/home/ops/update/应用名称目录,ip,smsquartz,rsync_backup"##############################################################maini=0while [ ${i} -lt ${count} ]doi=`expr ${i} + 1`tmp="sync"$ieval "sync=\$$tmp"inotify_rsync_fun "$sync" &done

 

 由于这是用shell写的脚本,所以没有多线程的概念,之后我会尝试将这个脚本改成python的threading多线程去运行

根据以上可以知道,我们需要发布的机器只需去同步上面脚本所在服务器跟自己对应项目的目录即可,因为项目很小的原因,所以同步基本都是秒级的,我们运维人员只需将需要发布的项目内容放到对应目录下面即可,由于rsync客户端会一直开着,inotify是基于系统内核事件驱动的,所以很快就会触发,客户端随即更新代码。

我会将客户端代码更新到统一的路径下:/home/ops/update,如果是客户端只有一个应用的我们只需执行一个update.sh的脚本,脚本会创建备份目录和更新线上应用代码以及自动重启和打印启动日志。当客户端跑了多个应用,我们需要更新多个一致全部应用或者全部应用的时候,由于我们发布会有一些公共包发布,也就是lib下面的,所以这里我分了两个脚本,一个是common.sh和update.sh。首先我们需要先发布公共包,也就是先执行common.sh,common.sh会打印需要更新的项目(也就是哪些项目需要发布公共lib),我们只要输入项目名称即可(我会打印在屏幕上,只要复制就可以),更新完成之后,我们再去更新应用代码(执行update.sh),随即更新完成只需输入需要重启应用名称即可,当需要发布所有项目的时候,那就很简单了,我们执行一个update_all.sh的脚本即可全部发布,下面是脚本内容,很简单,仅供参考:

common.sh内容:

#!/bin/bashdatetime=$(date +%Y%m%d)back_dir=/backup/${datetime}if [ ! -d ${back_dir} ];thenmkdir ${back_dir}echo "备份目录${back_dir}创建成功"ficat <
/dev/nullif [ $? -eq 0 ];thenecho "${list1} 中的 ${acfile} 包已经是最新的"elif [ -f /home/ops/update/pdms/common/$acfile ];thenmv ${list1} ${back_dir}cp /home/ops/update/pdms/common/$acfile $list1if [ $? -eq 0 ];thenecho "$acfile 成功更新到 ${list1}"elseecho "$acfile 更新失败至${list1}"fielse"$acfile 不存在"fidonedone
View Code

 

 

update.sh内容:

#!/bin/bashdatetime=$(date +%Y%m%d)back_dir=/backup/${datetime}if [ ! -d ${back_dir} ];thenmkdir ${back_dir}echo "备份目录${back_dir}创建成功"ficd pdmsfor acfile in `ls *.jar`dolist1=`find /opt/platform/ -name $acfile`for acfile1 in $list1dodiff /home/ops/update/pdms/$acfile $acfile1>/dev/nullif [ $? -eq 0 ];thenecho "$acfile1 已经是最新的包"elif [ -f /home/ops/update/pdms/$acfile ];thenmv $acfile1 ${back_dir}cp /home/ops/update/pdms/$acfile $acfile1if [ $? -eq 0 ];thenecho "$acfile 成功更新到 $acfile1"elseecho "$acfile 更新失败"fielseecho "$acfile 不存在"fidonedonecat <

 

转载于:https://www.cnblogs.com/qinghe123/p/8135463.html

你可能感兴趣的文章
前端实现文件的断点续传
查看>>
转:spring4.0之二:@Configuration的使用
查看>>
【Android开发】交互界面布局详解
查看>>
状态机编程思想(1):括号内外字符串统计
查看>>
K-Means聚类和EM算法复习总结
查看>>
[转]Bat脚本处理ftp超强案例解说
查看>>
P3901 数列找不同
查看>>
利用无线网络数据包分析无线网络安全
查看>>
MEMBER REPORT
查看>>
[HAOI2006]受欢迎的牛
查看>>
使用jquery去掉时光轴头尾部的线条
查看>>
算法(转)
查看>>
网络字节顺序
查看>>
复制mueclipse项目到eclipse
查看>>
飞扬的小鸟
查看>>
玩转TypeScript(2) --简单TypeScript类型
查看>>
Asp.net 解析json
查看>>
程序猿崛起3——这一次,我用行动说话
查看>>
201521123038 《Java程序设计》 第一周学习总结
查看>>
每天一个linux命令(20):find命令之exec
查看>>