mirror of
https://github.com/changesets/action
synced 2026-10-26 16:39:56 +08:00
Add a throttling plugin to the used Octokit instance to retry requests after hitting secondary rate limits (#286)
* fix: prevent hitting github secondary rate limits Adds the octokit plugin for throttling / rate-limiting to fix the problem where action runs get blocked with a 403 error[1]. The `github.getOctokit`[2] function accepts a list of plugins, so this passes in the `throttling` plugin[3] to be hooked into the octokit instance. It also needs some configuration to setup the `throttle` mechanisms, passed in to the `getOctokit` function. [1]: https://github.com/changesets/action/issues/192 [2]: https://github.com/actions/toolkit/blob/main/packages/github/src/github.ts#LL18C40-L18C40 [3]: https://github.com/octokit/plugin-throttling.js * refactor: change rate limit callback signatures Based on additional docs, the callbacks seem to have changes to their signatures[1]. This change aligns this implementation with the docs[2]. [1]: https://octokit.github.io/rest.js/v19#throttling [2]: https://github.com/octokit/plugin-throttling.js/blob/v5.1.1/src/index.ts#L90-L91 * chore: add changeset * wire up typed throttle options * Upgrade TS * refactor: use console based logging * Update .changeset/rotten-carrots-pump.md --------- Co-authored-by: Mateusz Burzyński <mateuszburzynski@gmail.com>
This commit is contained in:
co-authored by
Mateusz Burzyński
parent
595655c3ea
commit
225a1e8cbc
+36
-1
@@ -1,4 +1,5 @@
|
||||
import { exec, getExecOutput } from "@actions/exec";
|
||||
import { GitHub, getOctokitOptions } from "@actions/github/lib/utils";
|
||||
import * as github from "@actions/github";
|
||||
import fs from "fs-extra";
|
||||
import { getPackages, Package } from "@manypkg/get-packages";
|
||||
@@ -14,6 +15,9 @@ import {
|
||||
import * as gitUtils from "./gitUtils";
|
||||
import readChangesetState from "./readChangesetState";
|
||||
import resolveFrom from "resolve-from";
|
||||
import { throttling } from "@octokit/plugin-throttling";
|
||||
// temporary workaround for https://github.com/octokit/plugin-throttling.js/pull/590
|
||||
import type {} from "@octokit/plugin-throttling/dist-types/types.d";
|
||||
|
||||
// GitHub Issues/PRs messages have a max size limit on the
|
||||
// message body payload.
|
||||
@@ -78,7 +82,38 @@ export async function runPublish({
|
||||
createGithubReleases,
|
||||
cwd = process.cwd(),
|
||||
}: PublishOptions): Promise<PublishResult> {
|
||||
let octokit = github.getOctokit(githubToken);
|
||||
const octokit = new (GitHub.plugin(throttling))(
|
||||
getOctokitOptions(githubToken, {
|
||||
throttle: {
|
||||
onRateLimit: (retryAfter, options: any, octokit, retryCount) => {
|
||||
console.log(
|
||||
`Request quota exhausted for request ${options.method} ${options.url}`
|
||||
);
|
||||
|
||||
if (retryCount <= 2) {
|
||||
console.log(`Retrying after ${retryAfter} seconds!`);
|
||||
return true;
|
||||
}
|
||||
},
|
||||
onSecondaryRateLimit: (
|
||||
retryAfter,
|
||||
options: any,
|
||||
octokit,
|
||||
retryCount
|
||||
) => {
|
||||
console.log(
|
||||
`SecondaryRateLimit detected for request ${options.method} ${options.url}`
|
||||
);
|
||||
|
||||
if (retryCount <= 2) {
|
||||
console.log(`Retrying after ${retryAfter} seconds!`);
|
||||
return true;
|
||||
}
|
||||
},
|
||||
},
|
||||
})
|
||||
);
|
||||
|
||||
let [publishCommand, ...publishArgs] = script.split(/\s+/);
|
||||
|
||||
let changesetPublishOutput = await getExecOutput(
|
||||
|
||||
Reference in New Issue
Block a user