基于 Gitlab Web Hook 的自动 Eslint 语法检查
Eslint, 一个插件化的 Javascript 语法检查工具, 如何将其结合 Gitlab 并应用于开发呢?
Gitlab Web Hook
Gitlab Web Hook 提供如下事件的 Hook:
- Push events
- Tag push events
- Comments
- Issues events
- Merge Request events
…
当对应事件发生时, 将触发预设的 URL (即 Web Hook), 并向其发送一个包含该事件详细信息的 POST 请求, 正是通过该 POST 请求从而对各个事件进行处理的.
例如 Merge Requests events:
1 | //Request body: |
从这个请求体中可知该 Merge Request 的创建者, 分支, 源分支信息, 目标分支信息, 最近一次 Commit, 分配给哪个用户, 对应的状态等信息.
Eslint
作为插件化的 lint 方案, 逐渐打败了原有的 JSLint 和 JSHint, 并’吞并’了 JSCS, 其最大的优势就是标榜的可插件化, 并且有各种插件可以扩展, 使得开发人员能够灵活的配置规则, 如果这还不满足你的需求, 你还能方便的开发针对自己需求的插件, 此外它还支持 Es6, Jsx 语法, 前端程序员真是一群追求’时尚’的猿, 你不能阻止一个前端使用新工具 ……
编写自己的 config/plugin npm package
两种方式:
- 第一种是类似于 eslint-google-config 的方式, 通过编写配置文件 npm package, 具体详见官方教程;
- 第二种以插件形式, 类似于eslint-plugin-react-native, 通过编写独立的 Eslint 插件;
本文采用第二种方式, 不仅方便配置现有的 rules, 也方便未来添加自己的 rules:
1 | import ReactEslint from 'eslint-plugin-react'; |
假设你的插件叫做: eslint-react-demo, 那么通过安装该插件(前提是你 npm publish了这个插件):
1 | npm install eslint-react-demo babel-eslint eslint --save-dev |
并在项目根目录配置如下 .eslintrc 文件即可:
1 | { |
使用 Node 编写 Gitlab Web Hook 接口
现在插件有了, 还是聊聊怎么实现自动化 Eslint 检查吧, 由于目前采用 Issue 方式开发, 当猿们最终写完功能, 需要合并到 master 分支时, 必须提一个 Merge Request, 此时通过监听拦截 Merge Request 事件, 对应的 Web Hook 需要完成以下任务:
- 判断 Merge Request 事件的触发动作, 若为 open 或者 reopen, 则执行 Eslint 检查
- 通过 POST 请求体获取对应事件的 git 地址, 分支等信息, 将对应仓库拉到本地
- 执行 Eslint 检查
- 如果通过 Eslint 检查, 则什么都不做, 否则将 Eslint 检查结果作为评论回复在该 Merge Request 页面, 并关闭该 Merge Request(当然, 你也可以发邮件给对应的开发人员);
关键代码如下:
1 | check(mr) { |
其中用到的 shell 脚本内容如下:
1 | !/bin/bash |
剧终
基于 Gitlab Web Hook 的自动 Eslint 语法检查
http://quanru.github.io/2016/10/02/基于 Gitlab Web Hook 的自动 Eslint 语法检查/