前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分析 Gitlab 提交记录的命令行工具

分析 Gitlab 提交记录的命令行工具

作者头像
AlphaHinex
发布2024-04-08 12:34:57
1120
发布2024-04-08 12:34:57
举报
文章被收录于专栏:周拱壹卒周拱壹卒

Part1是什么

GitLab Analyser[1] 是一个使用 Golang[2] 编写的跨平台命令行工具。

通过调用 GitLab REST API[3] ,可分析指定项目和分支在某时间范围内的 Commit 情况,包括:

  1. 统计每个提交中修改的所有文件
  2. 统计新增代码行数、减少代码行数 —— 相当于 git diff
  3. 统计有效新增代码行数(忽略空格和换行的新增代码行数)、有效减少代码行数 —— 相当于 git diff -w

统计结果按提交人邮箱进行汇总后,按有效代码总行数排名,并输出至 console。

同时,将所有提交的分析明细数据输出至命令执行路径下 CSV 文件中,还可通过指定 飞书机器人[4] 的 webhook 地址发送统计结果。

主要使用了以下两个 API:

  1. /help/api/projects.md[5]
  2. /help/api/commits.md[6]

Part2怎么用

1获得可执行文件

下载二进制文件

Releases[7] 页面可直接下载为 macOS、Linux、Windows 预编译好的最新发布版二进制文件,平台及架构对应关系如下:

x86_64

arm64

macOS

gitlab_darwin_amd64

gitlab_darwin_arm64

Linux

gitlab_linux_amd64

gitlab_linux_arm64

Windows

gitlab_win_amd64.exe

x

源码编译

预编译版本不满足需求时,可使用源码自行编译。

下载 go-toolkit[8] 仓库代码后,进入 gitlab 路径,在目标使用平台执行 go build 或根据目标平台选择合适的 GOOS/GOARCH 组合[9] 通过 GOOS=linux GOARCH=amd64 go build 编译,获得二进制文件。

2使用示例

GitLab 地址及 Project ID 为必须指定的参数,其余参数均为可选。

  • GitLab 地址为访问 GitLab 仓库的根路径,如:https://gitlab.com/、http://192.168.16.24:8888/ 。
  • Project ID 可从项目首页获得,如 https://gitlab.com/gnachman/iterm2 项目的 ID 为 252461

查看版本及帮助信息

代码语言:javascript
复制
$ ./gitlab -h
   gitlab - Use GitLab API to analyse commits

USAGE:
   gitlab [global options] command [command options] [arguments...]

VERSION:
   v2.1.1

COMMANDS:
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --url value, -u value            GitLab host url, required, like https://gitlab.com/
   --access-token value, -t value   Access token to use GitLab API
   --project-ids value, -p value    Project IDs in GitLab, required, could multi: 5,7-10,13-25
   --branch value, -b value         Branch of project, will analyse all branches if not set
   --since value                    Date of since, from 00:00:00 (default: "2022-01-01")
   --until value                    Date of until, to 23:59:59 (default: "2022-12-31")
   --parallel value                 Number of commit parsers (default: 16)
   --lark value                     Lark webhook url
   --commit-parents commit-parents  Only count the commit has commit-parents number parent(s), 
                                        -1 means counting all commits, 
                                        0 means only counting the initial commit, 
                                        2 means only counting merge request commit, 
                                        1 means exclude initial commit and merge request commit (default: -1)
   --help, -h                       show help (default: false)
   --version, -v                    print the version (default: false)

指定项目、分支、时间范围

分析 iterm2 项目 master 分支 2018 年 7 月代码提交情况:

代码语言:javascript
复制
$ ./gitlab -u https://gitlab.com \
-p 252461 -b master \
--since 2018-07-01 --until 2018-07-31
2023/04/29 11:33:35 Start to analyse master branch of iterm2 project ...
2023/04/29 11:33:37 Load all commits
2023/04/29 11:33:45 Generate 252461_iterm2_master_2018-07-01~2018-07-31.csv use 9.814436582s.

iterm2 项目 master  分支代码分析结果(2018-07-01~2018-07-31)

No. author                                             effLines(ratio) effAdds(ratio) commits files
 1. George Nachman(gnachman@gmail.com)                 25053(85.28%) 20006(85.44%) 143 886
 2. George Nachman(gln@whatsapp.com)                   2050(82.93%) 1314(82.49%) 29 88
 3. Stefan Sundin(git@stefansundin.com)                12(92.31%) 10(90.91%) 3 5
 4. George Nachman(gnachman+github@gmail.com)          10(90.91%) 9(90.00%) 1 3

以上结果统计了 Parent 数量为 -1 的 Commit(时间范围内)
* effLines(有效代码行数)= 有效增加代码行数 + 有效减少代码行数
* effLines ratio(有效代码率)= 有效代码行数 / 总代码行数 * 100%
* effAdds(有效增加行数)= 有效增加代码行数
* effAdds ratio(有效增加率)= 有效增加代码行数 / 总增加代码行数 * 100%
* commits:Commit 总数
* files:文件总数(不去重)
* 有效代码:忽略仅有空格或换行的代码改动,diff -w

忽略初始 Commit 及 Merge Request Commit

--commit-parents 1 排除初始提交和 Merge Request 提交。

设为 0 时仅统计初始化提交,设为 2 时仅统计 Merge Request 提交。

代码语言:javascript
复制
$ ./gitlab -u https://gitlab.com -p 252461 \
-b master --since 2018-07-01 --until 2018-07-31 \
--commit-parents 1
2023/04/29 11:33:56 Start to analyse master branch of iterm2 project ...
2023/04/29 11:33:58 Load all commits
2023/04/29 11:34:07 Generate 252461_iterm2_master_2018-07-01~2018-07-31.csv use 10.985404116s.

iterm2 项目 master  分支代码分析结果(2018-07-01~2018-07-31)

No. author                                             effLines(ratio) effAdds(ratio) commits files
 1. George Nachman(gnachman@gmail.com)                 24824(85.18%) 19861(85.37%) 142 878
 2. George Nachman(gln@whatsapp.com)                   2050(82.93%) 1314(82.49%) 29 88
 3. Stefan Sundin(git@stefansundin.com)                12(92.31%) 10(90.91%) 3 5

以上结果统计了除初始 Commit 和 Merge Request 外的所有 Commit(时间范围内)
* effLines(有效代码行数)= 有效增加代码行数 + 有效减少代码行数
* effLines ratio(有效代码率)= 有效代码行数 / 总代码行数 * 100%
* effAdds(有效增加行数)= 有效增加代码行数
* effAdds ratio(有效增加率)= 有效增加代码行数 / 总增加代码行数 * 100%
* commits:Commit 总数
* files:文件总数(不去重)
* 有效代码:忽略仅有空格或换行的代码改动,diff -w

分析所有分支

不指定分支参数时,可分析所有分支:

代码语言:javascript
复制
$ ./gitlab -p 252461 -u https://gitlab.com/ \
--since 2022-12-24 --until 2023-04-28

分析多个项目

可使用逗号间隔多个项目 ID,- 表示连续的 ID 范围,如

代码语言:javascript
复制
$ ./gitlab -u https://gitlab.com -b master \
-p 5,7-10,13-25,252461 \
--since 2018-07-01 --until 2018-07-29

指定 access token

/-/profile/personal_access_tokens[10] 界面生成 Access Token 后,通过 -t 参数传入,即可访问私有仓库,如:

代码语言:javascript
复制
$ ./gitlab -u https://gitlab.com -t XXXXXX \
-p 6777 -b develop --commit-parents 1

发送飞书通知

获得飞书自定义机器人的 webhook 地址后,通过 --lark 参数传入,即可在分析结束后,将控制台中输出的统计信息,通过飞书机器人发送至飞书群中:

代码语言:javascript
复制
$ ./gitlab -u https://gitlab.com -p 252461 -b master --since 2018-07-01 --until 2018-07-29 \
--lark https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxx

lark

3合并统计结果

分析得到多个明细 CSV 文件时,可以使用如下脚本合并为一个 CSV 以便后续进行使用:

代码语言:javascript
复制
$ cat merge.sh
echo "project\tbranch\tsha\tdate\tauthor\temail\tfilename\tfiletype\toperation\tadd\tdel\taddIgnoreSpace\tdelIgnoreSpace" > merge.csv
cat *_*-*~*-*.csv | grep -v "project\tbranch\tsha\tdate\tauthor\temail\tfilename\tfiletype\toperation\tadd\tdel\taddIgnoreSpace\tdelIgnoreSpace" >> merge.csv

4可视化

生成的 CSV 文件,可以直接使用 RAWGraphs 完成数据可视化,如 iterm2 仓库 master 分支 2022-12-24 ~ 2023-04-28 按提交者统计的新增代码行数及减少代码行数对比:

graph

Part3Gitlab API 分页查询

最后,简单总结一下 GitLab 各 API 的分页接口实现方式:GitLab REST API 的分页,是通过响应头给出元数据信息的,在数据量较大时,接口会自动按分页返回数据,并在响应头中添加 X-Next-Page 头,以标识下一页的页码,可将其作为查询下一页的 page 请求参数值。当 X-Next-Page 值为空时,意味着不再有下一页数据,即完成了全部数据的分页读取。

X-Next-Page 头外,还有其他相关的响应头:X-PageX-Per-PageX-Prev-PageX-TotalX-Total-Pages

参考资料

[1]

GitLab Analyser: https://github.com/AlphaHinex/go-toolkit/tree/main/gitlab

[2]

Golang: https://go.dev/

[3]

GitLab REST API: https://docs.gitlab.com/ee/api/rest/

[4]

飞书机器人: https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN

[5]

/help/api/projects.md: https://docs.gitlab.com/ee/api/projects.html

[6]

/help/api/commits.md: https://docs.gitlab.com/ee/api/commits.html

[7]

Releases: https://github.com/AlphaHinex/go-toolkit/releases

[8]

go-toolkit: https://github.com/AlphaHinex/go-toolkit

[9]

GOOS/GOARCH 组合: https://golang.google.cn/doc/install/source#environment

[10]

/-/profile/personal_access_tokens: https://gitlab.com/-/profile/personal_access_tokens

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 周拱壹卒 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Part1是什么
  • Part2怎么用
    • 1获得可执行文件
      • 下载二进制文件
      • 源码编译
    • 2使用示例
      • 查看版本及帮助信息
      • 指定项目、分支、时间范围
      • 忽略初始 Commit 及 Merge Request Commit
      • 分析所有分支
      • 分析多个项目
      • 指定 access token
      • 发送飞书通知
    • 3合并统计结果
      • 4可视化
        • 参考资料
    • Part3Gitlab API 分页查询
    相关产品与服务
    命令行工具
    腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档