前端工程化:围绕Jenkins打造工作流的过程

背景

1年前入职时,公司前端部门的静态代码部署都是用ftp工具拖拽部署,没有记录,没有关联,经常造成许多困扰的问题,

比如:今天有没有其他人在我要部署的路径上工作?我的代码为啥被盖掉了?被谁盖掉的?啥时候盖掉的?

本地build,ftp拖拽部署这种方式,导致git版本与手动的构建、部署没啥关联,更有在本地写完代码部署上去后,压根没传git这种失误可能发生。

靠人去遵守规范来控制工作流,总会有失误、疏忽的发生。

想法

要靠机器和代码去规范工作流,提高效率、准确性,实现真正的前端工程化。

具体目标

不讨论通用模板(项目开发层面),只关心构建以后的事情,精确的说,就是从npm run build:xxx 这个脚本开始对接,npm run build:xxx之前的事情不在本文讨论范围内。 实现构建-部署-测试(多个环境)-沙箱-上线(可回滚)的全部半自动化流程把控。

为什么选择jenkins:优先选择强大的开源工具,避免重复造轮子,主要原因是插件特别丰富,基本可以满足所有实际需求

先把成果贴上来,整体示意图

核心思想是分离构建、部署,所以每个项目,jenkins会建两个job。

jenkins服务部署在公司内网堡垒机上,使用tomcat管理jenkins的war包,占用系统服务、全量部署定时任务都跑在同一台堡垒机上(Linux)。

因为内容很多,所以我直接采用一张图 + 注释 来零碎的讲解每个功能的实现,因为每个公司的前端业务环境都不一样,所以我也不打算花太大的笔墨去描述所有的实现。写这篇文章的目的就是可能某个思想、某一段对jenkins插件的使用等等会帮助到有类似需求的人。注释会是截图,或者是关键代码,对应图中的数字

先放几张实际使用的图

jenkins项目界面部分截图

构建job部分截图

部署job部分截图(使用jenkins-pipeline实现流程图)

多套测试环境占用系统部分截图(占用环境后别人无法部署,全量脚本也不会覆盖)

全量部署脚本日志展示部分截图

整体示意图的注释(每一条都对应示意图中的红色阿拉伯数字):

  1. 构建和部署分离开来,便于后续的各种操作,比如全量部署、分环境部署、回滚代码等都是不需要构建操作的,耦合在一起会做很多无用功。
  2. 同上
  3. 一次构建三个包,保证了测试环境和沙箱、线上的构建环境/副作用参数的一致性(用shell脚本实现,具体如何实现不细说,就是循环变量执行npm脚本,shell脚本由git仓库管理,jenkins配置时统一拉取代码,这样所有的项目配置可以同步。示例如下)

4. 下图展示了部署job可操作的选项

  1. 上图中有说明
  2. 贴一段jenkinsfile代码,语法为pipeline script
  3. 原理同6
  4. 占用系统是另外开发的,配套使用,上面有占用系统的示意图,是用node做后台,vue+element做前台快速开发的,这里不展开说;
  5. 这个利用jenkins的Url Auth Plugin,再开发一下对接公司统一登录系统的api,就可以直接用了,本质上是围绕cookie来进行的,每个公司都有自己的统一登录(也可能没有,那就使用jenkins自带的用户系统),这里不展开说。
  6. 全量部署脚本用corntab,用node脚本实现,核心思想在于读取说明6中的"now_online.json"来得知是哪一个包是线上的,取到这个包,同步到所有测试环境。同时检测是否有改动,没改动则跳过;同时检测说明8中的标记,查明环境是否有人占用,占用也跳过。上面我有贴日志的截图。
  7. 这里的意思就是,构建任务还没执行完的时候,打开了部署任务进行部署,此时要检查一下构建任务是否插入了构建完成的标记,不然不能部署。
  8. 这里是我自认为最大的亮点,“如何保证当前分支上的代码绝对不落后于master”?我们都知道master上的代码即是线上最新代码,当多人协作开发的时候,有人先上线,此时master代码更新,而后上线的人还在用老的代码测试、上线,这样就会造成问题,除了人为保证主动去pull代码,有没有更可靠的方式? 这里就是工程化的一大亮点,我们设想,如果后上线的人的分支上有落后于master的代码,那么我们就不让jenkins的构建/部署成功! 如何通过代码实现并整合进jenkins?我研究了一下git的命令,如果执行 git log [你的当前分支]..origin/master 打印了空值,那么说明当前分支没有落后,如果打印了内容,那么就说明分支落后与master!具体用shell实现示例:
check_results=`git log $branchName..origin/master`
if [[ ! $check_results = "" ]]thenecho "【Error】:当前代码比master落后,需要合并master或更新代码重新打包之后才能进行构建!"exit 1elseecho "【info】:当前代码正常,可以部署!"
fi
复制代码
  1. 没太多好说的,打包出来的dist文件夹额外用eslint检测一下就好,shell脚本实现。
  2. 通过说明6中的pipeline script 中的 input 语法实现
  3. 回滚的关键代码也在说明6中有。

整篇文章比较零散,主要讲了一下我对前端工程化探索的思想和实践,因为手头的需求也很多(18年一起工作的好几个小伙伴被裁了,你猜他们剩下的工作谁来做),断断续续搞了两三个月,目前这套系统已经稳定运行几个月了,不断的完善使它现在很好用,线上再也不会出现因为忘了某些分支操作导致的bug;这套系统的优点就是,基于开源jenkins+核心思想,就可以很快的通过node/shell/pipelinescript搭建起一套完整的系统,成本极低!超级实用的功能却实现很多!

如果你觉得读完没啥收获或我写的实在不知所云,那就好好看看说明12,我觉得把这一个小技巧分享出去,并且让你有所收获,那也值了,毕竟写作能力有限~

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

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

相关文章

业务id转密文短链的一种实现思路

业务场景: 买家通过电商app下单后,会受到一条短信,短信内容中包括改订单详情页面的h5地址连接,因为是出现在短信中,所以对连接有要求:1.尽量短;2.安全性考虑,订单在数据库中对应的自…

百度高管:问心无愧

1月23日下午消息,今天下午,百度召开百家号2019内容创作者盛典,百度副总裁沈抖出席并发布演讲。 就在前一天,一篇名为《搜索引擎百度已死》的文章刷屏,文中提到百度搜索有一半以上会指向百度自家产品,尤其百…

Vuex 学习笔记

Vuex 是什么? Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。由于SPA应用的模块化,每个组件都有它各自的数据(state)、视图(view)和方法(actions),当项目内容越来越…

xdf文档怎么转换为pdf_如何将PDF文件和图像转换为Google文档文档

xdf文档怎么转换为pdfYou probably know you can create and edit documents with Google Docs, but you can edit more than just .doc files. Google Drive can also convert any PDF, JPG, PNG, or GIF into a document with fully editable text. Here’s how. 您可能知道可…

在现代 Windows 上使用经典 Windows 2000、XP、Vista 任务栏

你好,这里是 Dotnet 工具箱,定期分享 Dotnet 有趣,实用的工具和组件,希望对您有用!前言您第一次使用的 Windows 是哪个版本的?我最早使用的 Windows XP,然后再经过 XP、7、8/8.1 、Windows 10&a…

oracle sys可以登录,system权限不足,解决方法

今天在自己电脑上安装了oracle 11g,安装成功后发现 sys 可以正常登录。system 无法登录,显示 ORA-01031: insufficient privileges(权限不足) select * from v$pwfile_users; 查看有sysdba权限的用户 grant sysdba to system; 给system 授权sysdba权限…

airdroid黑屏_如何使用AirDroid从PC控制Android设备

airdroid黑屏AirDroid for Android replaces your USB cable for connecting to your PC. Transfer files back and forth, send text messages, play music, view your photos, and manage applications using a web browser or a desktop client. 适用于Android的AirDroid取代…

分析java程序

2019独角兽企业重金招聘Python工程师标准>>> 最近公司的一个账单推送的服务,发现有延迟。我排查的时候发现,有一个程序日志不动了(采用消息队列,部署了两台服务器来负载均衡)。 网上说: jstack …

环境部署(九):linux下安装python+chrome+Xvfb

在基于selenium进行的UI自动化测试中,开发调试环境一般都是windows操作系统。完成后需要部署到专门的测试环境。 如要要部署到linux环境的服务器(阿里云、腾讯云)执行,那么测试脚本也需要对应的浏览器支持, 才能正常进…

地理围栏_什么是“地理围栏”?

地理围栏The term is popping up more frequently in news articles, appearing in product manuals, and highlighted as a feature in tons of mobile applications, but what exactly is geofencing? Read on as we explain what it is, why it’s appearing in more produ…

219. 单页应用 会话管理(session、cookie、jwt)

原文链接:https://github.com/ly525/blog... 关键字:http-only, cookie,sessionid, vue-router, react-router, 安全,localStorage, jwt 需求描述 内部管理平台,需要用户登录之后才能访问。现在将 该平台地址(www.xxx.…

(原+译)使用numpy.savez保存字典后读取的问题

转载请注明出处: http://www.cnblogs.com/darkknightzh/p/7608928.html 参考网址; https://stackoverflow.com/questions/22315595/saving-dictionary-of-header-information-using-numpy-savez python中,使用pickle保存变量时,如果变量过大&…

NLog 通过http保存日志

简介NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。 NLog是一个简单灵活的.NET日志记录类库。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的(contextual information&#xff09…

嵌套映射

1. 多对一嵌套查询映射使用案例 package com.zixue.dao;import com.zixue.annotation.MyBatisRepository; import com.zixue.entity.Emp;/*** 员工表的DAO组件* */ MyBatisRepository public interface EmpDao {void save(Emp emp);Emp findById(int id);Emp findById2(int id)…

gopro dataset_如何将GoPro安装到DSLR相机

gopro datasetIf you have a DSLR camera with a hot shoe, it’s easy to attach various flashes and other accessories right to your camera. But with a couple of cheap attachments on hand, you can mount your GoPro to your DSLR camera as well. 如果您的DSLR相机带…

音频 m4a 转 wav

背景最近做智能家居,需要用到一些应答词 需要自己录制。但是在mac下面通过 QuickTime 录制的是 m4a格式。但是应答词需要 wav格式。所以就需要转化了解决方法# sox 不行, ffmpeg 很麻烦,用 avconv 很简单。安装 如果没有就安装 # apt-get ins…

jQuery已经过时了,还需要学吗?

说起jQuery,很多刚参加工作的程序员都没用过,甚至没听过。曾几何时jQuery可是秒杀一切Js库,大有一统江山的情况,可是在顶峰的时候,瞬间被Vue、React、Angela三大框架斩于马下。从百度指数,我们也看出在2015…

Bootstrap01

Bootstrap01内容概要 一.使用Bootstrap的步骤 1.下载Bootstrap类库,包含三个部分,fonts,css,Bootstrap 2.导入项目中,在头部引入JQ,css和Bootstrap 注意:JQ要引入在Bootstrap前面! 3.使用css样式时,全部使用class属性 二.全局CSS概要 1.仅支持H5文档格式 2.移动设备优先,需要在…

ios raise_如何在iOS 10中关闭“ Raise to Wake”

ios raiseRaise to Wake is a new Lock screen feature available in iOS 10. It allows you to wake your phone’s screen simply by picking up your phone. This feature is on by default, but if you’d rather not use it, it’s simple to turn off. “唤醒”是iOS 10中…

资源调度器调研

2019独角兽企业重金招聘Python工程师标准>>> 场景描述: 异步触发和Crontab触发 YARN(Yet Another Resource Negotiator)Hadoop 资源管理器 主要构成: RM(ResourceManager)是一个全局的资源管理器,负责整个系统的资源管理和分配。…