前端自动化发布实战总结

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

为什么要做

今年4月份,开始自己的第二份工作,习惯了老东家如丝般的发布体验,一下子感觉来到了“原始社会”。 首先这是一篇长文,主要介绍自己在做自动发布这个过程的一些思考。

引用玉伯的Web研发模式演变来说,现在我们处于 - Web1.0时代:

  • 前后端代码耦合
  • java环境对前端过于复杂
  • 缺乏工具和规范,代码难维护
    • 内嵌代码:html内嵌js,jsp内嵌java逻辑
    • 页面级代码,代码叠加:单文件js随意2000行以上
  • 人工手动发布,变更麻烦

遇到这种情况,首先会想到的肯定是前后端分离。但考虑到目前的人员、技术储备情况,直接过渡到基于NodeJS的全栈式开发,阻力大,周期长,很可能会难产。

而我们首要要解决的问题是:

  • 前后端职责清晰
  • 提升开发效率、体验
  • 自动化发布

所以我们暂时先做到前后端物理分离,大致如 - Web2.0时代

  • 代码仓库分离,分开维护
  • 发布部署分离
  • 模板由前端维护,在浏览器渲染,后端只提供基础页面容器(视情况而定)
    • 交互性、非SEO页面:后端负责接口,前端负责展现,通过接口读取数据在浏览器端渲染
    • 需要SEO的页面:相关模板还是放在后端,但是会减少业务逻辑

目标

我们先从开发、发布流程来看我们最终希望的结果是什么,然后再分析如何完成这一目标

开发流程

  • 项目遵循流程:需求评审 -> 视觉评审 -> 接口约定 -> 需求评估 -> TC评审 -> 并行独立开发 -> 联调 -> 测试 -> 发布
  • 开发过程前后端明确任务,独立并行开发

2dbb303c08e2add4a7fef424b1a4ebba23919283

发布流程

  • 发布要严格遵守流程,测试审核通过才能上线
  • 整个流程只需简单发布指令,所有的编译构建、同步服务器的事情交给任务去做(后面我们会提到发布任务需要做哪些事情)

355df6cfbfd8c346e07d683e4dcabc261444a381

分离需要做什么

  1. 代码分离 使用git来做代码版本管理,申请新应用维护前端代码
  2. 使用webpack,做模块管理 代码分离后,我们可以使用目前前端主流的框架、工具,搭建友好的开发环境、流程
  3. 分离之后,请求后端接口,联调、debug,都需要设置代理
  4. 自动化发布
  5. 服务器配置 考虑如何部署前端代码

自动化发布

首先聊一下一般发布的流程:

  1. 代码提交
  2. 打包构建
  3. 备份服务器当前文件 - 回滚使用
  4. 将构建结果同步到服务器目录
  5. 合并代码到Master - 保证后续的代码都是最新的

这是一些纯体力活,要保证步骤顺序和正确性,容易出问题,而且没有记录和日志,所以一般做权限控制,发布个普通需求还要找对应的同学发布,变更麻烦

所以发布必须自动化,网上搜前端自动化发布,大多数的结果都是Jenkins + githook ( Jenkins+github 前端自动化部署

其核心原理主要是通过

  1. 提交代码触发webhook push event
  2. Jenkins监听到webhook post请求,执行编写好的脚本构建、同步服务器(主要依赖于脚本)

但是如果我想要查看发布记录、回滚、控制发布流程,看起来Jenkins就帮不上忙了(可能有对应的插件,没深究)

同样的发布脚本,用node也能执行,所以我们打算使用node来写一个发布集成服务来代替Jenkins,它可以做更细致的控制:

  • 提交代码不代表发布,可能只是代码备份,发布指令才代表发布
  • 可以生成发布记录,在发布平台展示,方便查看和回滚
  • 实时反馈发布流程信息
  • 控制发布流程,加入审核、CodeReview,让发布更安全

所以我们的发布自动化主要做三个东西

  • CLI:让熟悉命令行的同学,git push后马上就可以敲命令发布(创建新发布、发布)
  • 发布平台:查看发布记录,发布,审核,查看日志,回滚
  • 集成发布服务:执行发布脚本,同步服务器,备份近期发布文件(快速回滚),反馈发布信息,发布控制

CLI

该CLI是一套标准的前端开发生命周期命令,通过几个子命令去完成前端开发流程的各个任务,包含了:

  • init:初始化项目结构,类似于vue-cli init,不过比较入门简单(因为暂时业务的体量并不需要频繁创建新项目)
  • dev:启动开发调试服务,主要是npm run dev,也不是重点
  • publish:发布项目代码,执行publish后将执行项目仓库中对应开发分支下的代码发布任务。在云端构建后的代码最终会发布到对应的环境(SIT、UAT、生产)。

关于CLI的开发参考 - 如何用Node开发CLI 主要是:commander + inquirer

从此发布就变成了一个命令的事

e100772cfc6987f71a996625238e1c1519cfedfa

发布平台

发布平台提供了比CLI更多的功能:

  • 查看发布记录
  • 查看日志
  • 回滚
  • 发布管理、控制


d68d98faa520ea92632e524e344aaf4fd1570c53

集成发布服务

到了重头戏,这里就介绍一些概念

发布流程

e371cd16d0e04ec1e038e497c566b9fa2e4d9b8f

2e4bce0d430db91782fef61ff66548317835798c

9cc3a821d89ad1e2c25a2f824f9827533f343bba


为什么在云端构建发布

首先,最终代码部署到服务器肯定都是通过scp等命令来同步文件到服务器,因为权限问题,通过云端统一管控是比较靠谱的。

然后,每个人的机器环境都不一样,有可能在A这构建成功,在B那却构建失败(比如A添加了一个依赖,但没有保存dependencies),所以以统一的环境来编译构建,可以避免因为环境问题引起的构建问题

最后,需要一个地方去统一管理发布记录,避免发布冲突,记录发布日志,方便回滚操作等。

分支管理

每个人都基于Master拉取自定义分支开发,最终通过发布自动同步到Master分支,保证开发时都是基于最新的线上代码,同时发布时做冲突检查,保证发布安全。

发布过程的分支变化如下:


5e47b9c301064cc1579f4f27fd92714431904892

发布管理

在整个发布过程,我们的代码要通过日常、预发测试才能最终上线,这个过程是需要占用对应服务器并保持稳定,需要避免出现其他同学发布覆盖的情况,所以我们使用MongoDB来维护发布记录,实现发布控制和流程控制

发布控制 当指定发布环境有一个项目发布时,该环境被占用,其他项目发布会提示有其他项目发布,联系对应的发布同学,双方根据重要性来决定是否退出发布让后来的项目先上

流程控制 为了保证最终上线的代码是正确运行的,整个过程需要测试和Code Review,必须通过测试、审核才能进入下一个环节

发布反馈

发布脚本需要执行上面提到一系列的过程,这需要一个等待的过程,我们需要实时给发布同学提供发布反馈(发布流程、成功与否),并将相关信息保存到日志。所以发布过程通过soket.io建立socket链接,集成发布服务有任何流程变化都会反馈

同步服务器

同步服务器可以使用 scp 或 rsync 命令,关于它们的介绍和不同看这个

这两个命令通过ssh同步,都需要在执行命令后输入密码,所以需要配合expect来实现自动同步



原文发布时间为:2018年06月16日
原文作者:okbeng03
本文来源:  掘金  如需转载请联系原作者




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
11天前
|
运维 安全 应用服务中间件
自动化运维的利剑:Ansible实战应用
【9月更文挑战第24天】在现代IT基础设施的快速迭代与扩展中,自动化运维成为提升效率、保障稳定性的关键。本文将深入探讨Ansible这一流行的自动化工具,通过实际案例分析其如何简化日常运维任务,优化工作流程,并提高系统的可靠性和安全性。我们将从Ansible的基础概念入手,逐步深入到高级应用技巧,旨在为读者提供一套完整的Ansible应用解决方案。
|
2天前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible实战应用
【9月更文挑战第33天】本文将带你深入理解Ansible,一个强大的自动化运维工具。我们将从基础概念开始,逐步探索其配置管理、任务调度等功能,并通过实际案例演示其在自动化部署和批量操作中的应用。文章旨在通过浅显易懂的语言和实例,为读者揭开Ansible的神秘面纱,展示其在简化运维工作中的强大能力。
94 64
|
2月前
|
前端开发 UED 开发者
颠覆你的前端知识:防抖与节流的区别及实战解析!
【8月更文挑战第23天】在Web前端开发中,处理用户界面交互产生的事件可能会影响性能。为此,我们有两种优化方法:防抖(debounce)和节流(throttle)。防抖确保函数仅在事件停止触发一段时间后执行一次,适用于如搜索自动补全场景。而节流则确保函数按固定时间间隔执行,不管用户操作频率如何。本篇技术博客将深入解析两者差异并提供示例代码,帮助开发者更好地理解和应用这些技巧以提升应用性能和用户体验。
64 0
|
2月前
|
前端开发 关系型数据库 测试技术
django集成pytest进行自动化单元测试实战
在Django项目中集成Pytest进行单元测试可以提高测试的灵活性和效率,相比于Django自带的测试框架,Pytest提供了更为丰富和强大的测试功能。本文通过一个实际项目ishareblog介绍django集成pytest进行自动化单元测试实战。
30 3
django集成pytest进行自动化单元测试实战
|
1月前
|
缓存 监控 前端开发
前端性能优化实战:让你的网站快如闪电的十大秘籍
【9月更文挑战第3天】通过以上十大秘籍的实践,您可以显著提升网站的前端性能,让您的网站在竞争激烈的互联网环境中脱颖而出,为用户带来更加流畅和愉悦的体验。记住,前端性能优化是一个永无止境的过程,只有不断迭代和优化,才能保持网站的竞争力。
|
1月前
|
运维 监控 应用服务中间件
自动化运维的新篇章:Ansible Playbooks入门与实战
【9月更文挑战第1天】在追求效率和稳定性的今天,自动化运维已经成为IT行业的必修课。本文将带你走进自动化工具Ansible的世界,通过实战案例深入理解Ansible Playbooks的编写和应用。文章不仅介绍基础概念,更通过具体代码示例,展示如何利用Ansible简化日常运维任务,提升工作效率。无论你是运维新手还是希望深化自动化技能的资深人士,本指南都将为你开启一段新的学习旅程。
|
2月前
|
运维 安全 应用服务中间件
自动化运维的利器:Ansible入门与实战网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【8月更文挑战第30天】在当今快速发展的IT时代,自动化运维已成为提升效率、减少错误的关键。本文将介绍Ansible,一种流行的自动化运维工具,通过简单易懂的语言和实际案例,带领读者从零开始掌握Ansible的使用。我们将一起探索如何利用Ansible简化日常的运维任务,实现快速部署和管理服务器,以及如何处理常见问题。无论你是运维新手还是希望提高工作效率的资深人士,这篇文章都将为你开启自动化运维的新篇章。
|
2月前
|
编解码 前端开发 开发者
【前端设计达人必备】揭秘CSS尺寸单位的魔力:从基础到实战,打造灵动响应式网页!
【8月更文挑战第26天】本文深入探讨了CSS中常用的尺寸单位,包括像素(px)、百分比(%)、视窗单位(vw/vh/vmin/vmax)、可伸缩相对单位(em/rem)以及Flexbox和Grid中的fr单位。通过具体案例展示了每种单位的特点及其适用场景。像素适用于固定尺寸元素;百分比和em/rem利于构建响应式布局;视窗单位适合全屏设计;fr单位则能有效管理复杂网格布局的空间分配。掌握这些单位有助于开发者设计出更加灵活、高质量的网页布局。
40 4
|
2月前
|
前端开发 JavaScript 开发者
前端JS按钮点击事件、跳出弹窗、遮罩的实战示例
本文提供了一个前端JS按钮点击事件、弹出式窗口和遮罩层的实战示例,包括HTML、CSS和JavaScript的具体实现代码,以及功能解析,演示了如何实现按钮点击后触发弹窗显示和遮罩层,并在2秒后自动关闭或点击遮罩层关闭弹窗的效果。
前端JS按钮点击事件、跳出弹窗、遮罩的实战示例
|
2月前
|
运维 Ubuntu 应用服务中间件
自动化运维的利器:Ansible入门与实战应用
【8月更文挑战第28天】在现代IT运维领域,自动化已成为提升效率、确保一致性和可靠性的关键。本文将引导读者了解Ansible——一种流行的自动化工具,它通过简化配置管理、部署和任务自动化流程,助力运维人员轻松应对日常挑战。从基础安装到高级用法,我们将一步步探索Ansible的魔力,并通过实际案例展示如何有效利用Ansible优化运维工作。无论你是初学者还是有经验的管理员,这篇文章都将为你提供宝贵的知识和技能,让你的运维之旅更加顺畅。
下一篇
无影云桌面