没有上docker,单服务器持续集成/发布应该怎么做?

目前公司只有2台服务器,一台测试,一台生产,项目使用的laravel6.x,目前看了下现在的发布是用Jenkins做的,Jenkins部署在测试服务器上,发布的做法的在Jenkins服务器上把git的代码拉到临时文件夹上,然后用synchronize插件把代码文件同步到代码服务器上。

这是目前的做法,是之前的同事弄的,现在他要离职了,我感觉这个做法问题还是挺大的。我之前的公司要么是用docker部署,碰不到生产环境,还有非常简陋地使用文件对比工具上传代码的,所以对服务器发布这块不太了解,想知道大家都是怎么做的。

目前感觉有几个问题:
1、单服务器发布是不是一定会有短时间的服务不可用? 代码变更期间,怎么保证程序没有问题?比如代码跑一半引用的文件变了甚至不存在了
2、如果我使用代码更新,然后手动去服务器上git pull会更好更快吗?
3、还是1那个问题,代码更新怎么保证服务不受影响? 特别是只有单服务器的情况吗,难道是部署2个项目,然后去Nginx上手动切换root目录吗?

想看看大家是怎么做的,有什么好的方案可以不吝赐教下

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

当前你们的解决方案已经足够满足要求了

  1. 确认 opcache 是否开启,没开的话生产环境可以开一下,更新代码后重启 php-fpm 或手动重置 opcache 缓存 即可更新代码
  2. Jenkins 这类工具就是为了避免你老去登录服务器的操作的,如果你不在乎,可以手动执行更新
  3. 一般单机情况下直接更新即可,不需要考虑那么多,如果更新内容确实庞大,可考虑暂停服务,设置维护时间,在维护时间内处理好数据库的备份、更新,代码的更新等操作内容
4周前 评论
rookiekong (楼主) 3周前
是阿东啊 (作者) 3周前
是阿东啊 (作者) 3周前
rookiekong (楼主) 3周前
rookiekong (楼主) 3周前
讨论数量: 32

如果我使用代码更新,然后手动去服务器上 git pull 会更好更快吗? :joy: 这就是最优解. 其他的没意义.

4周前 评论

两台服务器那个就好办了。如果是需要编译的语言,那就手动去pull,然后执行编译后部署。如果是不需要编译的语言,在测试服务器那就写个钩子(或者有现成的工具同步代码),只要代码提交就同步。

如果是生产环境,那还是需要手动去做,测试服务器可以瞎折腾,但是生产环境还是人去干预比较保险。至于怎么在代码更新的时候保证可用,那就是工作流程的问题了,比如可以设置一个开关或者配置,所有的请求都跳转到维护页面,然后去更新,或者选择用户较少的时候直接更新。

4周前 评论
dividez

我们之前 采用sync的时候,是在访问低谷期的时候,把 nginx 关闭的,然后 sync 过去代码,再启动 nginx。后来采用docker以后依然是 关闭服务,再更新,启动服务。目前2台服务 没有办法做到 蓝 绿 部署, 可以采用k8s 全自动

4周前 评论
dividez (作者) 4周前
rookiekong (楼主) 4周前
dividez (作者) 4周前

2 台服务器, 手动 + git (自建或 gieee) 部署

4周前 评论
陈先生

deployer 了解一下

4周前 评论
yyy123456 4周前
yyy123456 4周前

最简单的方法 写个shell脚本来检查Git仓库是否有新的提交,如果有,则执行git pull命令来更新

4周前 评论
sanders

php-fpm 的话本身就是热更新,除非你改配置需要重启 php-fpm。我们10多年前都用 rsync 更新多台服务器代码的。

切root目录我没明白楼主想怎么搞,传统集群的搞法是两台服务器,新服务器更新并启动后通过负载均衡将流量切过去。只不过这个过程现在被k8s容器化了。

老项目部署流程改造可以看看团队有没有预算,我最近也在思考这类问题,如果不能将项目隐藏的运维成本显现出来,老板总以为功能上线后运维不花钱似的。

4周前 评论
rookiekong (楼主) 4周前
rookiekong (楼主) 4周前
sanders (作者) 4周前

我之前是 Gitlab CI/CD + Deployer 的方案,可以参考我的这篇博客《DevOps 之 Laravel 基于分支的多环境部署》

测试环境不需要多分支的话删除对应的配置即可!

4周前 评论
Rytia

基于楼主现有机制(文件发布)的话,vendor 目录是如何处理的

1、是否先构建完,再把构建完成的文件进行“包发布”会更合理?

2、关于新旧版本的问题,是不是可以直接在生产服务器保留多个版本(通过目录区分),通过 linux 软链切换版本与回滚

4周前 评论
rookiekong (楼主) 4周前
skarner

要想停机影响的时间尽可能缩短,应该使用OP的第三个方案(蓝绿发布)

虽然是单机,但是分2个目录,另外一个目录把composer对应的包安装完、缓存之类的处理好之后

再将Nginx解析到这个目录,nginx -s reload 即可

当然这个过程,可以是人工手动的,也可以借助CI/CD工具

4周前 评论

当前你们的解决方案已经足够满足要求了

  1. 确认 opcache 是否开启,没开的话生产环境可以开一下,更新代码后重启 php-fpm 或手动重置 opcache 缓存 即可更新代码
  2. Jenkins 这类工具就是为了避免你老去登录服务器的操作的,如果你不在乎,可以手动执行更新
  3. 一般单机情况下直接更新即可,不需要考虑那么多,如果更新内容确实庞大,可考虑暂停服务,设置维护时间,在维护时间内处理好数据库的备份、更新,代码的更新等操作内容
4周前 评论
rookiekong (楼主) 3周前
是阿东啊 (作者) 3周前
是阿东啊 (作者) 3周前
rookiekong (楼主) 3周前
rookiekong (楼主) 3周前

单台服务器 很简单的散 webhook + 绿蓝部署 自己写个脚本就行了

4周前 评论

jenkins + 部署脚本就完全够用,即便是集群也完全够用。部署脚本其实没什么难度,只是需要你对git+linux命令要熟悉,我之前写过自动打包(支持全量和增量)+部署+回滚,关键是你要手撸一遍,如果不想写,也可以用这个工具。

博客:简单轻松部署你的项目 - Deployer

3周前 评论
rookiekong (楼主) 3周前

原有容器不变的情况下,用新代码起个容器,队列、迁移等执行完成后,停用原来的容器

3周前 评论

话说fpm是不是本身就支持平滑重启的

3周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!