本系列文章共分为基础篇,安全篇,拓展篇。前端
曾几什么时候,我相信部分Web Developer(包括我)使用的项目发布方式比较传统(使用xftp或者sublime text的插件sftp等),发布方式简单又粗暴,想发布哪一个目录就直接上传覆盖...vue
可是这种方式对于如今的前端项目有些弊端:node
若项目包含webpackgulp等构建工具,则每次发布都须要等待构建完成后再手动上传,效率低;webpack
若项目为前端的服务端渲染项目,例如vue的服务端渲染,那么项目上传服务器后还得登陆服务器重启进程;git
发布时因为选错文件或者选错发布环境致使的上传(>﹏<)悲剧,可没有后悔药吃。github
我知道你想告诉我还可使用git webhook等自动化工具,的确这是一种比较高级的用法,也很是可靠,可是搭建过程对于新手仍是比较麻烦的,并且前端仍是不太同于服务端,前端项目大多须要构建,那么构建过程究竟放在服务端仍是本地,这是一个问题。web
我理想中的发布器应该是易于搭建,经过配置文件就能选择发布到不一样的环境,敲完一行发布命令就能够去泡杯茶,让它本身完成整个发布流程。shell
因而,fjpublish就诞生了。它是一个不一样于git webhook的发布思路,基于nodejs的能力自动化整个发布流程,顺便把git提交一下...npm
若是你已经安装了nodejs (6.0+),那么只须要一个命令就能完成fjpublish的安装json
npm install fjpublish -g
全局安装就能够在任意路径下使用fjpublish这个命令了。
注意: fjpublish依赖一份配置文件,默认是fjpublish.config.js,若是不想在版本库中提交服务器安全信息,请千万记得把它加入忽略文件中,如.gitignore
fjpublish命令行默认会读取当前工做目录下的fjpublish.config.js文件,该文件返回一个对象,结构以下:
module.exports = { //modules开始 modules: [{ name: '测试环境', //标识要发布的环境描述 env: 'test', //发布环境的惟一标识 ssh: { host: '12.23.345.678', //远程服务器ip username: 'root', //登陆服务器的用户名 //rc版本的user选项和userName选项请在将来统一配置为username password: '12345678', //登陆服务器的密码 }, buildCommand: 'build', //要进行构建的命令build => npm run build localPath: 'example', //项目中要发布的目录 remotePath: '/www/example', //项目中要发布到远程服务器的目录 tag: '123' //标注发布的版本,可不设置 }, { ... }], //modules结束 nobuild: true, //modules外的字段可用于每个module继承,这里仅用于举例 tag: 'v1', //modules外的字段可用于每个module继承,这里仅用于举例 }
以上展现了一个简单的配置,关于使用fjpublish和阅读本文档,还需明白如下几个概念:
modules数组中每个对象(也称module)表明一个发布环境,在本文档中module指在配置文件中任意一个环境配置module
在本文档中config指代module.exports输出的全部字段(包含modules在内)的对象。
config中modules字段外的字段在初始后将并入每个module,优先级为module > config,也能够理解为module继承自config。
config中modules字段外的字段不只仅为了继承给module实例也能够是为了定义某些全局的配置字段。
听起来好像一头雾水,建议看完例子再从新理解以上内容
让咱们闲话少说,先上几个例子来了解fjpublish能作什么。
发布一个项目文件到远程环境,并备份旧文件。
以提示器的方式选择发布到测试环境
// 项目根目录下fjpublish.config.js module.exports = { modules: [{ name: '测试环境', env: 'test', ssh: { host: '192.168.0.xxx', username: 'root', //登陆服务器的用户名 //rc版本的user选项和userName选项请在将来统一配置为username password: 'xxxxxx', }, buildCommand: 'webpack', localPath: 'example', remotePath: '/www/manman/test', },{ name: '预发布环境', env: 'pre_release', //剩余配置参考‘测试环境’ },{ name: '正式环境', env: 'pre_release', //剩余配置参考‘测试环境’ }] }
// 项目根目录下package.json // 用于使用构建命令npm run webpack来调用webpack ... "scripts": { "webpack": "webpack --config example/webpack/build/build.js" }, ...
fjpublish env -s
<center><font color="#999" size=1>简单例子</font></center>
可使用命令fjpublish env <env> --diff
开启差别化发布,每次发布只上传有改动的文件,极大的缩短上传时间。
对于不须要构建的项目,不须要准备package.json,并在配置文件中设置nobuild
选项;
nobuild: true
对于某次发布临时不须要构建的,请在命令中使用--nobuild
选项
fjpublish env <env> --nobuild
有些时候咱们的项目须要发布的文件夹不止一个,或者须要忽略某些文件,那么就须要调整发布方式。
使用module的localPathEntries
来发布多个目录;
使用module的localPathIgnore
忽略全部txt结尾的文件。
// 项目根目录下fjpublish.config.js module.exports = { modules: [{ name: '测试环境', env: 'test', ssh: { host: '192.168.0.xxx', username: 'root', //登陆服务器的用户名 //rc版本的user选项和userName选项请在将来统一配置为username password: 'xxxxx', }, buildCommand: 'webpack', localPathEntries: ['example', 'lib'], localPathIgnore: '**/*.txt', remotePath: '/www/manman/multiple', }], }
fjpublish env test
<center><font color="#999" size=1>多目录发布</font></center>
若是把配置改一下,那么发布的项目结构将彻底不一样,那么聪明的你猜猜修改上文配置的localPath
和localPathEntries
会发生什么吧;
... localPath: 'example/webpack', //当localPathEntries存在时localPath可不填,不填意味着项目根目录 localPathEntries: ['build', 'dist'], ...
若项目为多目录发布,则远程目录的备份规则也将变为以这些子目录为备份源。
对于须要重启服务的项目,fjpublish也是支持的。
使用module的配置项postCommands
在项目发布后重启pm2进程;
忽略当次构建过程并提交一次git;
使用module的配置项ssh2shell
设置每一个远程命令超时时间为20秒。
// 项目根目录下fjpublish.config.js module.exports = { modules: [{ name: '测试环境', env: 'test', ssh: { host: '192.168.0.xxx', username: 'root', //登陆服务器的用户名 //rc版本的user选项和userName选项请在将来统一配置为username password: 'xxxxxx', }, ssh2shell: { idleTimeOut: 20000 }, postCommands: ['pm2 reload xxx'], buildCommand: 'build', localPath: 'example', remotePath: '/www/manman/test', }] }
fjpublish env test --nobuild --commit '远程后置命令'
<center><font color="#999" size=1>远程后置命令</font></center>
有备份项目的功能那固然得有还原的办法啦。
还原版本预发布环境至tag
标记为‘自定义tag的版本’的版本;
// 项目根目录下fjpublish.config.js module.exports = { modules: [{ name: '预发布环境', env: 'pre_release', ssh: { //略 }, localPath: 'example', remotePath: '/www/zhangchao/pre_release', }], }
fjpublish recover pre_release
<center><font color="#999" size=1>快速还原</font></center>
可使用命令fjpublish recover pre_release -p, --previous
快速还原至上个版本而不须要选择;
可使用选项recoverTemplate
自定义版本列表模板;
快速还原同样也会执行postCommands
配置的后置命令。
以上的例子描述了fjpublish中最基本的功能,fjpublish也有强大拓展能力,感兴趣的童鞋能够直接移步官方文档了解更多,别忘了在github上给我点个star哦。
下一期咱们将谈论如何使用fjpublish进行安全发布,拜拜∩__∩y。
下一期地址:使用fjpublish发布前端项目(安全篇)
fjpublish官方交流群:608809145