diff --git a/action.yml b/action.yml index 9aa5db2c5..b9bdb9475 100644 --- a/action.yml +++ b/action.yml @@ -23,6 +23,9 @@ inputs: required: false env: 'GITHUB_TOKEN': 'As provided by Github Actions' +outputs: + url: + description: 'URL to the Release HTML Page' runs: using: 'node12' main: 'lib/main.js' diff --git a/lib/github.js b/lib/github.js index 2a6de0244..58c201eb4 100644 --- a/lib/github.js +++ b/lib/github.js @@ -31,7 +31,8 @@ class GitHubReleaser { return this.github.repos.createRelease(params); } allReleases(params) { - return this.github.paginate.iterator(this.github.repos.listReleases.endpoint.merge(params)); + const updatedParams = Object.assign({ per_page: 100 }, params); + return this.github.paginate.iterator(this.github.repos.listReleases.endpoint.merge(updatedParams)); } } exports.GitHubReleaser = GitHubReleaser; diff --git a/lib/main.js b/lib/main.js index ddc454b7d..cac66884d 100644 --- a/lib/main.js +++ b/lib/main.js @@ -21,7 +21,21 @@ function run() { if (!util_1.isTag(config.github_ref)) { throw new Error(`⚠️ GitHub Releases requires a tag`); } - const gh = new github_2.GitHub(config.github_token); + github_2.GitHub.plugin(require("@octokit/plugin-throttling")); + const gh = new github_2.GitHub(config.github_token, { + onRateLimit: (retryAfter, options) => { + console.warn(`Request quota exhausted for request ${options.method} ${options.url}`); + if (options.request.retryCount === 0) { + // only retries once + console.log(`Retrying after ${retryAfter} seconds!`); + return true; + } + }, + onAbuseLimit: (retryAfter, options) => { + // does not retry, only logs a warning + console.warn(`Abuse detected for request ${options.method} ${options.url}`); + } + }); let rel = yield github_1.release(config, new github_1.GitHubReleaser(gh)); if (config.input_files) { util_1.paths(config.input_files).forEach((path) => __awaiter(this, void 0, void 0, function* () { @@ -29,6 +43,7 @@ function run() { })); } console.log(`🎉 Release ready at ${rel.html_url}`); + core_1.setOutput("url", rel.html_url); } catch (error) { core_1.setFailed(error.message); diff --git a/package-lock.json b/package-lock.json index 6124ae39a..bc60c2f69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "action-gh-release", - "version": "0.1.2", + "version": "0.1.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -440,6 +440,14 @@ "universal-user-agent": "^2.0.3" } }, + "@octokit/plugin-throttling": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-2.6.0.tgz", + "integrity": "sha512-E0xQrcD36sVEeBhut6j9nWX38vm/1LKMRSUqjvJ/mqGLXfHr4jYMsrR3I/nT2QC0eJL1/SKMt7zxOt7pZiFhDA==", + "requires": { + "bottleneck": "^2.15.3" + } + }, "@octokit/request": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.1.0.tgz", @@ -943,6 +951,11 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==" }, + "bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", diff --git a/package.json b/package.json index eb417d7b1..e80c5edde 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "dependencies": { "@actions/core": "^1.1.0", "@actions/github": "^1.1.0", + "@octokit/plugin-throttling": "^2.6.0", "glob": "^7.1.4", "mime": "^2.4.4" }, diff --git a/src/github.ts b/src/github.ts index 92f52c532..582ab03e4 100644 --- a/src/github.ts +++ b/src/github.ts @@ -70,8 +70,9 @@ export class GitHubReleaser implements Releaser { owner: string; repo: string; }): AsyncIterableIterator<{ data: Release[] }> { + const updatedParams = { per_page: 100, ...params }; return this.github.paginate.iterator( - this.github.repos.listReleases.endpoint.merge(params) + this.github.repos.listReleases.endpoint.merge(updatedParams) ); } } diff --git a/src/main.ts b/src/main.ts index 42f9762db..f185d2fb5 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,6 @@ import { paths, parseConfig, isTag } from "./util"; import { release, upload, GitHubReleaser } from "./github"; -import { setFailed } from "@actions/core"; +import { setFailed, setOutput } from "@actions/core"; import { GitHub } from "@actions/github"; import { env } from "process"; @@ -10,7 +10,25 @@ async function run() { if (!isTag(config.github_ref)) { throw new Error(`⚠️ GitHub Releases requires a tag`); } - const gh = new GitHub(config.github_token); + GitHub.plugin(require("@octokit/plugin-throttling")); + const gh = new GitHub(config.github_token, { + onRateLimit: (retryAfter, options) => { + console.warn( + `Request quota exhausted for request ${options.method} ${options.url}` + ); + if (options.request.retryCount === 0) { + // only retries once + console.log(`Retrying after ${retryAfter} seconds!`); + return true; + } + }, + onAbuseLimit: (retryAfter, options) => { + // does not retry, only logs a warning + console.warn( + `Abuse detected for request ${options.method} ${options.url}` + ); + } + }); let rel = await release(config, new GitHubReleaser(gh)); if (config.input_files) { paths(config.input_files).forEach(async path => { @@ -18,6 +36,7 @@ async function run() { }); } console.log(`🎉 Release ready at ${rel.html_url}`); + setOutput("url", rel.html_url); } catch (error) { setFailed(error.message); }