原创不易,但愿能关注下咱们,再顺手点个赞~~ |
本文首发于政采云前端团队博客: GitLab Open API 代码量统计,让你的努力被老板看到前端
敦煌系统 是咱们政采云前端团队自研的项目开发全流程管理系统,目标是将项目开发的各流程所有管理起来。从项目建立,代码初始,到代码的本地开发,提测交付,测后发布,版本回滚,数据统计等。本文即是该系统中远程项目建立及数据统计部分的实现原理。后续陆续会有敦煌系统其他部分技术文章发布。欢迎你们先关注微信公众号 “政采云前端团队”,或者掘金上关注 “政采云前端团队”,以便第一时间获取最新信息。vue
本文主要介绍如何经过 GitLab Open API 进行项目建立、初始化代码及团队代码量统计。前端工程化建设过程当中,须要经过 Node 服务端进行 Git 仓库建立、项目初始化和代码量统计。通过一段时间开发探索,初步实现了需求。这里作个记录总结。node
看过 GitLab Open API 文档的人很容易就能找到建立接口,不过在建立以外咱们还须要导入项目模板,修改相应的项目名称,描述,做者等信息。这涉及到多个接口的组合调用。react
一、API 前缀 https://GitLabHost/api/v4
,全部 GitLab Open API 都以此为前缀,举个建立项目接口的例子: https://GitLabHost/api/v4/projects
。git
二、每一个请求都须要带上建立者的 Private Token 做为参数。且要求该建立者有对应的权限。我这里使用了统一的用户 Front 作为建立人。这样一来建立项目就不须要获取每一个用户的 Private Token 了。这样作还有个好处:统计代码量时,这部分复制代码的代码量会被算在 Front 这个虚拟用户上,减小统计偏差。数据库
建立项目json
POST /projects (此处只列中关键参数,更多参数请查看 GitLab 文档)
参数:
name: 项目名(不传 path 参数的话必填)
path: 项目路径(不传 name 参数的话必填)
namespace_id: 建立项目所在 Git 组的 id
description: 项目描述
import_url: 初始化项目的代码路径,格式:https://user:password@host/path.git
复制代码
经过调用以上接口就能够在目标 Git 组中建立出一个带有初始化模板的项目了。后端
建立项目须要注意的是:前端工程化
一、Front 要拥有目标 Git 组的 Master 权限才能够建立。这里就要求提早把 Front 加入到目标组中并赋予 Master 权限。以 front-test 组为例:api
二、当前用户也须要作权限判断,这里须要开发者在建立以前调用 GET /groups/:id/members
接口获取组别用户并对比当前人是否有权限建立了。好比:
access_level 就是权限值,分别对应为
10 => Guest 权限
20 => Reporter 权限
30 => Developer 权限
40 => Master 权限
50 => Owner 权限
复制代码
初始化项目信息
建立完项目以后要初始化项目信息,细心的同窗能够发现上面建立好的项目中的 README.md 里面的 name ,desc 尚未被替换掉,接下来咱们就要替换包括 README.md 和 Package.json 两个文件中的一些关键信息了。
读取对应的文件,这里直接在浏览器中访问对应文件而后把路径中的 blob 改为 raw 就能够直接读取到对应的文件信息了。
举个例子:https://GitLabHost/f2e-cube/template/leo-middle-react-pc-project/blob/master/README.md
这个连接能够直接访问到项目文件页面,但获得却不是单纯的文件信息。
把 blob 改为 raw 即直接访问 https://GitLabHost/f2e-cube/template/leo-front-vue-pc-component/raw/master/README.md
就能够直接获取到文件内容了。
读取到文件信息以后,使用 Node 模板引擎把对应的数据注入到获取的文件信息中就能够了。这里服务端使用的是 EggJs 框架。模板引擎选用 Ejs 。
关键代码:
const result = await this.ctx.renderString(readMeStr, {
author: userInfo.userName,
name: gitProjectInfo.name,
description: project.desc,
...others,
});
复制代码
将渲染完成的字符串提交到已经建立的项目中。使用到建立 Commit 接口。
POST /projects/:id/repository/commits (此处只列中关键参数,更多参数请查看 GitLab 文档)
参数:
id: 项目 id (刚刚建立好项目时有返回项目信息,里面包含项目 id)
branch: 分支(这里通常是 Master )
commit_message: commit 信息
actions: [] 修改项
action: 变动类型 create, delete, move, update (这里是 update)
file_path: 变动文件的路径
content: 变动后的内容即上面代码中的 result
复制代码
至此,项目建立并初始化完成!
能够看到 name 和 desc 已经被替换成相应的项目名及中文描述了。
代码量统计,在百度,谷歌搜索一下能搜出来一大把,可是基本上都是代码拉到本地后,执行命令获取项目的代码量或者项目代码的贡献者的代码量。比较广泛的方案是给项目加 Git Hook 。在项目提交以前调用请求把当前提交的代码量传给后端进行储存统计。这样作的弊端有
一、须要全部的项目都加上 Git Hook 。对于几十上百个历史项目的团队而言是个不小问题。
二、历史数据统计不到。
GitLab API 中有个实体叫作 Event ,用户每一个操做都会有对应的 Event 产生并储存。咱们这里即是经过 Event 进行代码量统计。
基本信息
https://GitLabHost/api/v4
获取全部须要统计代码量的用户的用户名
首先经过钉钉接口获取团队全部用户的用户名(团队钉钉用户名和 Git 用户名相同)。这一步对于不是太大的团队能够经过手动获取。
获取对应用户的 Git Id (若是团队人员少,可手动收集)
经过 GET /users?username=:username
接口获取用户对应的 Git User 的 Id 。
查询用户的 Event
获取到全部用户 Id 以后就能够调用 GET /users/:id/events
这个接口查询到当前用户的全部 Event 。这里会包括有 Push 的 Event 。Event 中会有对应 Commit 信息和项目信息。不过这里的 Commit 信息不全,不包含添加多少行代码,删除多少行代码,总共多少行代码的信息。
获取 Commit 的详细信息
经过上一步获取的 Commit 信息中的 Id 和项目 Id 再查询 Commit 的详细信息: GET /projects/:id/repository/commits/:sha
。这里这里就能够获取到 Commit 的 Stats 信息了。里面包含 additions, deletions, total 信息。
存数据库并设定定时任务
将获取到的数据存入数据库就能够作代码量统计了。而后设置定时任务,每周跑一次或两次进行代码量统计。
须要注意的有
问题
后续
其实最开始的文章,咱们没有表述清楚,是咱们写稿和审稿没注意到“代码量审核”会对一些看官带来困扰。你们所处公司不同,可能确实会有部分公司,会以代码量的多少来简单粗暴的计算员工的 KPI,这点咱们一样以为是不妥的。文中说起的代码及代码量的目的,在于便于接入团队的代码合规检测(如兼容性 api 检测、lint 检测)服务,也在于便于从数据维度进行量化,验证架构的升级和基础设施的完善,对同窗工做量的下降,能够有数据指标进行说明。咱们但愿基于技术、架构的升级,基础设施和工具链路的完善,帮咱们作到接近 less code 的目标,帮咱们的同窗变得更“懒”,能腾出更多时间去去关注和研究对业务的将来、我的的将来更有价值的事。也但愿你能一块儿加入,帮咱们更快接近、达到这一目标。
招人,前端,隶属政采云前端大团队(ZooTeam),50 余个小伙伴正等你加入一块儿浪。若是你想改变一直被事折腾,但愿开始能折腾事;若是你想改变一直被告诫须要多些想法,却无从破局;若是你想改变你有能力去作成那个结果,却不须要你;若是你想改变你想作成的事须要一个团队去支撑,但没你带人的位置;若是你想改变既定的节奏,将会是“5年工做时间3年工做经验”;若是你想改变原本悟性不错,但老是有那一层窗户纸的模糊… 若是你相信相信的力量,相信平凡人能成就非凡事,相信能遇到更好的本身。若是你但愿参与到随着业务腾飞的过程,亲手参与一个有着深刻的业务理解、完善的技术体系、技术创造价值、影响力外溢的前端团队的成长历程,我以为咱们该聊聊。任什么时候间,等着你写点什么,发给 ZooTeam@cai-inc.com