From 12166f5540f5287a81d0bd236180b8b54174adcb Mon Sep 17 00:00:00 2001 From: Rhys Arkins Date: Fri, 14 Feb 2020 09:19:45 +0100 Subject: [PATCH] fix(datasource): better DatasourceError handling --- lib/datasource/index.ts | 1 - lib/manager/gradle/index.ts | 6 +++-- lib/manager/npm/post-update/index.ts | 35 ++++++++++++++++++++------- lib/manager/npm/post-update/yarn.ts | 8 +++--- lib/workers/repository/error.ts | 10 ++++++++ lib/workers/repository/init/config.ts | 4 +-- test/workers/repository/error.spec.ts | 5 ++++ 7 files changed, 50 insertions(+), 19 deletions(-) diff --git a/lib/datasource/index.ts b/lib/datasource/index.ts index c91526c5313857..aa4f88c693a581 100644 --- a/lib/datasource/index.ts +++ b/lib/datasource/index.ts @@ -91,7 +91,6 @@ export async function getPkgReleases( }); } catch (e) /* istanbul ignore next */ { if (e instanceof DatasourceError) { - logger.warn({ datasource, lookupName, err: e.err }, 'Datasource failure'); e.datasource = datasource; e.lookupName = lookupName; } diff --git a/lib/manager/gradle/index.ts b/lib/manager/gradle/index.ts index 0fa6a3bdb5c02e..012394fc252d87 100644 --- a/lib/manager/gradle/index.ts +++ b/lib/manager/gradle/index.ts @@ -3,7 +3,6 @@ import upath from 'upath'; import { exec, ExecOptions } from '../../util/exec'; import { logger } from '../../logger'; -import { DATASOURCE_FAILURE } from '../../constants/error-messages'; import { VERSION_SCHEME_MAVEN } from '../../constants/version-schemes'; import { @@ -26,6 +25,7 @@ import { platform } from '../../platform'; import { LANGUAGE_JAVA } from '../../constants/languages'; import { DATASOURCE_MAVEN } from '../../constants/data-binary-source'; import { BinarySource } from '../../util/exec/common'; +import { DatasourceError } from '../../datasource'; export const GRADLE_DEPENDENCY_REPORT_OPTIONS = '--init-script renovate-plugin.gradle renovate'; @@ -91,7 +91,9 @@ async function executeGradle( } logger.warn({ err, cmd }, 'Gradle run failed'); logger.info('Aborting Renovate due to Gradle lookup errors'); - throw new Error(DATASOURCE_FAILURE); + const error = new DatasourceError(err); + error.datasource = 'gradle'; + throw error; } logger.debug(stdout + stderr); logger.info('Gradle report complete'); diff --git a/lib/manager/npm/post-update/index.ts b/lib/manager/npm/post-update/index.ts index f01a731ccc68f1..397385281f6da4 100644 --- a/lib/manager/npm/post-update/index.ts +++ b/lib/manager/npm/post-update/index.ts @@ -12,10 +12,8 @@ import * as hostRules from '../../../util/host-rules'; import { getChildProcessEnv } from '../../../util/exec/env'; import { PostUpdateConfig, PackageFile, Upgrade } from '../../common'; import { platform } from '../../../platform'; -import { - SYSTEM_INSUFFICIENT_DISK_SPACE, - DATASOURCE_FAILURE, -} from '../../../constants/error-messages'; +import { SYSTEM_INSUFFICIENT_DISK_SPACE } from '../../../constants/error-messages'; +import { DatasourceError } from '../../../datasource/common'; // Strips empty values, deduplicates, and returns the directories from filenames // istanbul ignore next @@ -386,7 +384,10 @@ export async function getAdditionalFiles( { dependency: upgrade.depName, type: 'npm' }, 'lock file failed for the dependency being updated - skipping branch creation' ); - throw new Error(DATASOURCE_FAILURE); + const err = new Error( + 'lock file failed for the dependency being updated - skipping branch creation' + ); + throw new DatasourceError(err); } } } @@ -438,7 +439,11 @@ export async function getAdditionalFiles( { dependency: upgrade.depName, type: 'yarn' }, 'lock file failed for the dependency being updated - skipping branch creation' ); - throw new Error(DATASOURCE_FAILURE); + throw new DatasourceError( + new Error( + 'lock file failed for the dependency being updated - skipping branch creation' + ) + ); } /* eslint-enable no-useless-escape */ } @@ -524,7 +529,11 @@ export async function getAdditionalFiles( { dependency: upgrade.depName, type: 'pnpm' }, 'lock file failed for the dependency being updated - skipping branch creation' ); - throw new Error(DATASOURCE_FAILURE); + throw new DatasourceError( + Error( + 'lock file failed for the dependency being updated - skipping branch creation' + ) + ); } } } @@ -593,7 +602,11 @@ export async function getAdditionalFiles( { dependency: upgrade.depName, type: 'yarn' }, 'lock file failed for the dependency being updated - skipping branch creation' ); - throw new Error(DATASOURCE_FAILURE); + throw new DatasourceError( + Error( + 'lock file failed for the dependency being updated - skipping branch creation' + ) + ); } /* eslint-enable no-useless-escape */ if ( @@ -605,7 +618,11 @@ export async function getAdditionalFiles( { dependency: upgrade.depName, type: 'npm' }, 'lock file failed for the dependency being updated - skipping branch creation' ); - throw new Error(DATASOURCE_FAILURE); + throw new DatasourceError( + Error( + 'lock file failed for the dependency being updated - skipping branch creation' + ) + ); } } artifactErrors.push({ diff --git a/lib/manager/npm/post-update/yarn.ts b/lib/manager/npm/post-update/yarn.ts index fff9b38a6489a7..e808e5767f1475 100644 --- a/lib/manager/npm/post-update/yarn.ts +++ b/lib/manager/npm/post-update/yarn.ts @@ -4,11 +4,9 @@ import { getInstalledPath } from 'get-installed-path'; import { exec } from '../../../util/exec'; import { logger } from '../../../logger'; import { PostUpdateConfig, Upgrade } from '../../common'; -import { - SYSTEM_INSUFFICIENT_DISK_SPACE, - DATASOURCE_FAILURE, -} from '../../../constants/error-messages'; +import { SYSTEM_INSUFFICIENT_DISK_SPACE } from '../../../constants/error-messages'; import { BinarySource } from '../../../util/exec/common'; +import { DatasourceError } from '../../../datasource'; export interface GenerateLockFileResult { error?: boolean; @@ -179,7 +177,7 @@ export async function generateLockFile( err.stderr.includes('getaddrinfo ENOTFOUND registry.yarnpkg.com') || err.stderr.includes('getaddrinfo ENOTFOUND registry.npmjs.org') ) { - throw new Error(DATASOURCE_FAILURE); + throw new DatasourceError(err); } } return { error: true, stderr: err.stderr }; diff --git a/lib/workers/repository/error.ts b/lib/workers/repository/error.ts index 9b6a24e8d53cec..4e17bc694b17b7 100644 --- a/lib/workers/repository/error.ts +++ b/lib/workers/repository/error.ts @@ -29,6 +29,7 @@ import { SYSTEM_INSUFFICIENT_DISK_SPACE, UNKNOWN_ERROR, } from '../../constants/error-messages'; +import { DatasourceError } from '../../datasource/common'; export default async function handleError( config: RenovateConfig, @@ -105,6 +106,15 @@ export default async function handleError( await raiseConfigWarningIssue(config, err); return err.message; } + if (err instanceof DatasourceError) { + logger.warn( + { datasource: err.datasource, lookupName: err.lookupName, err: err.err }, + 'Datasource failure' + ); + logger.info('Registry error - skipping'); + delete config.branchList; // eslint-disable-line no-param-reassign + return err.message; + } if (err.message === DATASOURCE_FAILURE) { logger.info('Registry error - skipping'); delete config.branchList; // eslint-disable-line no-param-reassign diff --git a/lib/workers/repository/init/config.ts b/lib/workers/repository/init/config.ts index 63f85d7919d506..755f7e48001ed8 100644 --- a/lib/workers/repository/init/config.ts +++ b/lib/workers/repository/init/config.ts @@ -14,7 +14,7 @@ import { configFileNames } from '../../../config/app-strings'; import { platform } from '../../../platform'; import { CONFIG_VALIDATION, - DATASOURCE_FAILURE, + PLATFORM_FAILURE, } from '../../../constants/error-messages'; // Check for repository config @@ -57,7 +57,7 @@ export async function mergeRenovateConfig( // istanbul ignore if if (renovateConfig === null) { logger.warn('Fetching renovate config returns null'); - throw new Error(DATASOURCE_FAILURE); + throw new Error(PLATFORM_FAILURE); } // istanbul ignore if if (!renovateConfig.length) { diff --git a/test/workers/repository/error.spec.ts b/test/workers/repository/error.spec.ts index 5ab5cae31fbeb4..28129426d848a0 100644 --- a/test/workers/repository/error.spec.ts +++ b/test/workers/repository/error.spec.ts @@ -27,6 +27,7 @@ import { UNKNOWN_ERROR, } from '../../../lib/constants/error-messages'; import { RenovateConfig, getConfig } from '../../util'; +import { DatasourceError } from '../../../lib/datasource/common'; jest.mock('../../../lib/workers/repository/error-config'); @@ -70,6 +71,10 @@ describe('workers/repository/error', () => { expect(res).toEqual(err); }); }); + it(`handles DatasourceError`, async () => { + const res = await handleError(config, new DatasourceError(new Error())); + expect(res).toEqual(DATASOURCE_FAILURE); + }); it('rewrites git 5xx error', async () => { const gitError = new Error( "fatal: unable to access 'https://**redacted**@gitlab.com/learnox/learnox.git/': The requested URL returned error: 500\n"