为什么要实现自动部署
开发者工具提供了命令行与 HTTP 服务两种接口供外部调用,开发者可以通过命令行或 HTTP 请求指示工具进行登录、预览、上传等操作。 传送门:"developers.weixin.qq.com/miniprogram…"
通过命令行与 HTTP 服务可以想到一下几种思路
为什么我不用第一种和第二种?一是因为搞这种现成的配置式的东西弄出来没什么成就感,用第三个思路写顺便可以练练Node,二是因为虽然思路有了,但配置还没玩明白,等我研究明白了再单独写吧。emmmm.....
你正在认真coding,和某个bug激烈战斗,已经有了头绪正准备一气呵成干掉它。突然被别人打断并告诉你需要为他提供一个测试环境的二维码... 为了这个二维码你做了以下事情
忙活完之后你将分支切换回来,不断回想刚才的思路,脑子里一万个那啥狂奔,但如果直接反手丢给他一个发布系统链接地址,那么他只要按照以下步骤点点点就可以轻易的搞定这件事而不用来冒着被砍的风险来找你:
在后端功能的实现上用了以下框架和模块
mac系统上开发者工具会默认的安装路径是/Applications/wechatwebdevtools.app
, 通过process模块执行shell命令open /Applications/wechatwebdevtools.app
即可打开开发者工具。
上传接口是这个系统的核心,虽然很简单但要实现这个接口还是需要你对小程序工具的http调用有一定了解,接下来详细说一下如何完成此功能: 上文说到小程序开发者工具提供了命令行与 HTTP 服务两种接口供外部调用,开发者可以通过命令行或 HTTP 请求指示工具进行登录、预览、上传等操作。
第一步(开启http服务)
打开你的开发者工具 设置——>安全设置——>服务端口
,因为调用开发者工具提供的http服务一定要拼接本地的端口号,所以后续所有的操作都是要基于开发者工具开启且服务端口开启的状态下进行操作的,默认情况下服务端口是关闭的,http 服务在工具启动后自动开启,HTTP 服务端口号在用户目录下记录,可通过检查用户目录、检查用户目录下是否有端口文件及尝试连接来判断工具是否安装。
第二步(如何拿到开发者工具端口号) 在确保你的开发者工具服务端口开启的情况下,我们可以尝试通过node的fs模块去读取储存的文件信息读取端口号,端口号文件是开发者工具自动生成的,所以它的位置是固定的,但不同系统中的默认位置也不相同。
端口号文件位置:
macOS : ~/Library/Application Support/微信web开发者工具/Default/.ide
windos :微信web开发者工具/User Data/Default/.ide
注意!!! 像是在mac中直接去读取这个默认路径是获取不到的,因为mac中一般会将工具安装在你的当前账户文件夹下,所以如果发现无法读取的情况可以到Uers的文件夹找找看。 比如我的mac上要想访问端口文件完整路径是这样的:
const portPath = '../../Users/admin/Library/Application\ Support/微信web开发者工具/Default/.ide';
读取端口的功能封装,后续会用到
第三步(上传)
接口定义:
通过调用获取端口号的方法,请求上传接口拼接端口,指定项目上传目录,就是编译出来的dist文件夹目录,将接收的描述和版本号一并拼接发送上传请求即可。
get请求封装
这个接口的实现主要是通过Node接收项目地址然后执行git clone的shell命令实现, 需要用到Node的child_process子进程模块用来执行shell脚本。
代码实现
Gitlab有一个非常强大的API系统,几乎所有的功能都有相应的API接口,为了使用API,需要从Gitlab中获取私有token。
成功拿到token之后只需在请求的时候作为query参数传递即可: 项目分支信息API api/v3/projects/ [projectId] /repository/branches 小程序项目tagaAPI api/v3/projects/ [projectId] /repository/tags
分支和tag接口实现的思路是一样的,接到前端请求后执行各种git命令完成
cd ./project
代码实现
示例为分支切换的相关代码,tag实现的思路是一样的,只不过要把相关git命令替换即可。
这里需要注意一下,这个接口的实现是非常灵活的,需要根据你当前项目的编译文件进行配置,比如我的项目开发时使用gulp打包编译环境到dist,其编译命令分别为:
gulp build:Dev(联调环境)
gulp build:Test(测试环境)
gulp build:Slave(预发布环境)
gulp build:Prod(线上环境)
那么同理,配置好dist输出文件目录,收到请求后执行事先实现好的shell命令即可完成打包这一步,如果你不太了解环境编译打包这块内容,可以参考我上一篇文章"《武装你的小程序——开发流程指南》";
代码实现
目前为止我们已经实现了六个后端功能,并生成了对应路由,分别为:
/open
实现拉起开发者工具的接口;
/up
上传小程序后台接口;
/clone
拉取git项目到本地的接口;
/checkoutBranch || /checkoutTag
获取gitlab项目信息,分支及tag的接口;
/branches || /tags
获取gitlab项目信息,分支及tag的接口;
/branches
项目编译打包的接口;
前端页面我就不提供示例代码了,ui框架和开发框架根据大家的喜好决定,因为有了上面这些接口我们就已经可以愉快的对前端页面进行你需要的一些定制了,这个时候需要我们考虑的就是一些前端的交互逻辑了,如何利用好这些接口将起串起来组成条完整的流程,如何利用gitlab的其他api扩展你需要的其他功能,比如加一个提交记录页面...
前面的流程图已经大致画出了我的思路,下面我将我的前端实现思路详细描述一下,供大家参考:
/clone
接口将代码拉取到项目中,同时将端口号路径储存起来后面用。
/open
接口拉起开发者工具
/branchs
和/tag
接口获取分支和tag信息,将其展示在页面上。
/checkoutBranch 或 /checkoutTag
接口传递分支名,后端调用相应的git命令。
/build
接口传递环境变量进行构建。
/up
接口传递版本号和描述发送上传请求,上传成功页面将描述,提交人,时间,环境等必要信息展示出来。
到这里一个简单的小程序发布系统就完成了,本文只是记录了我的一个开发思路希望能对大家有所启发,有很多地方考虑的还是不够完善但基本能用了,大家可以发散思维实现一个自己的发布系统,也欢迎交流想法和指正我的错误,同时欢迎大家关注公众号前端小苑,我会定期在这里发表原创文章。