自己几乎经历了部署演进的所有阶段,手动部署、自动部署,部署到服务器、部署到容器。我们也在不断演进并追赶行业前沿的技术/理念。保守估计今年可以基本追赶到行业前沿的最低水平。
工作中经历了部署语言的多样化,部署目标的演化/进化,有最最原始的手动复制,也有还算前沿的 Docker,总结起来,大致经历了以下的阶段, - 单一开发语言部署单一操作系统 - 多开发语言部署单一操作系统 - 多开发部署多操作系统 - 服务器部署 - 容器化部署
单一开发语言部署单一操作系统
当时所使用的开发语言为 http://asp.net的 mvc 单体应用, 这就决定了使用的服务器必须是 Windows 操作系统的服务器(基于 mono 也可以用于 linux)。项目也属于刚刚起步,应用也比较少,需要的服务器也很少。这个时候,几乎所有的发布就是手动编译、手动部署(CV 操作)。这个时候最大的问题就是部署效率很低,但是因为应用很少,所以效率的高低并无明显感知。 多开发语言部署单一操作系统
公司在发展,业务在推进,为了能够让更多的人协同工作,发挥不同语言的的优势,采用了前后端分离的开发方式。后端采用 http://asp.netweb api + 前端 nodejs。nodejs 可以直接部署到 IIS,所以服务器还是采用 windows 操作系统(其实性能也没有网上喷的那么差,性能也挺好的)。发布的任务也越来越重,采用 Jenkins 解决手动发布的问题。在 windows 操作系统上安装了 Jenkins,毕竟 windows 操作系统,操作相对容易一些。 多开发部署多操作系统
服务器部署
随着微软推出了跨平台的 .net core 并且推出正式版本,任何一个做技术的同学都有一种对追求新技术的癖好,我们也开始跃跃欲试,对他虎视眈眈。既然是一门跨平台的语言,如果不用跨平台部署那就失去他的意义了。当然,并不是为了跨平台而跨平台,主要是希望通过跨平台的过渡能更加靠近前沿/流行的技术。容器化部署
Docker 是现在最主流的容器引擎。但是对现有的项目来说,存在一个无法忽视的问题, Windows 操作系统无法对 linux 镜像做操作(pull、build、run 等等),Linux 操作系统也无法对 Windows 镜像做操作。这就导致,开始在 windows 操作系统上安装的 Jenkins 不能满足现在的需求。需要安装多个 Jenkins 才能可以解决,但也势必带来一定运维和沟通成本。最后通过更深入的了解 Jenkins,发现他提供了 Jenkins Master + Node 的方式,Node 可使用不同的操作系统,几乎完美解决了不同操作系统编译和沟通成本的问题。
.net core 确实发展很快,不断的迭代,每个一个新的稳定版本都有很多新功能同时也修复一些 Bug。出了新的版本就代表旧的版本会在将来的某个时间点停止维护,我们只能选择在合适的时机升级版本。升级代码版本,只要不到一秒钟就说完了,开发团队就至少要花几天的时间开发和测试,DevOps 的团队就需要花更长的时间准备环境,以及保证服务器环境不出现兼容性问题。 兼容性问题? 不是已经使用 Docker 了么,每一个 image 都是单独的环境,哪里来的兼容性问题?兼容性问题来自于 Jenkins 的编译上,怎么做到一个语言多个版本编译的问题?我们已经采用了 node 编译的方式,使用更多不同的 node 啊!也可以用环境变量指定使用哪一个版本啊!
如果我现在不是 DevOps 职位是个开发职位的话,也觉着这样完全没问题。对于 DevOps 来说,这个方式的维护成本和沟通成本太高了。这只能最为保底的、最坏的解决方案。Docker 给出了解决方案multi-stage builds
,他几乎完美的解决了这个问题,中间 stage 产生的 image 不会被提交到 repository。不用再担心任何语言有任何版本的变化,也不担心有多少个版本。
最后还有一个问题没解决,由于使用 Docker 编译,中间的 stage 并不会保留,导致每次都要拉取(mvn、nuget、npm)引用的包/代码编译不够快(敏捷)。
希望你留下你对这个问题的思路/方案。