技术解析

求教系统上线代码,回滚操作,除了 rsync 还有什么技术可以实现
0
2021-07-02 16:01:45
idczone
业务场景:
上线 web 代码,是用 svn 作为版本管理,目前我的正常流程是在代码目录执行 svn 操作,再在代码目录执行 rsync 同步到生产代码目录。但是领导指出 rsync 会丢文件,不是 100%可靠,必须换另一套方案。如果换成在代码目录执行 svn 信息,把操作信息记录下来,然后写 shell 移动文件的话,替换文件可行,但是 svn 的删除文件什么的,实在麻烦,请教各位,有什么可行性的操作方法么?
git 建个发布分支 jenkins 监控发布分支 并执行测试、编译、部署操作

docker 。。

Capistrano

区分操作机和线上机,提供个思路哈:
1. 代码检出。操作机上一个项目的代码目录,每次检出到这个目录。
2. 代码传输。由检出目录打包,将打包目录传输至线上机。
3. 代码部署。解压缩代码打包至一哈希目录,线上代码目录软链至该哈希目录。
4. 代码回滚。线上代码目录软链至要回滚到的哈希目录。

ruby 用 Capistrano
发布代码这种,你服务器上肯定要保存每次发布的版本,使用软连接来指向正在使用的版本:
release_v1
release_v2
release_v3
release -> 在用的版本

Jenkins 你值得拥有,部署简单( yum install )配置容易

专业运维路过.
把代码包打包成 tgz 文件.计算出 md5 值.
线上机器分发 tgz 文件和保存 md5 值的文件. 重新计算 tgz 的 md5 值,和文件中的 md5 值做匹配.
如果一致, 替换老的代码目录..
目前 BAT 都是这么做的

直接停机替换的??是不是状态无关的业务?

编译机编译打包 -> 生产机备份 web 目录、部署 tar 包 -> 回滚

我现在也是使用 svn+rsync ,但从没有遇到过文件会丢失这种问题,
可能是你的源服务器没有文件,从服务器有的文件,一但同步了,那么从服务器有的文件会被删除,
如果是从服务器有数据上传(比如图片),那么可以设置同步源服务器时,排除掉图片的目录啊
源服务器一般只是 svn 的,不会有正式服务器的完整数据,
这时就要排除不需要同步的目录 或者 同步时不删除文件

让你们领导说清楚 rsync 为什么会丢文件,简直拍脑袋

rsync 丢文件? 我们一个月发这么多文件,都没丢过。
$ cat /data1/logs/rsyncd.log.d/2016-06* |grep -w send |wc -l
284712

问题的关键不是丢文件,而是如何确定部署的结果与预期一致,计算文件 hash 就是一个办法。当然,前面也有人说了,同步后的结果与源文件一致,但是并不符合期望也是有可能的,这大概就是你们领导说的“丢文件”了。还是从调整同步策略和如何校验部署结果入手比较好。

上面有些回复说是 tar 包然后直接回滚,这是每次更新都是一个新的 web 目录么?如果只是更新一些 css 文件,也直接新目录,我这 web 目录都要好几个 G ,感觉不是很科学啊

jenkins 好用。

囧,人家 web 框架也分 MVT , MVC , MVP 之类的,你更新上也用同样的思路就好了。将静态资源 /模板与动态代码的更新分离解耦就好了。

zfs snapshot

应用文件手工复制一份在服务器上面!

capistrano +1

git 呗,再用 jenkins 调度下,购简单

git pull
git reset --hard HEAD^

jenkis

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服