真▪一行代码完成从前端代码build到部署线上

在经历了6,7个项目同时开工,频繁发布测试 ,不得不学会一点偷懒的小技巧来提高效率了,所以这篇文章要讲的就是如何更加优化发布流程。

工作以来,经历了build后,然后用FileZilla上传服务器完成部署。再到前端打包后 ,在build仓库执行git push,后端在自动部署。后端的自动部署的确简化了很多操作,不过对于前端来说 ,每次发布还需要去build仓库执行push操作,特别是发布频繁的时候,难免会减低效率 ,这种重复操作还是让脚本来执行比较合适。所以接下来就是围绕如何只需要执行npm run build 就完成项目发布。

(本文所讲的都是基于windows系统和node环境,各个系统的脚本语言可能有所误差,基本思路不变)

本文分为两部分,第一部分主要讲的是前端的打包发布的优化过程 ,第二部分简单介绍一下后端的自动部署原理。

一:前端发布优化

首先要明确的是目前大部分前端项目的build过程都是基于node环境,所以优化流程的主要思路就是利用node和操作系统交互,调用系统脚本完成文件copy和git操作。在这我们要明白在执行npm run build 的时候发生了什么 ,npm run build 只是一个语法糖 ,


package.json里面可以看到其实是用node 执行了build/build.js文件,下面我们就来改写build文件,为了方便对比,我在这贴一下改写前后的build文件,改写前:改写后:


我们其实不用全部读懂build.js里面做了什么 ,我们只需要知道再build成功后在何处执行我们的脚本就可以了, 可以很清楚的看到webpack打包后的回调函数,找到位置后,我们需要引入children_process,关于这个模块这里说明两点:

1.children_process这个模块提供了衍生子进程的功能,熟悉shell操作童鞋可以利用这个模块做一些有意思的事情,我们这儿主要利用children_process.exec(commad,options,callback), 主要功能就是创建一个shell,然后在shell里执行命令。执行完成后,将stdout、stderr作为参数传入回调方法。想要详细了解到童鞋可以去node文档看一看

2.就是关于process.argv , 这个提供了获取命令行参数的方法,这个参数就是在执行node命令时后面接的参数 ,比如执行 node build.js a b c , 那么process.argv[1]就是build.js ,process.argv[2]就是a,以内类推。

知道了这两点后,我们就可以设计我们的自定义命令了 , 因为优化的目的就是简化操作 ,所以在build的时候我们接上我们的自定义参数,这关系到后面我们的脚本编写,我设计的命令是 npm run build (push)(commit) (branch) ,这里括号包裹是为了方便表达这是一个自定义变量,实际是没有括号的,三个参数的意思如下:

1.push表示是否打包完直接push到远程;

2.commit 表示push到远程执行git commit -m ‘(提交信息)',的这里的提交的信息;

3.branch表示git push origin (branch)的那条分支 , 意味着是发布到正式服务器还是测试服务器

自定义完参数后我们在回调里面利用exec()执行我们的脚本

这时候我们编写我们的脚本了 ,我们新建一个autopush.bat的文件 ,放在我们的根目录就可以了,脚本内容很简单,大概就是执行了复制粘贴删除和git操作,脚本如下

cd D:\build\test /* 进入build的仓库*/
git checkout %2  /* 切换build仓库的分支*
/rd /s/q D:\build\test\static /* 删除build仓库的static文件夹*/
xcopy D:\source\test\dist D:\build\test /E/I/Y /*从源码仓库的打包后dist的文件夹拷贝并覆盖掉build仓库的文件*/
git add .git commit -m %1 /*提交代码*/
git push origin %2 /*push到远程,后端执行自动部署*/
cd D:\myFolder\31abc_admin复制代码

这里说明三点:

1.先执行删除build仓库的static,在拷贝并覆盖 , 是因为改动后每次打包后的js文件名都会变动 , 不删除的话,不会覆盖重名文件,所以会导致js文件累积;

2.window脚本参数是通过%1获得的,例如%1就是获取第一个参数,%2就是获取第二个参数,这样就可以获取我们在build.js中执行脚本的时候传入的关于commit和branch的参数了。

3.关于删除和拷贝中参数的意思 , 

rd /s/q 
      /S 表示删除该目录下所有遍历的子目录和文件
      /Q 删除目录时不提示确认,直接删除
 xcopy 后面的/E/I/Y
      /E 复制所有子目录,包括空目录。
     /I 如果“Source”是一个目录或包含通配符,而“Destination”不存在,“xcopy”会假定“destination”指定目录名并创建一个新目录。然后,“xcopy”会将所有指定文件复制到新目录中。默认情况下,“xcopy”将提示您指定“Destination”是文件还是目录
      /y 禁止提示确认要覆盖已存在的目标文件。
复制代码

通过以上操作我们就可以 ,通过npm run build push fix master 一行命令完成打包到push的操作了, 这个时候后端要是设置了自动部署的话,那么,就直接上线了。

二:后端自动部署

关于自动部署的文章,网上已经一大把了,在这儿为了配合这篇文章就简单介绍了自动部署的原理 , 自动部署的关键就在于webhook ,主流的代码托管平台都有这个功能,包括coding , github等,在仓库里可以设置,以github为例,大概在这个位置



这里可以填写一个自己服务器的接口地址和一个seret用于验证 , 填写完了仓库会监听push操作 , 一旦有push操作,webhook就会发出一个post请求到你设置的接口,然后在服务器端执行脚本进行git pull操作,把最新的代码拉下来,就完成了部署。



猜你喜欢

转载自juejin.im/post/5b6ab179f265da0f900e3f2b