小团队前端部署演化之路

前言

前端部署相对来说其实是一件非常容易的事情,无论是最原始的html页面,还是现在热门的三大框架,最后交付部署的时候,始终会是一些静态文件。

虽然简单,但是对于不同的团队来说,都会在不同阶段有最适合他们的方式。

下面老黄聊聊所在团队是怎么演化的。

老黄把它们划分成了3个阶段,每向下一个阶段都是为了解决上一个阶段带来的不可避免的问题。

  1. 刀耕火种时期

  2. CICD半自动化时期

  3. 半无服务器化时期

下面依次来看看这三个阶段的内容。

刀耕火种时期

在加入团队早期,团队只有两个前端,后面才发展到六七个,团队前端的主要技术栈是vue。

每次发版的时候,都是前端同学在自己的电脑打包好相应的部署文件之后,发给某个后端同学,由这个后端同学手动放到服务器上面,早期还都是部署在IIS上面的,和部分后端站点放在同一个服务器。

明眼人应该都可以看的出问题所在,整个部署的流程是比较漫长的,出差的概率也是比较高,毕竟人为参与的环节比较多。

随着项目逐步增多,那个部署前端站点的同学几乎要奔溃的节奏,每个项目都是一天连续发好几个版本,写接口的思路老是被打断。。。

对一个初创团队,人员都不充足的情况,其实这一阶段也是必经之路了吧。

这个时候引入CICD让发布流程略微自动一点点,其实是一个比较合适的时候了,刚好又是解决团队一大痛点的好东西。

老黄这边是采购了3台突发性能的4c4g的服务器。2台用于搭建jenkins,一台用于部署前端站点。

可能有人会问为什么要用突发性能的服务器,成本呀成本呀,这个是最实在的原因。

前端站点有CDN在前面挡着,回源到服务器的很少,这也是为什么敢如此大胆的用突发性能的机器来部署前端站点。

CICD半自动化时期

在这个时期其实就是简化部署操作,各自负责各自的项目。在快速的迭代过程中,前端同学负责自己对应项目的版本发布。

这也是老黄一直在推崇的,自己负责的项目要全权负责,至少该给开发的权限还是要给的。

为什么说是半自动化呢?因为不敢做到一提交代码就发布到测试环境,再发到生产环境,还是要有人为的点一下这个操作。

先来简单看看两张图,是怎么人为点一下的。

测试环境的部署:

生产环境的部署:

这里设置的都是参数化的,构建的时候都是看情况填写的。

拿个例子说明一下。

测试环境的流水线配置

生产环境的流水线配置

两个环境不一样的地方其实就是执行的脚本文件,以及生产环境多了一步刷新CDN的操作。

老黄是给每个不同的项目都编写了对应的脚本文件,每个项目会包含下面的几个文件。

其中Dockerfile就是用来编译源码和把生成的静态文件放到nginx里面。

nginx.config 就是nginx的配置文件了。

run.sh  是用来替换占位符,从而达到一个镜像,通过环境变量的方式去请求不同环境的接口。

buildtest.sh 主要就是打包好镜像,上传到阿里云容器服务,ssh到测试服务器,拉镜像,起容器。

buildprod.sh 主要就是ssh到生产服务器,拉镜像,起容器。

在这一阶段其实一切都是运行正常的,各位前端同学的反应也比较不错。

这里是以镜像的方式交付部署的,每次生成好镜像后都是push到阿里云的容器镜像服务。

这里始终是占着服务器资源,除了要自己维护域名端口的绑定之外,还要受限于阿里云单个负载均衡的域名个数。

前一段时间想在负载均衡里面添加一个新域名的时候,发现了这个无奈的问题。

买多一两个负载均衡是可以解决眼前这个问题的,但是不是长久之计。

所以还是决定走前端部署比较地道的一种方案,往无服务器时代的演进了。

半无服务器化时期

本来是想叫无服务器化时期的,不过想到jenkins还是自建的,所以在前面加了一个半字。

这里是借助阿里云的对象存储来完成的。

这里其实是只对CICD发布的对象调整一下就好了,对前端同学来说是无感知切换的。

buildtest.sh调整如下:

调整之后,交付只能是用文件的方式了,这里是将每次发布之后的文件保存一份到本地,保留最近2个月,当然,这里也可以保存到OSS的另一个bucket上面,不过现阶段似乎不太迫切。

发布之后,文件就会被上传到OSS上面了。

上传之后,还要配置三个地方,才算是真正的完成,这三个配置是一次性的。

首先是基础设置里面的静态页面,设置一下默认首页

其次是在传输管理的域名管理里面绑定域名,证书和CDN在这里是选填的。

最后一步是把域名CNAME到OSS的域名

到这里就已经是完成了最后的部署了,后面发版本的时候,只需要通过jenkins把编译好的静态文件丢到对象存储就可以了。

总结

老黄经历的这三个时期,应该有不少人也会有类似的感觉或经历。

在遇到痛点难点的时候,想办法解决掉就可以了。

对于前端站点的部署,最简单直接的办法的还是直接托管到云上面,可以省掉很多不必要的麻烦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub 全域数字年报:携手推动开源世界的超级协作

2020年1月24日,Wuhan2020开源项目正式发起,在疫情期间累积吸引到了约3000余位技术志愿者以及近1000余位非技术志愿者在线上开展志愿行动与参与。Wuhan2020在成立后的约3个月时间内,通过开源协作的方式在互联网上开展志愿者支持与工作协同&…

leetcode53. 最大子数组和(暴力+贪心)

一:论语 追求利益的同时 我们需要控制度 就好比鹅厂的王者荣耀 赚的盆满钵满 坑坏了多少青少年 但是鹅厂早已经开始控制度了 二:题目 三:上码&#xff08;暴力贪心&#xff09; 1:暴力 class Solution { public:int maxSubArray(vector<int>& nums) {/**暴力解法…

Newbe.Claptrap-一套以“事件溯源”和“Actor模式”作为基本理论的服务端开发框架...

本文是关于 Newbe.Claptrap 项目主体内容的介绍&#xff0c;读者可以通过这篇文章&#xff0c;大体了解项目内容。轮子源于需求随着互联网应用的蓬勃发展&#xff0c;相关的技术理论和实现手段也在被不断创造出来。诸如 “云原生架构”、“微服务架构”、“DevOps” 等一系列关…

NCF框架揭秘直播来了!红包、抽奖、还有神秘嘉宾…(内含彩蛋)

盛派周三技术分享会直播开讲又来啦~为了更好地赋能开发者&#xff0c;盛派已将系统框架 SCF&#xff08;SenparcCoreFramework&#xff09;全部开源&#xff0c;收到了社区非常多的关注&#xff0c;现在 SCF 已正式更名为NCF&#xff08;NeuCharFramework&#xff09;&#xff…

leetcode45. 跳跃游戏 II

一:论语 己所欲 也要勿施于人 &#xff0c;每个人的经历和阅历都是不同的 你凭啥说你认为的很开心的事情 去要求别人呢 二:题目 三:上码 class Solution { public:int jump(vector<int>& nums) {/**思路:1.这里的难点就在于 我们需要判断下一步的的最远跳跃距离…

leetcode1005. K 次取反后最大化的数组和

一:论语 这个用在自己身上感觉值得反省&#xff0c;很多道理我都能明白 也能讲给别人听 但是很多时候 自己往往做的不好 而且还很容易 自我感动 最近真的很讨厌自己这样 不要自我感动 要正向积累 多去做 多去做 这只是个开始 然后慢慢的长进 再者就是坚持 二:题目 三:上码 …

.NET Core全Linux开发体验分享

“ 2016年.NET Core首个正式版本问世&#xff0c;如今已发布到了.NET Core3.1&#xff0c;再有2个月.NET5也将如约而至&#xff0c;跨平台开发已经快5年&#xff0c;然而很多人却还只是在Windows上用Visual Studio SQL Server去做.NET Core跨平台开发&#xff0c;欠缺对Linux的…

使用Microsoft Word2016无法正常对Latex文本转换的踩坑和解决方法

相信很多人都遇到像我一样的问题。word2016中&#xff0c;有latex的按钮&#xff0c;按ALT就可以开始写公式&#xff0c;复制粘贴latex公式之后&#xff0c;怎么就转换不了呢&#xff1f;就是如图这样的&#xff0c;左上角转换按钮为灰色。 上网找呀找&#xff0c;找了很多资料…

leetcode134. 加油站

一:论语 二&#xff1a;题目 三&#xff1a;上码(暴力解法超时 但方法二还是可以的) // class Solution { // public: // int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { // /** // 思路:1.暴力解法,我们遍历所…

ffmpeg 硬件解码零拷贝unity 播放

ffmpeg硬件解码问题 ffmpeg 在硬件解码&#xff0c;一般来说&#xff0c;我们解码使用cuda方式&#xff0c;当然&#xff0c;最好的方式是不要确定一定是cuda&#xff0c;客户的显卡不一定有cuda&#xff0c;windows 下&#xff0c;和linux 下要做一些适配工作&#xff0c;最麻…

Git入门教程(一)

今天开始学习Git&#xff0c;所以就把每天学的东西写下来&#xff0c;不然真的太复杂&#xff0c;容易忘记呀。 这里推荐一个网站Webscripting2 — Serverside Webscripting — xx.git&#xff0c;英文一般般的都可以上去看看&#xff0c;我觉得非常直观。 首先Git&#xff0c;…

leetcode135. 分发糖果

一:论语 二:题目 三&#xff1a;上码 class Solution { public:int candy(vector<int>& ratings) {/**思路:1.这里我们分两次遍历(从左向右 从右向左)2.当我们从左向右遍历的时候 如果右边的评分比左边孩子分数高 那么右边孩子的糖果数上就在左边孩子糖果数上加一3.当…

Java国家/地区使用限制条款引发争议

喜欢就关注我们吧&#xff01;今天 JDK/Java 15 发布&#xff08;看今天推送的头条&#xff09;&#xff0c;在 RI 包里有开发者发现其标注了一则国际使用限制条款&#xff1a;由于某些国家/地区的知识产权保护和执法有限&#xff0c;因此 JDK 源代码只能分发到授权的国家/地区…

反射的基本知识(详解)

一:反射的引出 1:问题 比如我们给出一个student类 其方法show(),我们将其写入配置文件中&#xff1b;现在我们来一个新的需求说是要改变重写一个show()方法 show()2,那么如何在不修改源码的情况下进行修改&#xff0c;这时我们通过反射就可以完成 2:过程 student类&#xf…

.NET 5.0 RC1 发布,离正式版发布仅剩两个版本,与 netty 相比更具竞争力

原文&#xff1a;http://dwz.win/Qf8作者&#xff1a;Richard翻译&#xff1a;精致码农-王亮说明&#xff1a;1. 本译文并不是完全逐句翻译的&#xff0c;存在部分语句我实在不知道如何翻译或组织就根据个人理解用自己的话表述了。2. 本文有不少超链接&#xff0c;由于微信公众…

一个例子带你搞懂python作用域中的global、nonlocal和local

在编程中&#xff0c;只要接触过函数的&#xff0c;我相信都理解什么是全局变量和局部变量&#xff0c;概念比较简单&#xff0c;这里就不做解释了。在python中&#xff0c;用global语句就能将变量定义为全局变量&#xff0c;但是最近又发现有个nonlocal&#xff0c;一时搞不太…

初识ABP vNext(10):ABP设置管理

点击上方蓝字"小黑在哪里"关注我吧定义设置使用设置前言上一篇介绍了ABP模块化开发的基本步骤&#xff0c;完成了一个简单的文件上传功能。通常的模块都有一些自己的配置信息&#xff0c;比如上篇讲到的FileOptions类&#xff0c;其中配置了文件的上传目录&#xff0…

类加载机制(整个过程详解)

一:背景 类加载机制是在我们的真个java的运行阶段中的其中一个阶段。 二:什么是快乐星球(类加载机制) 我们编写的 Java 文件都是以.java 为后缀的文件&#xff0c;编译器会将我们编写的.java 的文件编译成.class 文件&#xff0c;简单来说类加载机制就是jvm从文件系统将一系…

leetcode860. 柠檬水找零

一:论语 这里的小不忍指的是一方面我们受到挫折而控制不住自己而大发脾气&#xff0c;还有一方面指的是我们的过于优柔寡断&#xff0c;对于自己或者他人的过失&#xff0c;不忍心加以责罚。 二:题目 三:上码 class Solution { public:bool lemonadeChange(vector<int&g…

跟我一起学.NetCore之Asp.NetCore启动流程浅析

前言一个Asp.NetCore项目&#xff0c;知道大概的启动流程是有必要的&#xff0c;比如后续遇见配置信息覆盖等相关问题时也大概知道是什么原因&#xff0c;了解原因之后&#xff0c;再去搜索引擎找答案&#xff0c;否则目标不明确&#xff0c;茫茫人海怎么会一下找到自己想要的&…