Frekvensgrensen i GitHub-API-et: lås til verktøybufferen, send med et token
Noen actions kaller api.github.com mens de kjører. setup-go, setup-node og setup-python ber om en liste over tilgjengelige versjoner hver gang versjonen du har angitt, ikke allerede finnes på runneren. setup-java gjør det samme bare for distribusjoner der versjonslisten ligger på GitHub, for eksempel Microsoft Build of OpenJDK; Temurin hentes fra Adoptium. setup-dotnet installerer .NET fra Microsofts egen feed og berøres ikke. Andre actions leser releaser eller filer fra GitHub-repositoryer.
GitHub tillater 60 uautentiserte forespørsler per time per IP-adresse. Hostede runnere deler utgående IP-adresser, så andre jobber bruker av den samme kvoten som dine. Når den er brukt opp, feiler steget:
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.)To endringer hindrer dette. Gjør den første i alle workflower; gjør den andre for alle actions som fortsatt må nå GitHub.
1. Lås til en major.minor-versjon, så verktøybufferen svarer
Hostede runnere har bestemte versjoner av Node.js, Go, Python, Java og .NET i verktøybufferen sin: listen står på hva runner-imaget inneholder. En setup-*-action som finner versjonen der, bruker den direkte og gjør ingen kall til GitHub.
Den finner den bare hvis du ber om et område verktøybufferen kan dekke. En fullstendig patchversjon (1.27.2) bommer så snart runner-imaget går over til 1.27.3, og actionen ber da api.github.com om versjonslisten sin og laster ned fra 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'Det samme gjelder node-version: '24', python-version: '3.13' og de andre setup-*-inputene. La check-latest være utelatt (standardverdien er false): med check-latest: true ber actionen GitHub om nyeste versjon ved hver kjøring, selv når verktøybufferen har en.
En go.mod-, .nvmrc- eller .python-version-fil som leses gjennom go-version-file og lignende inputer, angir som regel en eksakt versjon og bommer derfor på verktøybufferen på samme måte. Angi major.minor-versjonen i workflowen i stedet.
2. Send med et GitHub.com-token til actions som kaller GitHub
Autentiserte forespørsler får 5 000 per time, som telles mot tokenet ditt i stedet for den delte IP-adressen. Opprett et token på GitHub.com og gi det til actionen:
- Opprett et fine-grained personal access token (et finmasket personlig tilgangstoken) på GitHub.com med tilgangen Public repositories (read-only) og ingen andre tillatelser. Det trenger bare å lese offentlige data.
- Lagre det i fremforge som en repository- eller organisasjons-secret, for eksempel
GH_DOTCOM_TOKEN. - Send det til actionens
token-input:
- uses: actions/setup-node@v4
with:
node-version: '24'
token: ${{ secrets.GH_DOTCOM_TOKEN }}setup-go og setup-python tar den samme token-inputen. Det gjør setup-java også, men der har den bare betydning for distribusjonene ovenfor. setup-dotnet har ingen token-input og trenger ingen. Andre actions som kaller GitHub, godtar som regel token eller github-token; se dokumentasjonen til actionen.
secrets.GITHUB_TOKEN virker ikke her
På fremforge er secrets.GITHUB_TOKEN (og github.token) jobbens Forgejo-token. Det autentiserer mot fremforge, ikke mot github.com, så å sende det til en action som kaller api.github.com, endrer ingenting: forespørselen telles fortsatt som uautentisert. Bruk et token som er opprettet på GitHub.com, som beskrevet over.
Hva fremforge gjør, og ikke gjør
- Runner-imaget har versjonene av Node.js, Go, Python, Java og .NET som står på siden om runner-imaget, i verktøybufferen. En workflow som ber om en av dem som i steg 1, trenger aldri GitHub for den. En versjon utenfor listen lastes ned, og for
setup-go,setup-nodeogsetup-pythonbegynner det med et kall tilapi.github.com. - Selve actionene (
uses: actions/setup-go@v5og lignende) hentes fra fremforges egne speil, ikke fra GitHub, så det å løse opp en action teller aldri mot GitHubs grense. Se Marketplace-kompatibilitet. - fremforge legger ikke til utgående IP-adresser for å spre GitHubs grense per IP. De to endringene over fjerner behovet, og de fortsetter å virke uansett IP-adresse.