开发一款 gitlab 全局搜索工具

公司前端有很多项目,但是gitlab社区版自带的搜索功能实在是太弱了, 只能搜索当前项目,不能跨项目搜索, 也不能搜索代码内容。 所以我就开发了一款gitlab全局搜索工具, 目前支持搜索代码搜索。

项目在线地址

gitlab-tools

使用技术栈

  • umijs 4
  • react 18
  • antd 5

全局搜索目前已实现

  1. 支持频次限制,避免循环拉取导致 429 错误
  2. 支持群组模糊或者精准搜索
  3. 支持 glob 模式排除或者过滤文件
  4. 支持限定分支,默认是 release 分支
  5. 支持搜索结果按照项目纬度导出 excel
  6. 支持点击卡片跳转到远程仓库的当前文件,并滚动到开始行

实现原理

主要依赖于 gitlab 提供的 REST API (search)

首先是一些公共逻辑,设置用户个人 Token,并获取当前用户的所有群组项目群组项目做了持久化缓存(indexdb),避免每次都拉取。

搜索功能上支持群组过滤,群组过滤支持模糊和精准过滤。精准使用 select组件支持搜索多选,模糊使用 input,使用字符模糊匹配群组名称。

搜索代码时,先获取当前群组下的所有项目,然后再去每个项目下搜索代码,最后把结果汇总。

使用micromatch做最终结果的过滤,支持 glob 模式(参考 vscode搜索的文件过滤模式)

点击搜索结果卡片,可以跳转到远程仓库的当前文件,并滚动到开始行, 这个功能主要是拼接 url,格式如下:

https://gitlab.cn/namespace/project/-/blob/branch/path/to/file#L10

另外支持结果统计,可以按照项目纬度导出 excel, 这个功能主要是使用 xlsx 做的。

TODO

  • 批量删除过时的分支

小版本开始迭代,到时每个项目的开发分支过多,而且各位同事没有发布后删除开发分支的习惯,导致分支越来越多,想做一个批量删除过时分支的功能。 主要思路是先获取群组下的所有项目,然后再去每个项目获取分支, 判断分支的最后提交时间, 如果超过某个时间就删除分支。

  • 批量更新某个公共依赖

平时开发中,发现有些公共依赖版本过时了,想要批量更新某个依赖的版本号, 目前只能一个个项目去更新,比较麻烦。 所以想做一个批量更新某个依赖的功能。

首先根据群组搜索到所有项目,然后再去每个项目拉取package.json文件, 判断是否有当前依赖, 如果有那么就更新依赖, 并提交代码。

感谢

https://github.com/sam-plus/gitlab-global-search