使用sourcegraph实现高效全局代码仓库搜索
前言
企业里随着业务以及人员的扩张,GitLab代码仓库的数量越来越多,一方面沉淀积累了一些优秀代码,另一方面也积攒了一些代码历史技术债务,随着人员的更迭,无论是优秀代码或是技术债务,都没能很好的传承下来,虽然都在代码仓库里,但后来的人却很难感知到这些代码的存在,这个时候就需要一个全局代码仓库搜索的能力来解决这些问题,全局代码搜索系统可用于如下场景:
域名/redis/mysql等资源下线,需要排查历史哪些服务使用过 某些依赖包的某些版本存在风险,需要进行升级治理 由于基础框架/中间件代码升级,需要排查梳理出依赖的服务进行推动升级 排查某AK/密码等信息是否被明文写到代码里 某个功能点之前有其他业务同学实现过,想参考下代码写法
上面的这些场景在企业里几乎都似曾相识,那么排查出这些关联的仓库就成了一个很重要的步骤,目前大部分公司都是使用的社区版GitLab,是不具备这种搜索能力的,所以这里借助一些开源的系统来实现。
实现方式
现在具备全局代码搜索功能的开源产品比较多,例如:sourcegraph、searchcode、kooder、hound等,众多代码搜索系统使用下来,个人还是觉得sourcegraph是功能最强大以及稳定的,下面就来介绍下具体的搭建方法。
sourcegraph介绍
官方网站https://about.sourcegraph.com/
除来搜索代码外,还有很多其他的功能的,这里不一一介绍,这里需要特别说明的是免费版仅支持10个用户,但对于目前大部分公司都把代码库作为敏感信息的现状来说,10个用户足够使用了,若需要高级功能的建议购买企业版本,企业版的具体功能见官方网站介绍。
快速安装
docker run --publish 7080:7080 --publish 127.0.0.1:3370:3370 --name sourcegraph --restart always --volume ~/.sourcegraph/config:/etc/sourcegraph --volume ~/.sourcegraph/data:/var/opt/sourcegraph sourcegraph/server:3.40.0
在服务器上安装请注意挂载的目录的磁盘空间是否充足。安装完成后访问http://127.0.0.1:7080即可进入sourcegraph系统,会要求设置管理员密码。
配置代码源
点右上角头像弹出菜单 -> site admin进入后台管理界面 -> 左侧菜单Repositories -> Manage code hosts -> Add code host -> 选择GitLab Self-Managed,如图:
选择后弹出GitLab仓库的配置参数,如下:
{ "url": "填写GitLab域名", "token": "填写GitLab账户Token", "projectQuery": [ "projects?membership=false&archived=no" ] }
这里的Token是在GitLab里生成,步骤为:点击用户头像弹出菜单 -> preferences -> Access Tokens,选择适当的权限:
这里生成出来的Token只展示一次,后面的查不到的,请一定要要记好,但也不要暴露出去了,若忘记或泄漏了则点击下面Revoke废除后重新再生成一个即可。
sourcegraph里配置哪个账户的Token,直接决定了sourcegraph能查询的仓库的范围,如果上面的membership=true则仓库范围为该账户参与开发的仓库,若membership=false则查询该账户有权限访问的所有仓库。我们通常情况下这里配置的是管理员账户的Token。
索引建立
代码源配置完成后则要等代码数据同步完成并建立完索引才能进行搜索,这个过程的耗时取决于仓库数量的多少,仓库数量多的情况下建议非高峰期或晚上进行代码索引建立同步,以免影响常规使用。
点击左侧菜单里的 Repository status 可以查看仓库同步以及索引建立的状态。
搜索方法
最简单的用法就是输入关键词进行搜,并且搜索框内支持搜索语法的自动完成机制,搜索的方式玩法比较多,例如支持一些特定的搜索过滤条件语法:
Finding matches:
Structural: if(:[my_match]) Regexp: (read|write)File Exact: "fs.open(f)"
Common search keywords:
repo:my/repo file:my/file lang:javascript
Diff/commit search keywords:
type:diff or type:commit after:"2 weeks ago" author:alice@example.com repo:r@*refs/heads/ (all branches)
对于搜索方法的详细说明可以参考:https://docs.sourcegraph.com/@v3.39.1/code_search/reference/queries
搜索效果
sourcegraph的搜索是支持多分支/Tag搜索的,搜索效果如下: