Hoppa till huvudinnehållet

GitHubs API-gräns: lås till toolcachen, skicka med en token

Vissa actions anropar api.github.com medan de körs. setup-go, setup-node och setup-python ber där om en lista över tillgängliga versioner när den version du angett inte redan finns på runnern. setup-java gör samma sak, men bara för distributioner vars versionslista finns på GitHub, till exempel Microsoft Build of OpenJDK; Temurin hämtas från Adoptium. setup-dotnet installerar .NET från Microsofts eget flöde och påverkas inte. Andra actions läser releaser eller filer från GitHub-repon.

GitHub tillåter 60 oautentiserade förfrågningar per timme och IP-adress. Hostade runners delar utgående IP-adresser, så andra jobb förbrukar samma kvot som dina. När den tar slut misslyckas 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.)

Två ändringar förhindrar det. Gör den första i varje arbetsflöde; gör den andra för varje action som fortfarande måste nå GitHub.

1. Lås en major.minor-version så att toolcachen svarar

Hostade runners har bestämda versioner av Node.js, Go, Python, Java och .NET i sin toolcache: listan finns på vad runner-imagen innehåller. En setup-*-action som hittar versionen där använder den direkt och gör inget anrop till GitHub.

Den hittar den bara om du ber om ett intervall som toolcachen kan uppfylla. En fullständig patchversion (1.27.2) missar så fort runner-imagen går över till 1.27.3, och då ber actionen api.github.com om sin versionslista och laddar ned från 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'

Detsamma gäller node-version: '24', python-version: '3.13' och de andra setup-*-indata. Lämna check-latest oangivet (standardvärdet är false): med check-latest: true frågar actionen GitHub efter den senaste versionen vid varje körning, även när toolcachen har en.

En go.mod-, .nvmrc- eller .python-version-fil som läses via go-version-file och liknande indata anger oftast en exakt version och missar därför toolcachen på samma sätt. Ange major.minor-versionen i arbetsflödet i stället.

2. Skicka med en GitHub.com-token till actions som anropar GitHub

Autentiserade förfrågningar får 5 000 per timme, som räknas mot din token i stället för mot den delade IP-adressen. Skapa en token på GitHub.com och ge den till actionen:

  1. Skapa en fine-grained personal access token (en finkornig personlig åtkomsttoken) på GitHub.com med åtkomsten Public repositories (read-only) och inga andra behörigheter. Den behöver bara läsa offentliga data.
  2. Spara den i fremforge som en secret för repot eller organisationen, till exempel GH_DOTCOM_TOKEN.
  3. Skicka den till actionens indata token:
- uses: actions/setup-node@v4
  with:
    node-version: '24'
    token: ${{ secrets.GH_DOTCOM_TOKEN }}

setup-go och setup-python tar samma indata token. Det gör setup-java också, men där spelar den bara roll för distributionerna ovan. setup-dotnet har ingen indata token och behöver ingen. Andra actions som anropar GitHub accepterar oftast token eller github-token; läs actionens dokumentation.

secrets.GITHUB_TOKEN fungerar inte här

På fremforge är secrets.GITHUB_TOKEN (och github.token) jobbets Forgejo-token. Den autentiserar mot fremforge, inte mot github.com, så att skicka den till en action som anropar api.github.com ändrar ingenting: förfrågan räknas fortfarande som oautentiserad. Använd en token som skapats på GitHub.com, enligt ovan.

Vad fremforge gör, och inte gör

  • Runner-imagen har de versioner av Node.js, Go, Python, Java och .NET som står på sidan om runner-imagen i sin toolcache. Ett arbetsflöde som ber om en av dem enligt steg 1 behöver aldrig GitHub för den. En version utanför listan laddas ned, och för setup-go, setup-node och setup-python börjar det med ett anrop till api.github.com.
  • Själva actions (uses: actions/setup-go@v5 och liknande) hämtas från fremforges egna speglar, inte från GitHub, så att lösa upp en action räknas aldrig mot GitHubs gräns. Se Marketplace-kompatibilitet.
  • fremforge lägger inte till utgående IP-adresser för att sprida GitHubs gräns per IP. De två ändringarna ovan tar bort behovet, och de fortsätter att fungera oavsett IP-adress.