现有的:
gitstats 安装
- git clone git://github.com/hoxu/gitstats.git
- cd gitstats
- make install
- 提示gnuplot not found,需要安装gnuplot
- brew install gnuplot(这个过程很慢,需要安装大量包)
- 使用方式:gitstats 项目目录 输出目录
比较好的可视化网站:https://gitstats.report/
github: https://github.com/arjun27/gitstats
它实现的功能有:
- 近5周的activity summary(activity包括:commits、comments)
- 按项目、按人员筛选
- code review提出者、评论者
项目维度:
- 可以获取gitlab所有项目
- 可以获取某个用户owned所有项目(但无法获取某个用户参与的所有项目)
- 可以获取一个项目的所有成员(可以根据返回的username筛选项目)
commits维度:只能获取指定项目的commits
我要实现的功能及步骤:
- 组管理:只能通过group来获取团队的所有项目。手动录入group信息,再从组中拉取所有项目。
- 所有项目的commit数(可以按成员、日期筛选):x轴是项目,y轴是commit数
- 遍历组,获取每个组下的项目和成员
- 获取所有成员的项目:先获取所有项目,然后根据username进行筛选
- 获取每个项目的commit:循环所有项目,对每个项目获取commit
- 所有成员的commit数(可以按项目、日期筛选):x轴是成员,y轴是commit数
- 获取所有成员的项目:先获取所有项目,然后根据username进行筛选
- 获取每个项目的commit:循环所有项目,对每个项目获取commit
- 把commit分给成员
- 统计+1量
- 统计代码量
- 获取所有成员的项目:先获取所有项目,然后根据username进行筛选
- 获取每个项目的commit:循环所有项目,对每个项目获取commit
- 把commit分给成员
- 对每个成员的commit获取详情,统计行数
如何鉴权?
gitlab提供三种方式进行鉴权,鉴权方式
方案一:使用private token
- 一进入页面时,判断session里是否存在private token,不存在则弹窗让用户输入private token。输入完成后,把private token存入session。然后再发请求。
优点:实现简单
缺点:
- 需要用户手动输入private token
- session有效期过了以后,用户需要重新在gitlab上生成private token(因为gitlab生成token后只能让用户看到一次),然后再输入,比较麻烦
方案二:使用oauth2 token
- 把gitlab当作oauth2服务提供者,注册一个application,设置好回调地址
Callback URL
,会生成Application ID
、Secret
- 通过
https://gitlab.example.com/oauth/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=token&state=YOUR_UNIQUE_STATE_HASH
可以得到一个code,这里我应该使用https://git.xiaojukeji.com/oauth/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=token
,state可以不加。APP_ID就是Application ID
- 得到code后,发起
post
请求至https://gitlab.example/com/oauth/token
,参数是{ "client_id": "APP_ID", "client_secret": "APP_SECRET", "code": "RETURN_CODE", "grant_type": "authorization_code", "redirect_uri": "REDIRECT_URI" }
这样可以得到如下的返回结果,其中access_token
是我们想要的:{ "access_token": "1f0af717251950dbd4d73154fdf0a474a5c5119adad999683f5b450c460726aa", "token_type": "bearer", "expires_in": 7200 }
- 得到
access_token
后,就可以正常发起请求了
过程:
- 初次访问页面时,判断session里是否有token,若有,则直接请求。
- 若无,则重新请求token,存入session
问题:是否会过期?