Skip to content

Commit

Permalink
Merge pull request #7 from dorshinar/feature/wait-on-rate-limit
Browse files Browse the repository at this point in the history
feat: wait for GitHub API rate limit to reset if exceeded
  • Loading branch information
dorshinar authored Jul 14, 2020
2 parents cb9d805 + d6d08a2 commit 17ecde1
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 30 deletions.
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"deno.enable": false
}
51 changes: 36 additions & 15 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2039,7 +2039,7 @@ exports.getUserAgent = getUserAgent;
/***/ 215:
/***/ (function(module) {

module.exports = {"_args":[["@octokit/[email protected]","/Users/paulhachmang/Sites/get-deployment-url"]],"_from":"@octokit/[email protected]","_id":"@octokit/[email protected]","_inBundle":false,"_integrity":"sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw==","_location":"/@octokit/rest","_phantomChildren":{"@octokit/types":"2.14.0","deprecation":"2.3.1","once":"1.4.0"},"_requested":{"type":"version","registry":true,"raw":"@octokit/[email protected]","name":"@octokit/rest","escapedName":"@octokit%2frest","scope":"@octokit","rawSpec":"16.43.1","saveSpec":null,"fetchSpec":"16.43.1"},"_requiredBy":["/@actions/github"],"_resolved":"https://registry.npmjs.org/@octokit/rest/-/rest-16.43.1.tgz","_spec":"16.43.1","_where":"/Users/paulhachmang/Sites/get-deployment-url","author":{"name":"Gregor Martynus","url":"https://github.com/gr2m"},"bugs":{"url":"https://github.com/octokit/rest.js/issues"},"bundlesize":[{"path":"./dist/octokit-rest.min.js.gz","maxSize":"33 kB"}],"contributors":[{"name":"Mike de Boer","email":"[email protected]"},{"name":"Fabian Jakobs","email":"[email protected]"},{"name":"Joe Gallo","email":"[email protected]"},{"name":"Gregor Martynus","url":"https://github.com/gr2m"}],"dependencies":{"@octokit/auth-token":"^2.4.0","@octokit/plugin-paginate-rest":"^1.1.1","@octokit/plugin-request-log":"^1.0.0","@octokit/plugin-rest-endpoint-methods":"2.4.0","@octokit/request":"^5.2.0","@octokit/request-error":"^1.0.2","atob-lite":"^2.0.0","before-after-hook":"^2.0.0","btoa-lite":"^1.0.0","deprecation":"^2.0.0","lodash.get":"^4.4.2","lodash.set":"^4.3.2","lodash.uniq":"^4.5.0","octokit-pagination-methods":"^1.1.0","once":"^1.4.0","universal-user-agent":"^4.0.0"},"description":"GitHub REST API client for Node.js","devDependencies":{"@gimenete/type-writer":"^0.1.3","@octokit/auth":"^1.1.1","@octokit/fixtures-server":"^5.0.6","@octokit/graphql":"^4.2.0","@types/node":"^13.1.0","bundlesize":"^0.18.0","chai":"^4.1.2","compression-webpack-plugin":"^3.1.0","cypress":"^3.0.0","glob":"^7.1.2","http-proxy-agent":"^4.0.0","lodash.camelcase":"^4.3.0","lodash.merge":"^4.6.1","lodash.upperfirst":"^4.3.1","lolex":"^5.1.2","mkdirp":"^1.0.0","mocha":"^7.0.1","mustache":"^4.0.0","nock":"^11.3.3","npm-run-all":"^4.1.2","nyc":"^15.0.0","prettier":"^1.14.2","proxy":"^1.0.0","semantic-release":"^17.0.0","sinon":"^8.0.0","sinon-chai":"^3.0.0","sort-keys":"^4.0.0","string-to-arraybuffer":"^1.0.0","string-to-jsdoc-comment":"^1.0.0","typescript":"^3.3.1","webpack":"^4.0.0","webpack-bundle-analyzer":"^3.0.0","webpack-cli":"^3.0.0"},"files":["index.js","index.d.ts","lib","plugins"],"homepage":"https://github.com/octokit/rest.js#readme","keywords":["octokit","github","rest","api-client"],"license":"MIT","name":"@octokit/rest","nyc":{"ignore":["test"]},"publishConfig":{"access":"public"},"release":{"publish":["@semantic-release/npm",{"path":"@semantic-release/github","assets":["dist/*","!dist/*.map.gz"]}]},"repository":{"type":"git","url":"git+https://github.com/octokit/rest.js.git"},"scripts":{"build":"npm-run-all build:*","build:browser":"npm-run-all build:browser:*","build:browser:development":"webpack --mode development --entry . --output-library=Octokit --output=./dist/octokit-rest.js --profile --json > dist/bundle-stats.json","build:browser:production":"webpack --mode production --entry . --plugin=compression-webpack-plugin --output-library=Octokit --output-path=./dist --output-filename=octokit-rest.min.js --devtool source-map","build:ts":"npm run -s update-endpoints:typescript","coverage":"nyc report --reporter=html && open coverage/index.html","generate-bundle-report":"webpack-bundle-analyzer dist/bundle-stats.json --mode=static --no-open --report dist/bundle-report.html","lint":"prettier --check '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","lint:fix":"prettier --write '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","postvalidate:ts":"tsc --noEmit --target es6 test/typescript-validate.ts","prebuild:browser":"mkdirp dist/","pretest":"npm run -s lint","prevalidate:ts":"npm run -s build:ts","start-fixtures-server":"octokit-fixtures-server","test":"nyc mocha test/mocha-node-setup.js \"test/*/**/*-test.js\"","test:browser":"cypress run --browser chrome","update-endpoints":"npm-run-all update-endpoints:*","update-endpoints:fetch-json":"node scripts/update-endpoints/fetch-json","update-endpoints:typescript":"node scripts/update-endpoints/typescript","validate:ts":"tsc --target es6 --noImplicitAny index.d.ts"},"types":"index.d.ts","version":"16.43.1"};
module.exports = {"_args":[["@octokit/[email protected]","/mnt/c/Users/dors7/Documents/programming/run-against-deploy-action"]],"_from":"@octokit/[email protected]","_id":"@octokit/[email protected]","_inBundle":false,"_integrity":"sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw==","_location":"/@octokit/rest","_phantomChildren":{"@octokit/types":"2.14.0","deprecation":"2.3.1","once":"1.4.0"},"_requested":{"type":"version","registry":true,"raw":"@octokit/[email protected]","name":"@octokit/rest","escapedName":"@octokit%2frest","scope":"@octokit","rawSpec":"16.43.1","saveSpec":null,"fetchSpec":"16.43.1"},"_requiredBy":["/@actions/github"],"_resolved":"https://registry.npmjs.org/@octokit/rest/-/rest-16.43.1.tgz","_spec":"16.43.1","_where":"/mnt/c/Users/dors7/Documents/programming/run-against-deploy-action","author":{"name":"Gregor Martynus","url":"https://github.com/gr2m"},"bugs":{"url":"https://github.com/octokit/rest.js/issues"},"bundlesize":[{"path":"./dist/octokit-rest.min.js.gz","maxSize":"33 kB"}],"contributors":[{"name":"Mike de Boer","email":"[email protected]"},{"name":"Fabian Jakobs","email":"[email protected]"},{"name":"Joe Gallo","email":"[email protected]"},{"name":"Gregor Martynus","url":"https://github.com/gr2m"}],"dependencies":{"@octokit/auth-token":"^2.4.0","@octokit/plugin-paginate-rest":"^1.1.1","@octokit/plugin-request-log":"^1.0.0","@octokit/plugin-rest-endpoint-methods":"2.4.0","@octokit/request":"^5.2.0","@octokit/request-error":"^1.0.2","atob-lite":"^2.0.0","before-after-hook":"^2.0.0","btoa-lite":"^1.0.0","deprecation":"^2.0.0","lodash.get":"^4.4.2","lodash.set":"^4.3.2","lodash.uniq":"^4.5.0","octokit-pagination-methods":"^1.1.0","once":"^1.4.0","universal-user-agent":"^4.0.0"},"description":"GitHub REST API client for Node.js","devDependencies":{"@gimenete/type-writer":"^0.1.3","@octokit/auth":"^1.1.1","@octokit/fixtures-server":"^5.0.6","@octokit/graphql":"^4.2.0","@types/node":"^13.1.0","bundlesize":"^0.18.0","chai":"^4.1.2","compression-webpack-plugin":"^3.1.0","cypress":"^3.0.0","glob":"^7.1.2","http-proxy-agent":"^4.0.0","lodash.camelcase":"^4.3.0","lodash.merge":"^4.6.1","lodash.upperfirst":"^4.3.1","lolex":"^5.1.2","mkdirp":"^1.0.0","mocha":"^7.0.1","mustache":"^4.0.0","nock":"^11.3.3","npm-run-all":"^4.1.2","nyc":"^15.0.0","prettier":"^1.14.2","proxy":"^1.0.0","semantic-release":"^17.0.0","sinon":"^8.0.0","sinon-chai":"^3.0.0","sort-keys":"^4.0.0","string-to-arraybuffer":"^1.0.0","string-to-jsdoc-comment":"^1.0.0","typescript":"^3.3.1","webpack":"^4.0.0","webpack-bundle-analyzer":"^3.0.0","webpack-cli":"^3.0.0"},"files":["index.js","index.d.ts","lib","plugins"],"homepage":"https://github.com/octokit/rest.js#readme","keywords":["octokit","github","rest","api-client"],"license":"MIT","name":"@octokit/rest","nyc":{"ignore":["test"]},"publishConfig":{"access":"public"},"release":{"publish":["@semantic-release/npm",{"path":"@semantic-release/github","assets":["dist/*","!dist/*.map.gz"]}]},"repository":{"type":"git","url":"git+https://github.com/octokit/rest.js.git"},"scripts":{"build":"npm-run-all build:*","build:browser":"npm-run-all build:browser:*","build:browser:development":"webpack --mode development --entry . --output-library=Octokit --output=./dist/octokit-rest.js --profile --json > dist/bundle-stats.json","build:browser:production":"webpack --mode production --entry . --plugin=compression-webpack-plugin --output-library=Octokit --output-path=./dist --output-filename=octokit-rest.min.js --devtool source-map","build:ts":"npm run -s update-endpoints:typescript","coverage":"nyc report --reporter=html && open coverage/index.html","generate-bundle-report":"webpack-bundle-analyzer dist/bundle-stats.json --mode=static --no-open --report dist/bundle-report.html","lint":"prettier --check '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","lint:fix":"prettier --write '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","postvalidate:ts":"tsc --noEmit --target es6 test/typescript-validate.ts","prebuild:browser":"mkdirp dist/","pretest":"npm run -s lint","prevalidate:ts":"npm run -s build:ts","start-fixtures-server":"octokit-fixtures-server","test":"nyc mocha test/mocha-node-setup.js \"test/*/**/*-test.js\"","test:browser":"cypress run --browser chrome","update-endpoints":"npm-run-all update-endpoints:*","update-endpoints:fetch-json":"node scripts/update-endpoints/fetch-json","update-endpoints:typescript":"node scripts/update-endpoints/typescript","validate:ts":"tsc --target es6 --noImplicitAny index.d.ts"},"types":"index.d.ts","version":"16.43.1"};

/***/ }),

Expand Down Expand Up @@ -4922,6 +4922,13 @@ module.exports = `query($repo: String!, $owner: String!, $branch: String!) {
}
}
}
rateLimit {
cost
limit
nodeCount
remaining
resetAt
}
}
`

Expand Down Expand Up @@ -4975,10 +4982,6 @@ var core = __webpack_require__(470);
// EXTERNAL MODULE: ./node_modules/@actions/github/lib/github.js
var github = __webpack_require__(469);

// EXTERNAL MODULE: ./query.gql
var query = __webpack_require__(401);
var query_default = /*#__PURE__*/__webpack_require__.n(query);

// CONCATENATED MODULE: ./node_modules/lodash-es/_freeGlobal.js
/** Detect free variable `global` from Node.js. */
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
Expand Down Expand Up @@ -27568,6 +27571,10 @@ if (lodash_default_symIterator) {




// EXTERNAL MODULE: ./query.gql
var query = __webpack_require__(401);
var query_default = /*#__PURE__*/__webpack_require__.n(query);

// CONCATENATED MODULE: ./index.js

Expand All @@ -27576,30 +27583,44 @@ if (lodash_default_symIterator) {


async function getDeployment(args, retryInterval) {
let environment = null
let environment = null;
while (!environment) {
environment = await tryGetResult(args)
if (!environment)
console.log(`environment is null, waiting ${retryInterval} milliseconds and trying again`)
environment = await tryGetResult(args);
if (!environment)
console.log(
`environment is null, waiting ${retryInterval} milliseconds and trying again`
);
await new Promise((resolve) => setTimeout(resolve, retryInterval));
}
return environment;
}

async function tryGetResult(args) {
const octokit = new github.GitHub(Object(core.getInput)("token", { required: true }))
const octokit = new github.GitHub(Object(core.getInput)("token", { required: true }));
const result = await octokit.graphql(query_default.a, args);
const edges = lodash_es_get(result, "repository.ref.target.deployments.edges")
if (!edges) return null
await waitForRateLimitReset(result);

const edges = lodash_es_get(result, "repository.ref.target.deployments.edges");
if (!edges) return null;
return lodash_es_get(edges, `[0].node.latestStatus.environmentUrl`, null);
}

async function waitForRateLimitReset(result) {
const { cost, remaining, resetAt } = result.rateLimit;
if (remaining >= cost) return;

const timeToRateLimitReset =
new Date(resetAt).getTime() - new Date().getTime();
await new Promise((resolve) => setTimeout(resolve, timeToRateLimitReset));
}

async function run() {
try {
const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/");
const branch = process.env.GITHUB_HEAD_REF ||
process.env.GITHUB_REF.match(/(?<=refs\/heads\/).+/g)[0]
const retryInterval = Number(Object(core.getInput)("retryInterval"))
const branch =
process.env.GITHUB_HEAD_REF ||
process.env.GITHUB_REF.match(/(?<=refs\/heads\/).+/g)[0];
const retryInterval = Number(Object(core.getInput)("retryInterval"));

const args = { repo, owner, branch };
console.log("Starting to run with following input:", args);
Expand Down
36 changes: 25 additions & 11 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,33 +1,47 @@
import { getInput, setOutput, setFailed } from "@actions/core";
import { GitHub } from "@actions/github";
import query from "./query.gql";
import { get } from "lodash-es";
import query from "./query.gql";

async function getDeployment(args, retryInterval) {
let environment = null
let environment = null;
while (!environment) {
environment = await tryGetResult(args)
if (!environment)
console.log(`environment is null, waiting ${retryInterval} milliseconds and trying again`)
environment = await tryGetResult(args);
if (!environment)
console.log(
`environment is null, waiting ${retryInterval} milliseconds and trying again`
);
await new Promise((resolve) => setTimeout(resolve, retryInterval));
}
return environment;
}

async function tryGetResult(args) {
const octokit = new GitHub(getInput("token", { required: true }))
const octokit = new GitHub(getInput("token", { required: true }));
const result = await octokit.graphql(query, args);
const edges = get(result, "repository.ref.target.deployments.edges")
if (!edges) return null
await waitForRateLimitReset(result);

const edges = get(result, "repository.ref.target.deployments.edges");
if (!edges) return null;
return get(edges, `[0].node.latestStatus.environmentUrl`, null);
}

async function waitForRateLimitReset(result) {
const { cost, remaining, resetAt } = result.rateLimit;
if (remaining >= cost) return;

const timeToRateLimitReset =
new Date(resetAt).getTime() - new Date().getTime();
await new Promise((resolve) => setTimeout(resolve, timeToRateLimitReset));
}

async function run() {
try {
const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/");
const branch = process.env.GITHUB_HEAD_REF ||
process.env.GITHUB_REF.match(/(?<=refs\/heads\/).+/g)[0]
const retryInterval = Number(getInput("retryInterval"))
const branch =
process.env.GITHUB_HEAD_REF ||
process.env.GITHUB_REF.match(/(?<=refs\/heads\/).+/g)[0];
const retryInterval = Number(getInput("retryInterval"));

const args = { repo, owner, branch };
console.log("Starting to run with following input:", args);
Expand Down
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"@actions/core": "^1.2.4",
"@actions/github": "^2.1.1",
"husky": "^4.2.5",
"lodash": "^4.17.15",
"lodash": "^4.17.19",
"lodash-es": "^4.17.15"
},
"husky": {
Expand Down
7 changes: 7 additions & 0 deletions query.gql
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,12 @@ module.exports = `query($repo: String!, $owner: String!, $branch: String!) {
}
}
}
rateLimit {
cost
limit
nodeCount
remaining
resetAt
}
}
`

0 comments on commit 17ecde1

Please sign in to comment.