Wie kann ich nachverfolgen, wie lange Pull-Requests auf GitHub offen sind?

Lesezeit: 5 Minuten

Benutzeravatar von PhD
Promotion

Wir verwenden GitHub Enterprise für unsere interne Codebasis. Ein häufiges Problem, mit dem wir teamübergreifend konfrontiert sind, ist die „Bearbeitungszeit für Pull-Request-Überprüfungen“, die manchmal einige „physische Tage“ (viele ideale Stunden) betragen kann.

Wir optimieren einige technische Verfahren, um zu verhindern, dass PRs unnötig groß werden, und um schnellere Bearbeitungszeiten für Bewertungen zu ermöglichen. Ich konnte jedoch nichts finden, um genau zu verfolgen, wie lange PRs geöffnet waren, bevor sie zusammengeführt wurden.

Wir würden gerne objektive Metriken verwenden, um einige unserer Ansätze zu validieren, um zu sehen, ob wir bedeutende Unterschiede zu den Überprüfungszeiten machen, und „Open-PR-Dauer bis zur Zusammenführung“ ist eine wichtige Metrik, die es zu verfolgen gilt.

Hat git/GitHub irgendetwas, das helfen könnte, solche Metriken zu erhalten? Ich habe versucht zu suchen, aber es wird nirgendwo etwas angezeigt.

Benutzeravatar von Fbo
Fbo

Die graphQL-API von GitHub könnte Ihnen helfen, Metadaten von Pull-Anforderungen zu erhalten, z. B. wann die PR erstellt wurde (createdAt) und wann sie zusammengeführt wurde (mergedAt). https://developer.github.com/v4/object/pullrequest/
Sie können alle Pull-Requests mit der Suchabfrage durchsuchen https://developer.github.com/v4/query/#connections Berechnen Sie dann die Zeit zum Zusammenführen.

Dieses Tool könnte Sie auch interessieren https://github.com/change-metrics/monocle da es Pull-Request-Metriken für GitHub-Repositories bereitstellt. Neben anderen Metriken berechnet das Tool die Metriken „Mean time to merge“. Dank der Filter, die Sie festlegen konnten, konnten Sie die durchschnittliche Zeit zum Zusammenführen für die gesamte GitHub-Organisation, ein bestimmtes Repository oder einen bestimmten Entwickler oder eine Gruppe von Entwicklern ermitteln.

  • Monocle hört sich gut an – ich sollte es versuchen. Ich denke, es könnte auch funktionieren stash Repos auch, oder?

    – Promotion

    14. Mai 2020 um 20:23 Uhr

  • @PhD Nach dem, was ich über Stash verstehe, denke ich, nein, da Monocle derzeit nur Crawler für GitHub und Gerrit bereitstellt. Es scheint, dass Stash und Bitbucket dasselbe sind, nun, das könnte eine gute Ergänzung in Monocle sein, um den Bitbucket-Crawler hinzuzufügen.

    – FBO

    15. Mai 2020 um 6:58 Uhr

Benutzeravatar von kartikey rajvaidya
kartikey rajvaidya

  • Ich suchte auch nach einer Lösung, um zu verhindern, dass PRs unnötig groß werden, und um schnellere Bearbeitungszeiten bei der Überprüfung zu ermöglichen.

  • Ich wollte einfach ein Diagramm von „Stunden, die für die Überprüfung eines PR erforderlich sind“ und „Codezeilen“ zeichnen, um herauszufinden, was die ideale PR-Größe ist.

  • Ich habe Monocle ausprobiert, und obwohl es viele Analysen rund um die PR liefert, fehlte diese einfache Grafik.

  • Endlich habe ich meine geschrieben NICHT SO ORDENTLICH Skript zur Lösung dieses Problems.

Generieren Sie zunächst ein Token, indem Sie auf diesen Link klicken https://github.com/settings/tokens

Sobald Sie das Token haben

Sie können das folgende Skript verwenden, um die zum Plotten erforderlichen Daten in einer csv-Datei zu speichern.

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*****************")

Sie können diese Daten jetzt einfach in ein Excel-Blatt importieren und ein Diagramm zeichnen. Sie können auch kostenlose Online-Tools wie verwenden https://www.csvplot.com/ zum Zeichnen eines Diagramms.

Hoffe, das war hilfreich

  • Dieser Code war wirklich wertvoll, um meine eigene Analyse der Verteilung der Time-to-Close für PRs zu erhalten. Allerdings ist bei der Berechnung ein Fehler unterlaufen: / 360 sollte sein /3600 an der Zeile, wo die Umrechnung von Sekunden in Stunden vorgenommen wird.

    – Grigory Rechistov

    20. Oktober 2022 um 11:39 Uhr

Benutzeravatar von karthick
karthick

Sie können die Github Rest Api verwenden, um die Details abzurufen. Ich habe ein Beispiel mit einem Beispiel-Repo hinzugefügt. Ich denke, für Enterprise Editions müssen Sie mit Token auf die Repo-Informationen zugreifen (https://github.com/settings/tokens). In diesem Fall lautet die Anfrage uri

https://api.github.com/repos/srajagop/page-test/pulls?token=xxxxxxxxxxxxxxxxxx

Zum Beispiel

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)); 

1447580cookie-checkWie kann ich nachverfolgen, wie lange Pull-Requests auf GitHub offen sind?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy