Rate limit van de GitHub-API: pin op de toolcache, geef een token mee
Sommige actions roepen tijdens het draaien api.github.com aan. setup-go, setup-node en setup-python vragen daar een lijst met beschikbare versies op zodra de versie die je opgeeft nog niet op de runner staat. setup-java doet dat alleen voor distributies waarvan de versielijst op GitHub staat, zoals de Microsoft Build of OpenJDK; Temurin komt van Adoptium. setup-dotnet installeert .NET vanuit de eigen feed van Microsoft en heeft hier geen last van. Andere actions lezen releases of bestanden uit GitHub-repository’s.
GitHub staat 60 niet-geauthenticeerde verzoeken per uur per IP-adres toe. Gehoste runners delen uitgaande IP-adressen, dus andere jobs verbruiken hetzelfde tegoed als die van jou. Is het op, dan mislukt de stap:
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.)Twee aanpassingen voorkomen dit. Doe de eerste in elke workflow; doe de tweede voor elke action die GitHub toch nog moet bereiken.
1. Pin een major.minor-versie, zodat de toolcache antwoordt
Gehoste runners hebben specifieke versies van Node.js, Go, Python, Java en .NET in hun toolcache: de lijst staat op wat de runner-image bevat. Een setup-*-action die de versie daar vindt, gebruikt die direct en doet geen aanroep naar GitHub.
Hij vindt die alleen als je vraagt om een bereik dat de toolcache kan leveren. Een volledige patchversie (1.27.2) mist zodra de runner-image naar 1.27.3 gaat, en de action vraagt dan api.github.com om zijn versielijst en downloadt van GitHub:
# 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'Hetzelfde geldt voor node-version: '24', python-version: '3.13' en de andere setup-*-inputs. Laat check-latest leeg (de standaardwaarde is false): met check-latest: true vraagt de action bij elke run GitHub om de nieuwste versie, ook als de toolcache er een heeft.
Een go.mod-, .nvmrc- of .python-version-bestand dat je via go-version-file en vergelijkbare inputs inleest, noemt meestal een exacte versie en mist de toolcache dus op dezelfde manier. Noem de major.minor-versie in plaats daarvan in de workflow.
2. Geef een GitHub.com-token mee aan actions die GitHub aanroepen
Geauthenticeerde verzoeken krijgen er 5.000 per uur, geteld op je token in plaats van op het gedeelde IP-adres. Maak een token aan op GitHub.com en geef het aan de action:
- Maak op GitHub.com een fine-grained personal access token (een fijnmazig persoonlijk toegangstoken) aan met toegang Public repositories (read-only) en verder geen rechten. Het hoeft alleen openbare gegevens te lezen.
- Sla het in fremforge op als secret van een repository of organisatie, bijvoorbeeld
GH_DOTCOM_TOKEN. - Geef het mee aan de input
tokenvan de action:
- uses: actions/setup-node@v4
with:
node-version: '24'
token: ${{ secrets.GH_DOTCOM_TOKEN }}setup-go en setup-python hebben dezelfde input token. setup-java ook, maar daar telt die alleen voor de distributies hierboven. setup-dotnet heeft geen input token en heeft er geen nodig. Andere actions die GitHub aanroepen, accepteren meestal token of github-token; kijk in de documentatie van de action.
secrets.GITHUB_TOKEN werkt hier niet
Op fremforge is secrets.GITHUB_TOKEN (en github.token) het Forgejo-token van de job. Het authenticeert bij fremforge, niet bij github.com, dus als je het meegeeft aan een action die api.github.com aanroept, verandert er niets: het verzoek telt nog steeds als niet-geauthenticeerd. Gebruik een token dat je op GitHub.com hebt aangemaakt, zoals hierboven.
Wat fremforge wel en niet doet
- De runner-image levert de versies van Node.js, Go, Python, Java en .NET die op de pagina over de runner-image staan, mee in de toolcache. Een workflow die zoals in stap 1 om een daarvan vraagt, heeft GitHub daarvoor nooit nodig. Een versie buiten die lijst wordt gedownload, en bij
setup-go,setup-nodeensetup-pythonbegint dat met een aanroep naarapi.github.com. - De actions zelf (
uses: actions/setup-go@v5en dergelijke) worden opgehaald uit de eigen mirrors van fremforge, niet van GitHub, dus het ophalen van een action telt nooit mee voor de limiet van GitHub. Zie Marketplace-compatibiliteit. - fremforge voegt geen uitgaande IP-adressen toe om de limiet per IP van GitHub te spreiden. De twee aanpassingen hierboven maken dat overbodig, en ze blijven werken, welk IP-adres het ook is.