GitLab-codex 代码统计

乐云一
  • GitHub
  • GitHub
About 846 wordsAbout 3 min

GitLab API

通过GitLab提供的各API,解析获得一份GitLab中,从项目维度、时间维度、人员维度、分组维度出发的,各个报表、图表等等;

成品

项目地址

GitLab-codexopen in new window

可直接享用的GitLab代码统计项目,前端包括页面已经完成;

成品图

等等...

功能:

  • 所有成员的所有项目代码量总和统计。
  • 成员与项目绑定关系。
  • 项目 - 成员,组成查询时间范围内的提交历史,包含:提交信息,新增代码量,删除代码量,代码总和。
  • 成员Git账号与真实姓名的绑定设置
  • 成员根据真实部门的自由分组

图表

  • 人员随时间的代码提交情况
  • 人员在指定项目中随时间的代码提交情况
  • 小组部门随时间的代码提交情况
  • 人员时间范围内总代码量排名
  • 小组部门时间范围内总代码量排名

实现思路

GitLab解析

1\拿到所有可见的项目

2\拿到项目下的所有分支

3\拿到所有分支下的提交记录

4\对所有提交记录进行内容解析

提交者,时间,提交者与提交项目关联,本次提交量,提交者累计提交量...

5\将所有表的数据清空

因为代码统计属于每天进行一次全量同步的方式

所以重新同步时,最好将前一次的同步信息清空

6\将收集到的数据进行批量插入或更新

使用 ON DUPLICATE key update

    INSERT INTO x_commit
    (id,commit_date,committer_email,committer_name,title,project_id,message,additions,deletions,total,storage_url)
        VALUES
        <foreach collection="commits" item="item" separator=",">
            (#{item.id},#{item.commitDate},#{item.committerEmail},#{item.committerName},#{item.title},#{item.projectId},#{item.message}
            ,#{item.additions},#{item.deletions},#{item.total},#{item.storageUrl})
        </foreach>
        ON DUPLICATE key update
        id = values(id),
        commit_date = values(commit_date),
        committer_email = values(committer_email),
        committer_name = values(committer_name),
        title = values(title),
        project_id = values(project_id),
        message = values (message),
        additions = values(additions),
        deletions = values(deletions),
        total = values(total),
        storage_url = values(storage_url)

定时操作

定时原因: 每天进行一个全量同步

推荐

定时的方式很多,可使用Spring-task、Quartz、线程...等等

方法很多,但是我推荐使用XXL-JOB

XXL—Job任务调度中心open in new window

原因

因为会出现多个GitLab仓库需要进行统一的统计的原因;

所以需要通过自定义的去给GitLabApi对象进行不同的

url、privateToken 入参;

所以外置的定时调度中心做这件事刚刚好

    @XxlJob(value = "git_summary")
    @Override
    public void execute() {
        String jobParam = XxlJobHelper.getJobParam();
        String[] split = jobParam.split("#");
        String token = null;
        String url = null;
        if(split.length>1){
            //自定义时间场景
            url = split[0];
            token = split[1];
        }
 codexSummaryService.summaryCodeX(url,token);
    }
    public void summaryCodeX(String url, String token) {
        GitLabAPIService gitLabAPIService = GitLabAPIService.buildGitApiService(new GitLabApi(url, token));
        ......
    public static GitLabAPIService buildGitApiService(GitLabApi gitLabApi){
        return new GitLabAPIService(gitLabApi);
    }
Last update:
Contributors: leyunone
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v2.14.7