目录
背景
很多开发同学不及时提交代码,经常连续一周代码都没提交过,为了约束开发及时提交,以保证仓库的代码最新的,用统计gitlab(内部本地部署社区版)的提交记录来查看提交情况。
思路
网上的方案大多是查询所有项目,然后把项目的提交记录一个个都抽出来统计。这样实现,查询的量很大(如果仓库里的项目很多,人员也很多的话),加上gitlab接口的限制,耗时很长。
但其中有一篇文章的思路不同,先查出人员,根据人员查事件,再根据事件统计提交信息。
本文就是节借鉴了这个思路。
定义出要统计的人员
gitlab有接口,返回所有的人员数据,/api/v4/users?active=true&private_token=sYrP-6xxxxxxxxx&per_page=100。本文为了方便,直接写死了要查询的人员列表。
查询事件列表
根据人员id及要查询的时间范围、事件类型查询push事件(/api/v4/users/32/events?private_token=sYrP-6xxxxxx&after=2023-09-17&before=2023-09-21&action=pushed)
查询事件详情
根据返回的事件信息,项目id和时间id,查询commits信息(/api/v4/projects/2015/repository/commits/f5744a0bae9672c04824a9953d0c53d670ad191b?private_token=sYrP-6xxxxxxxx)
上一步返回的信息里包含一段stats,包含了代码增、删、合计的量:
实现
import time
import requests
import json
from jsonpath import jsonpath
#定义开始时间和结束时间
stt_time='2023-09-17'
end_time='2023-09-25'
# gitlab里的id和姓名
userlist='[{"id": 294,"name": "张三"},{"id": 293,"name": "李四"}]'
#将uslerlist转为json
userJson=json.loads(userlist)
for row in userJson:
#为防止接口限制,等待3秒
time.sleep(3)
# print(row['id'])
# 根据用户id获取gitlab时间范围内的events
eventsUrl='http://git地址xxx.com/api/v4/users/'+str(row['id'])+'/events?private_token=sYrP-68U9VncMzSYNusx&after='+stt_time+'&before='+end_time+'&action=pushed'
events=requests.get(eventsUrl)
json_data=json.loads(events.content)
# projects=jsonpath(json_data,"$..project_id")
# commits=jsonpath(json_data,"$..push_data.commit_to")
i=1
while i <= len(json_data):
commitsUrl='http://git地址xxxx.com/api/v4/projects/'+str(jsonpath(json_data,"$..project_id")[i-1])+'/repository/commits/'+str(jsonpath(json_data,"$..push_data.commit_to")[i-1])+'?private_token=sYrP-68U9VncMzSYNusx'
commits=requests.get(commitsUrl)
commit_data=json.loads(commits.content)
statsAdditions=jsonpath(commit_data,"$.stats.additions")
statsDeletions=jsonpath(commit_data,"$.stats.deletions")
statsTotal=jsonpath(commit_data,"$.stats.total")
# print(statsAdditions[0])
print(row['name'],"增加:",statsAdditions[0],"删除:",statsDeletions[0],"总:",statsTotal[0])
i=i+1
输出结果如下