diff --git a/lib/workers/repository/__snapshots__/dependency-dashboard.spec.ts.snap b/lib/workers/repository/__snapshots__/dependency-dashboard.spec.ts.snap index 3ea02bff9092de78cb6c33594b40fab7a4f987c0..5623be7f0ea0167cb125c9f7af325db6ca1f69bb 100644 --- a/lib/workers/repository/__snapshots__/dependency-dashboard.spec.ts.snap +++ b/lib/workers/repository/__snapshots__/dependency-dashboard.spec.ts.snap @@ -1,5 +1,93 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`workers/repository/dependency-dashboard ensureDependencyDashboard() checks detected dependencies section dependency dashboard lookup warnings Dependency Lookup Warnings message in issues body 1`] = ` +"This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more. + + +--- + +### ⚠ Dependency Lookup Warnings ⚠ + +- Renovate failed to look up the following dependencies: \`dependency-2\`. + +Files affected: \`package.json\` + +--- + + +This repository currently has no open or pending branches. + +## Detected dependencies + +<details><summary>Branch main</summary> +<blockquote> + +<details><summary>npm</summary> +<blockquote> + +<details><summary>package.json</summary> + + +</details> + +</blockquote> +</details> + +</blockquote> +</details> + +<details><summary>Branch dev</summary> +<blockquote> + +<details><summary>dockerfile</summary> +<blockquote> + +<details><summary>Dockerfile</summary> + + - \`ubuntu 20.04\` + +</details> + +</blockquote> +</details> + +<details><summary>npm</summary> +<blockquote> + +<details><summary>package.json</summary> + + - \`cookie-parser ^1.4.5\` + - \`express ~4.17.1\` + - \`express-handlebars >=5.3.4\` + - \`geoip-lite 1.4.*\` + - \`nodemailer 6.7.0\` + - \`redis 3.1.2-3.4.0\` + - \`dotenv 10.0.0\` + - \`nodemon 2.0.14\` + +</details> + +</blockquote> +</details> + +<details><summary>poetry</summary> +<blockquote> + +<details><summary>pyproject.toml</summary> + + - \`six <=1.3.0\` + +</details> + +</blockquote> +</details> + +</blockquote> +</details> + +" +`; + exports[`workers/repository/dependency-dashboard ensureDependencyDashboard() checks detected dependencies section multi base branch repo add detected dependencies to the Dependency Dashboard body 1`] = ` "This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more. diff --git a/lib/workers/repository/dependency-dashboard.spec.ts b/lib/workers/repository/dependency-dashboard.spec.ts index 2deacf4f168860be48cd6631bd35635597196133..d30229e0b496fb088a64b5a686794dc5b60800ff 100644 --- a/lib/workers/repository/dependency-dashboard.spec.ts +++ b/lib/workers/repository/dependency-dashboard.spec.ts @@ -713,6 +713,41 @@ describe('workers/repository/dependency-dashboard', () => { await dryRun(branches, platform); }); }); + + describe('dependency dashboard lookup warnings', () => { + beforeEach(() => { + PackageFiles.add('main', packageFiles); + PackageFiles.add('dev', packageFiles); + }); + + afterEach(() => { + PackageFiles.clear(); + }); + + it('Dependency Lookup Warnings message in issues body', async () => { + const branches: BranchConfig[] = []; + PackageFiles.add('main', { + npm: [{ packageFile: 'package.json', deps: [] }], + }); + const dep = [ + { + warnings: [{ message: 'dependency-2', topic: '' }], + }, + ]; + const packageFiles: Record<string, PackageFile[]> = { + npm: [{ packageFile: 'package.json', deps: dep }], + }; + await dependencyDashboard.ensureDependencyDashboard( + config, + branches, + packageFiles + ); + expect(platform.ensureIssue).toHaveBeenCalledTimes(1); + expect(platform.ensureIssue.mock.calls[0][0].body).toMatchSnapshot(); + // same with dry run + await dryRun(branches, platform); + }); + }); }); }); }); diff --git a/lib/workers/repository/dependency-dashboard.ts b/lib/workers/repository/dependency-dashboard.ts index 85fcd12dbb3d180e3acacf7f0e3f426018096cf2..720cae9ed8787e120c5eb541e3d4f226b7282a0f 100644 --- a/lib/workers/repository/dependency-dashboard.ts +++ b/lib/workers/repository/dependency-dashboard.ts @@ -4,10 +4,12 @@ import { nameFromLevel } from 'bunyan'; import { GlobalConfig } from '../../config/global'; import type { RenovateConfig } from '../../config/types'; import { getProblems, logger } from '../../logger'; +import type { PackageFile } from '../../modules/manager/types'; import { platform } from '../../modules/platform'; import { regEx } from '../../util/regex'; import * as template from '../../util/template'; import { BranchConfig, BranchResult, SelectAllConfig } from '../types'; +import { getDepWarningsDashboard } from './errors-warnings'; import { PackageFiles } from './package-files'; interface DependencyDashboard { @@ -102,7 +104,8 @@ function appendRepoProblems(config: RenovateConfig, issueBody: string): string { export async function ensureDependencyDashboard( config: SelectAllConfig, - allBranches: BranchConfig[] + allBranches: BranchConfig[], + packageFiles: Record<string, PackageFile[]> = {} ): Promise<void> { // legacy/migrated issue const reuseTitle = 'Update Dependencies (Renovate Bot)'; @@ -256,6 +259,13 @@ export async function ensureDependencyDashboard( } issueBody += '\n'; } + + const warn = getDepWarningsDashboard(packageFiles); + if (warn) { + issueBody += warn; + issueBody += '\n'; + } + const otherRes = [ BranchResult.Pending, BranchResult.NeedsApproval, diff --git a/lib/workers/repository/errors-warnings.spec.ts b/lib/workers/repository/errors-warnings.spec.ts index 7398e09f3e09c57d9b02a1dab76da2490c9df5e8..80f40e19626656170c72d9ad35a2cedea0bdae0a 100644 --- a/lib/workers/repository/errors-warnings.spec.ts +++ b/lib/workers/repository/errors-warnings.spec.ts @@ -1,6 +1,11 @@ import { RenovateConfig, getConfig } from '../../../test/util'; import type { PackageFile } from '../../modules/manager/types'; -import { getDepWarningsPR, getErrors, getWarnings } from './errors-warnings'; +import { + getDepWarningsDashboard, + getDepWarningsPR, + getErrors, + getWarnings, +} from './errors-warnings'; describe('workers/repository/errors-warnings', () => { describe('getWarnings()', () => { @@ -102,6 +107,67 @@ describe('workers/repository/errors-warnings', () => { }); }); + describe('getDepWarningsDashboard()', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('returns dependency dashboard warning text', () => { + const packageFiles: Record<string, PackageFile[]> = { + npm: [ + { + packageFile: 'package.json', + deps: [ + { + warnings: [{ message: 'dependency-1', topic: '' }], + }, + {}, + ], + }, + { + packageFile: 'backend/package.json', + deps: [ + { + warnings: [{ message: 'dependency-1', topic: '' }], + }, + ], + }, + ], + dockerfile: [ + { + packageFile: 'Dockerfile', + deps: [ + { + warnings: [{ message: 'dependency-2', topic: '' }], + }, + ], + }, + ], + }; + const res = getDepWarningsDashboard(packageFiles); + expect(res).toMatchInlineSnapshot(` + " + --- + + ### ⚠ Dependency Lookup Warnings ⚠ + + - Renovate failed to look up the following dependencies: \`dependency-1\`, \`dependency-2\`. + + Files affected: \`package.json\`, \`backend/package.json\`, \`Dockerfile\` + + --- + + " + `); + }); + + it('dependency dashboard warning returns empty string', () => { + const packageFiles: Record<string, PackageFile[]> = {}; + const res = getDepWarningsDashboard(packageFiles); + expect(res).toBe(''); + }); + }); + describe('getErrors()', () => { let config: RenovateConfig; diff --git a/lib/workers/repository/errors-warnings.ts b/lib/workers/repository/errors-warnings.ts index ecd0099c16aeb8001cc803e7708774e6989798ce..eefdd8fc4b885bf6422a0274c17e2d90a823133a 100644 --- a/lib/workers/repository/errors-warnings.ts +++ b/lib/workers/repository/errors-warnings.ts @@ -65,10 +65,7 @@ export function getDepWarningsPR( if (!warnings.length) { return ''; } - logger.debug( - { warnings, warningFiles }, - 'Found package lookup warnings in onboarding' - ); + logger.debug({ warnings, warningFiles }, 'Found package lookup warnings'); warningText = emojify( `\n---\n\n### :warning: Dependency Lookup Warnings :warning:\n\n` ); @@ -82,3 +79,28 @@ export function getDepWarningsPR( '\n\n'; return warningText; } + +export function getDepWarningsDashboard( + packageFiles: Record<string, PackageFile[]> +): string { + const { warnings, warningFiles } = getDepWarnings(packageFiles); + if (!warnings.length) { + return ''; + } + + const depWarnings = warnings + .map((w) => w.replace('Failed to look up dependency ', '')) + .map((dep) => '`' + dep + '`') + .join(', '); + + logger.debug({ warnings, warningFiles }, 'Found package lookup warnings'); + let warningText = emojify( + `\n---\n\n### :warning: Dependency Lookup Warnings :warning:\n\n` + ); + warningText += `- Renovate failed to look up the following dependencies: `; + warningText += depWarnings; + warningText += '.\n\nFiles affected: '; + warningText += warningFiles.map((f) => '`' + f + '`').join(', '); + warningText += '\n\n---\n\n'; + return warningText; +} diff --git a/lib/workers/repository/index.ts b/lib/workers/repository/index.ts index c176080ec5e24d9ba403c4c3fd0146ba0882534a..866a4b82eeeaca28497908089230dca3af0f3817 100644 --- a/lib/workers/repository/index.ts +++ b/lib/workers/repository/index.ts @@ -59,7 +59,7 @@ export async function renovateRepository( } logger.debug(`Automerged but already retried once`); } else { - await ensureDependencyDashboard(config, branches); + await ensureDependencyDashboard(config, branches, packageFiles); } await finaliseRepo(config, branchList); // TODO #7154