diff --git a/lib/datasource/rubygems/get.ts b/lib/datasource/rubygems/get.ts index f5ac5641b3911a3f73c5fb1e75cfca4b6822f3d8..0f5364ed77d124a47638972c1a695b052eaa5789 100644 --- a/lib/datasource/rubygems/get.ts +++ b/lib/datasource/rubygems/get.ts @@ -43,9 +43,10 @@ const fetch = async ({ dependency, registry, path }) => { const retry = { retries: retriable() }; const headers = getHeaders(); - const name = `/${dependency}.json`; - const baseUrl = `${registry}/${path}`; + const name = `${path}/${dependency}.json`; + const baseUrl = registry; + logger.trace({ dependency }, `RubyGems lookup request: ${baseUrl} ${name}`); const response = (await got(name, { retry, json, baseUrl, headers })) || { body: undefined, }; @@ -57,6 +58,7 @@ export const getDependency = async ({ dependency, registry, }): Promise<ReleaseResult | null> => { + logger.debug({ dependency }, 'RubyGems lookup for dependency'); try { const info = await fetch({ dependency, registry, path: INFO_PATH }); if (!info) { diff --git a/lib/datasource/rubygems/retriable.ts b/lib/datasource/rubygems/retriable.ts index cc2baceb7bc439aa45714618406c5b326206a716..e6743aec849c8daa9727b0775c6970a09f8cf60f 100644 --- a/lib/datasource/rubygems/retriable.ts +++ b/lib/datasource/rubygems/retriable.ts @@ -8,20 +8,15 @@ import { SERVICE_UNAVAILABLE, } from './errors'; -const RETRY_AFTER = 600; -const NUMBER_OF_RETRIES = 5; +const DEFAULT_BANNED_RETRY_AFTER = 600; +const NUMBER_OF_RETRIES = 2; -const getDelayStep = (): number => - parseInt(process.env.RENOVATE_RUBYGEMS_RETRY_DELAY_STEP || '1000', 10); - -const toMs = (value: number): number => value * getDelayStep(); const getBannedDelay = (retryAfter: string): number => - (parseInt(retryAfter, 10) || RETRY_AFTER) + 1; + (parseInt(retryAfter, 10) || DEFAULT_BANNED_RETRY_AFTER) + 1; const getDefaultDelay = (count: number): number => - (NUMBER_OF_RETRIES * getDelayStep()) / count; + +(NUMBER_OF_RETRIES / count).toFixed(3); -const getDelayMessage = (delay: any): string => `Retry in ${delay} seconds.`; -const getErrorMessage = (status: number) => { +const getErrorMessage = (status: number): string => { // istanbul ignore next switch (status) { case UNAUTHORIZED: @@ -49,8 +44,10 @@ export default (numberOfRetries = NUMBER_OF_RETRIES): got.RetryFunction => ( } const { headers, statusCode } = err; + + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After const isBanned = [TOO_MANY_REQUEST, SERVICE_UNAVAILABLE].includes(statusCode); - const delay = isBanned + const delaySec = isBanned ? getBannedDelay(headers['retry-after']) : getDefaultDelay(numberOfRetries); @@ -58,10 +55,9 @@ export default (numberOfRetries = NUMBER_OF_RETRIES): got.RetryFunction => ( numberOfRetries--; const errorMessage = getErrorMessage(statusCode); - const delayMessage = getDelayMessage(delay); - const message = `${errorMessage} ${delayMessage}`; + const message = `${errorMessage} Retry in ${delaySec} seconds.`; logger.info(message); - return toMs(delay); + return delaySec * 1000; }; diff --git a/test/datasource/rubygems/retriable.spec.ts b/test/datasource/rubygems/retriable.spec.ts index 463fe41477ff5b1f5b832877b07747c6cf1c5216..cb9d96f0742ff8e0256e0c8444827dc79d13f0b7 100644 --- a/test/datasource/rubygems/retriable.spec.ts +++ b/test/datasource/rubygems/retriable.spec.ts @@ -1,12 +1,6 @@ import retriable from '../../../lib/datasource/rubygems/retriable'; describe('datasource/rubygems/retriable', () => { - const { RENOVATE_RUBYGEMS_RETRY_DELAY_STEP } = process.env; - - beforeEach(() => { - process.env.RENOVATE_RUBYGEMS_RETRY_DELAY_STEP = '1'; - }); - it('returns 0 when numberOfRetries equals 0', () => { expect(retriable(0)(null, null)).toEqual(0); }); @@ -17,25 +11,21 @@ describe('datasource/rubygems/retriable', () => { statusCode: 429, headers: { 'retry-after': '5' }, }) - ).toEqual(6); + ).toEqual(6000); expect( retriable(1)(null, { statusCode: 503, headers: { 'retry-after': '9' }, }) - ).toEqual(10); + ).toEqual(10000); }); it('returns default delay if request is not banned', () => { - expect(retriable(1)(null, { statusCode: 500 })).toEqual(5); + expect(retriable(1)(null, { statusCode: 500 })).toEqual(2000); }); it('uses default numberOfRetries', () => { - expect(retriable()(null, { statusCode: 500 })).toEqual(1); - }); - - afterEach(() => { - process.env.RENOVATE_RUBYGEMS_RETRY_DELAY_STEP = RENOVATE_RUBYGEMS_RETRY_DELAY_STEP; + expect(retriable()(null, { statusCode: 500 })).toEqual(1000); }); });