diff --git a/lib/workers/repository/process/fetch.spec.ts b/lib/workers/repository/process/fetch.spec.ts index 284a06c42d15e0c9f7e54f8999529eabb795c85a..f641ea1a4f2d41356028fb0070c7a9e64cffac63 100644 --- a/lib/workers/repository/process/fetch.spec.ts +++ b/lib/workers/repository/process/fetch.spec.ts @@ -1,6 +1,7 @@ import { RenovateConfig, getConfig, mocked } from '../../../../test/util'; import { MavenDatasource } from '../../../modules/datasource/maven'; import type { PackageFile } from '../../../modules/manager/types'; +import { ExternalHostError } from '../../../types/errors/external-host-error'; import { fetchUpdates } from './fetch'; import * as lookup from './lookup'; @@ -141,5 +142,70 @@ describe('workers/repository/process/fetch', () => { await fetchUpdates(config, packageFiles); expect(packageFiles.maven[0].deps[0].updates).toHaveLength(2); }); + + it('throws lookup errors for onboarded repos', async () => { + config.rangeStrategy = 'auto'; + const packageFiles: any = { + maven: [ + { + packageFile: 'pom.xml', + deps: [{ datasource: MavenDatasource.id, depName: 'bbb' }], + }, + ], + }; + lookupUpdates.mockRejectedValueOnce(new Error('some error')); + + await expect( + fetchUpdates({ ...config, repoIsOnboarded: true }, packageFiles) + ).rejects.toThrow(); + }); + + it('throws lookup errors for not onboarded repos', async () => { + config.rangeStrategy = 'auto'; + const packageFiles: any = { + maven: [ + { + packageFile: 'pom.xml', + deps: [{ datasource: MavenDatasource.id, depName: 'bbb' }], + }, + ], + }; + lookupUpdates.mockRejectedValueOnce(new Error('some error')); + + await expect( + fetchUpdates({ ...config, repoIsOnboarded: true }, packageFiles) + ).rejects.toThrow(); + }); + + it('produces external host warnings for not onboarded repos', async () => { + config.rangeStrategy = 'auto'; + const packageFiles: any = { + maven: [ + { + packageFile: 'pom.xml', + deps: [{ datasource: MavenDatasource.id, depName: 'bbb' }], + }, + ], + }; + const err = new ExternalHostError(new Error('some error')); + lookupUpdates.mockRejectedValueOnce(err); + + await fetchUpdates({ ...config, repoIsOnboarded: false }, packageFiles); + + expect(packageFiles).toMatchObject({ + maven: [ + { + deps: [ + { + depName: 'bbb', + warnings: [ + { topic: 'Lookup Error', message: 'bbb: some error' }, + ], + }, + ], + }, + ], + }); + }); }); }); diff --git a/lib/workers/repository/process/fetch.ts b/lib/workers/repository/process/fetch.ts index 38e690b12ce69df70200e9afb3c1e411f633c19b..2bb90311aa87b099c512e6fd0d83f381c8b35580 100644 --- a/lib/workers/repository/process/fetch.ts +++ b/lib/workers/repository/process/fetch.ts @@ -9,6 +9,7 @@ import type { PackageDependency, PackageFile, } from '../../../modules/manager/types'; +import { ExternalHostError } from '../../../types/errors/external-host-error'; import { clone } from '../../../util/clone'; import { applyPackageRules } from '../../../util/package-rules'; import { PackageFiles } from '../package-files'; @@ -47,10 +48,26 @@ async function fetchDepUpdates( dep.skipReason = 'disabled'; } else { if (depConfig.datasource) { - dep = { - ...dep, - ...(await lookupUpdates(depConfig as LookupUpdateConfig)), - }; + try { + dep = { + ...dep, + ...(await lookupUpdates(depConfig as LookupUpdateConfig)), + }; + } catch (err) { + if ( + packageFileConfig.repoIsOnboarded || + !(err instanceof ExternalHostError) + ) { + throw err; + } + + const cause = err.err; + dep.warnings ??= []; + dep.warnings.push({ + topic: 'Lookup Error', + message: `${depName}: ${cause.message}`, + }); + } } dep.updates = dep.updates ?? []; }