Zum Hauptinhalt springen

Rate-Limit der GitHub-API: an den Toolcache binden, ein Token mitgeben

Manche Actions rufen während ihrer Ausführung api.github.com auf. setup-go, setup-node und setup-python fragen dort nach einer Liste verfügbarer Versionen, sobald die angegebene Version nicht bereits auf dem Runner liegt. setup-java tut das nur für Distributionen, deren Versionsliste auf GitHub liegt, etwa den Microsoft Build of OpenJDK; Temurin kommt von Adoptium. setup-dotnet installiert .NET aus Microsofts eigenem Feed und ist nicht betroffen. Andere Actions lesen Releases oder Dateien aus GitHub-Repositorys.

GitHub erlaubt 60 nicht authentifizierte Anfragen pro Stunde und IP-Adresse. Gehostete Runner teilen sich ausgehende IP-Adressen, also zehren auch andere Jobs vom selben Kontingent wie deine. Ist es aufgebraucht, scheitert der Schritt:

Error: API rate limit exceeded for 80.158.x.x. (But here's the good news:
Authenticated requests get a higher rate limit. Check out the documentation
for more details.)

Zwei Änderungen verhindern das. Setze die erste in jedem Workflow um, die zweite für jede Action, die GitHub weiterhin erreichen muss.

1. Eine major.minor-Version angeben, damit der Toolcache antwortet

Gehostete Runner bringen bestimmte Versionen von Node.js, Go, Python, Java und .NET in ihrem Toolcache mit: Die Liste steht unter was das Runner-Image enthält. Findet eine setup-*-Action die Version dort, verwendet sie sie direkt und ruft GitHub nicht auf.

Sie findet sie aber nur, wenn du einen Bereich anforderst, den der Toolcache erfüllen kann. Eine vollständige Patch-Version (1.27.2) verfehlt sie, sobald das Runner-Image auf 1.27.3 wechselt; dann fragt die Action api.github.com nach ihrer Versionsliste und lädt von GitHub herunter:

# Misses the toolcache when the image has a newer patch, then calls api.github.com
- uses: actions/setup-go@v5
  with:
    go-version: '1.27.2'

# Resolves from the toolcache: no GitHub call
- uses: actions/setup-go@v5
  with:
    go-version: '1.27'

Dasselbe gilt für node-version: '24', python-version: '3.13' und die übrigen setup-*-Eingaben. Lass check-latest ungesetzt (Standard ist false): Mit check-latest: true fragt die Action bei jedem Lauf GitHub nach der neuesten Version, selbst wenn der Toolcache eine hat.

Eine Datei go.mod, .nvmrc oder .python-version, die über go-version-file und ähnliche Eingaben gelesen wird, nennt meist eine exakte Version und verfehlt den Toolcache daher genauso. Gib stattdessen die major.minor-Version im Workflow an.

2. Actions, die GitHub aufrufen, ein GitHub.com-Token mitgeben

Authentifizierte Anfragen erhalten 5.000 pro Stunde, gezählt für dein Token statt für die geteilte IP-Adresse. Erstelle ein Token auf GitHub.com und gib es der Action mit:

  1. Erstelle auf GitHub.com einen fine-grained personal access token (ein feingranulares persönliches Zugriffstoken) mit Zugriff Public repositories (read-only) und keinen weiteren Berechtigungen. Es muss nur öffentliche Daten lesen.
  2. Speichere es in fremforge als Secret des Repositorys oder der Organisation, zum Beispiel GH_DOTCOM_TOKEN.
  3. Übergib es an die Eingabe token der Action:
- uses: actions/setup-node@v4
  with:
    node-version: '24'
    token: ${{ secrets.GH_DOTCOM_TOKEN }}

setup-go und setup-python nehmen dieselbe Eingabe token an. setup-java ebenfalls, dort zählt sie aber nur für die oben genannten Distributionen. setup-dotnet hat keine Eingabe token und braucht keine. Andere Actions, die GitHub aufrufen, akzeptieren meist token oder github-token; sieh in der Dokumentation der Action nach.

secrets.GITHUB_TOKEN funktioniert hier nicht

Auf fremforge ist secrets.GITHUB_TOKEN (und github.token) das Forgejo-Token des Jobs. Es authentifiziert gegenüber fremforge, nicht gegenüber github.com. Übergibst du es einer Action, die api.github.com aufruft, ändert das also nichts: Die Anfrage zählt weiterhin als nicht authentifiziert. Verwende ein auf GitHub.com erstelltes Token, wie oben beschrieben.

Was fremforge tut und was nicht

  • Das Runner-Image liefert die Versionen von Node.js, Go, Python, Java und .NET, die auf der Seite zum Runner-Image stehen, in seiner Toolcache mit. Ein Workflow, der wie in Schritt 1 eine davon anfordert, braucht GitHub dafür nie. Eine Version außerhalb dieser Liste wird heruntergeladen, und bei setup-go, setup-node und setup-python beginnt das mit einem Aufruf von api.github.com.
  • Die Actions selbst (uses: actions/setup-go@v5 und ähnliche) werden aus den eigenen Spiegeln von fremforge geholt, nicht von GitHub. Das Auflösen einer Action zählt also nie gegen das Limit von GitHub. Siehe Marketplace-Kompatibilität.
  • fremforge fügt keine ausgehenden IP-Adressen hinzu, um das Limit pro IP von GitHub zu verteilen. Die beiden Änderungen oben machen das überflüssig und funktionieren unabhängig von der IP-Adresse.