我们使用 GitHub Enterprise 作为我们的内部代码库。我们在各个团队中面临的一个常见问题是“拉请求审核周转时间”有时可能是几个“物理天”(许多理想的时间)。
我们正在调整一些工程实践,以防止 PR 变得不必要的大,并允许更快的审核周转时间。但是,我找不到任何东西可以帮助准确跟踪 PR 在合并之前打开的时间。
我们希望使用客观指标来验证我们的一些方法,看看我们是否对审核时间产生有意义的差异,并且“开放 PR 持续时间直到合并”是一个需要跟踪的重要指标。
git/GitHub 有什么可以帮助获取此类指标的东西吗?我试着寻找,但什么也没有出现。
Fbo*_*Fbo 15
GitHub 的 graphQL API 可以帮助您获取拉取请求元数据,例如 PR 何时创建 (createdAt) 以及何时合并 (mergedAt) https://developer.github.com/v4/object/pullrequest/可以使用搜索查询https://developer.github.com/v4/query/#connections搜索所有拉取请求,然后计算合并时间。
此外,您可能对此工具感兴趣https://github.com/change-metrics/monocle因为它提供了 GitHub 存储库的拉取请求指标。除其他各种指标外,该工具还计算“平均合并时间”指标。借助您可以设置的过滤器,您可以获得整个 GitHub 组织、特定存储库、开发人员或一组开发人员的平均合并时间。
我还在寻找一种解决方案,以防止 PR 变得不必要的大,并允许更快的审核周转时间。
我只是想绘制一个“审查 PR 所需的时间”与“代码行数”的图表,以找出理想的 PR 大小。
我尝试了 Monocle,虽然它提供了很多关于 PR 的开箱即用的分析,但缺少这个简单的图表。
最后,我最终编写了不太整洁的脚本来解决这个问题。
首先,通过单击此链接生成令牌https://github.com/settings/tokens
一旦你拥有了令牌
您可以使用以下脚本将绘制所需的数据存储在 csv 文件中。
import requests
from datetime import datetime
import csv
final_dataset = []
fmt = "%Y-%m-%dT%H:%M:%SZ"
page = 1
url = ("https://api.github.com/repos/<OWNER>/<REPO_NAME>/pulls?state=closed&per_page=100&page=%d" % page)
res=requests.get(url,headers={"Authorization": 'Bearer <GIT_HUB_TOKEN>'})
repos=res.json()
while res.json() != []:
print(page)
page= page + 1
url = ("https://api.github.com/repos/<OWNER>/<REPO_NAME>/pulls?state=closed&per_page=100&page=%d" % page)
res=requests.get(url,headers={"Authorization": 'Bearer <GIT_HUB_TOKEN>'})
repos.extend(res.json())
print("Fetching PRs, Please Wait")
for data in repos:
result = {}
created_at = datetime.strptime(data['created_at'], fmt)
closed_at = datetime.strptime(data['closed_at'], fmt)
result['hours_to_review'] = round((closed_at - created_at).total_seconds() / 3600, 2)
url_for_pr = ("https://api.github.com/repos/<OWNER>/<REPO_NAME>/pulls/%d" % data['number'])
res=requests.get(url_for_pr,headers={"Authorization": 'Bearer <GIT_HUB_TOKEN>'})
result['line_of_code'] = res.json()['additions']
result['user_name'] = res.json()['user']['login']
result['pr_number'] = data['number']
final_dataset.append(result)
print("Writing to csv, Please Wait")
keys = final_dataset[0].keys()
with open('pr_review_data.csv', 'w', newline='') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(final_dataset)
print("*************DONE*****************")
Run Code Online (Sandbox Code Playgroud)
现在,您只需将此数据导入 Excel 工作表并绘制图表即可。您还可以使用免费的在线工具(例如https://www.csvplot.com/)来绘制图表。
希望这有帮助
您可以使用 Github Rest Api 获取详细信息。我添加了一个带有示例存储库的示例。我认为对于企业版,您必须使用令牌访问存储库信息(https://github.com/settings/tokens)。在这种情况下,请求 uri 将是
https://api.github.com/repos/srajagop/page-test/pulls?token=xxxxxxxxxxxxxxxxx
例如
async function timeElapsed(){
let response = await fetch('https://api.github.com/repos/srajagop/page-test/pulls');
let jsonData = await response.json();
let diff = new Date().getTime() - new Date(Date.parse('2019-04-26T05:56:33Z')).getTime();
let hoursElapsed = Math.ceil(diff / (1000 * 60 * 60));
return hoursElapsed;
}
timeElapsed().then(data => console.log("Hours elapsed", data));
Run Code Online (Sandbox Code Playgroud)