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

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

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

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

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

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

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

最简单的方法 写个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 软链切换版本与回滚

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

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

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

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

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

3周前 评论

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

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

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

3周前 评论

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

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

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

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

3周前 评论

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

3周前 评论

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