PROBLEM: GitHub rest API limit
Opis problemu
Szukając wersji dla zależności typu github
autoupdater uzywa do tego githubowego rest api. To API ma limit wynoszący 60 zapytan na godzinę na adress IP, oznacza to że jeśli wiele projektów będzie miało takie zależności to ten limit wyczerpie się dość szybko i autoupdater przestanie spełniac swoją role przez godzine.
Propozycja
Wykorzystac API GrapqQL githuba, przykładowy kod zwracający tagi jednego z repo:
import requests
GITHUB_ACCESS_TOKEN = "TUTAJ TOKEN Z GITHUBA"
headers = {"Authorization": f'Bearer {GITHUB_ACCESS_TOKEN}'}
def run_query(query):
request = requests.post('https://api.github.com/graphql', json={'query': query}, headers=headers)
if request.status_code == 200:
return request.json()
else:
raise Exception("Query failed to run by returning code of {}. {}".format(request.text, query))
query = """
query {
rateLimit {
cost
remaining
}
repository(owner: "kubernetes-sigs", name: "kubespray") {
refs(refPrefix: "refs/tags/", last: 1) {
nodes {
repository {
releases(last: 100, orderBy: { field: NAME, direction: ASC}) {
nodes {
name
}
}
}
}
}
}
}
"""
result = run_query(query)
tags = [tag.get('name') for tag in result.get('data').get('repository').get('refs').get('nodes')[0].get('repository').get('releases').get('nodes')]
print(tags)
print(f'Remaining rate limit - {result["data"]["rateLimit"]["remaining"]}')
ZALETY:
- limit na to API jest 5000 na godzine, raczej nie przebijemy
WADY:
- Trzeba miec konto na gihubie
- Trzeba miec token
- nie rozumiem tego api, nie znam go, przykład z internetu z moimi modyfikacjami robi to co chce, ale nie wiem jak stosowac np filtry itp.
PYTANIA JEŚli BEDZIEMY CHCIELI TEGO UŻYĆ:
- jak dostarczac token do aplikacji?
- jako parametr globalny aplikacji, użymamy w CI, czy token dostarczymy do runnerów?
- zahardkodowac w kontenerze, projekt publiczny łatwo można ten limit złamac jakąś pętlą
- czy bez tokenu zopstawić stary sposób, czy jesli nie ma tokenu to dawać warning?
Edited by Krzysztof Szymański