diff --git a/lib/config/global.ts b/lib/config/global.ts index f6961c5913c..d246f179774 100644 --- a/lib/config/global.ts +++ b/lib/config/global.ts @@ -51,6 +51,7 @@ export class GlobalConfig { 'prCacheSyncMaxPages', 'presetCachePersistence', 'repositoryCacheForceLocal', + 'requireConfig', 's3Endpoint', 's3PathStyle', 'toolSettings', diff --git a/lib/config/inherit.ts b/lib/config/inherit.ts index fce66be4d03..c0a8fb68235 100644 --- a/lib/config/inherit.ts +++ b/lib/config/inherit.ts @@ -14,6 +14,7 @@ export class InheritConfig { 'onboardingConfigFileName', 'onboardingNoDeps', 'onboardingPrTitle', + 'requireConfig', ]; private static config: GlobalInheritableConfig = {}; diff --git a/lib/config/types.ts b/lib/config/types.ts index b50bdedb078..1a3d807ad3e 100644 --- a/lib/config/types.ts +++ b/lib/config/types.ts @@ -173,6 +173,7 @@ export interface GlobalInheritableConfig { onboardingConfigFileName?: string; onboardingNoDeps?: 'auto' | 'enabled' | 'disabled'; onboardingPrTitle?: string; + requireConfig?: RequiredConfig; } // Config options used only within the global worker diff --git a/lib/workers/repository/init/merge.spec.ts b/lib/workers/repository/init/merge.spec.ts index e60a0fb8d7f..3a18fdc34c2 100644 --- a/lib/workers/repository/init/merge.spec.ts +++ b/lib/workers/repository/init/merge.spec.ts @@ -4,6 +4,7 @@ import type { RenovateConfig } from '~test/util.ts'; import { fs, logger, partial, platform, scm } from '~test/util.ts'; import * as decrypt from '../../../config/decrypt.ts'; import { getConfig } from '../../../config/defaults.ts'; +import { GlobalConfig } from '../../../config/global.ts'; import * as _migrateAndValidate from '../../../config/migrate-validate.ts'; import * as _migrate from '../../../config/migration.ts'; import type { AllConfig } from '../../../config/types.ts'; @@ -44,6 +45,7 @@ function mockProcessExitOnce(): [MockInstance, Error] { beforeEach(() => { memCache.init(); + GlobalConfig.reset(); config = getConfig(); config.errors = []; config.warnings = []; @@ -387,6 +389,7 @@ describe('workers/repository/init/merge', () => { warnings: [], errors: [], }); + GlobalConfig.set({ requireConfig: 'ignored' }); expect( await mergeRenovateConfig({ ...config, diff --git a/lib/workers/repository/init/merge.ts b/lib/workers/repository/init/merge.ts index 8ac4b8067cd..977a4bb177b 100644 --- a/lib/workers/repository/init/merge.ts +++ b/lib/workers/repository/init/merge.ts @@ -24,7 +24,7 @@ import { platform } from '../../../modules/platform/index.ts'; import { scm } from '../../../modules/platform/scm.ts'; import { ExternalHostError } from '../../../types/errors/external-host-error.ts'; import { getCache } from '../../../util/cache/repository/index.ts'; -import { parseJson } from '../../../util/common.ts'; +import { getInheritedOrGlobal, parseJson } from '../../../util/common.ts'; import { setUserEnv } from '../../../util/env.ts'; import { readLocalFile, readSystemFile } from '../../../util/fs/index.ts'; import * as hostRules from '../../../util/host-rules.ts'; @@ -189,7 +189,7 @@ export async function mergeRenovateConfig( ): Promise { let returnConfig = { ...config }; let repoConfig: RepoFileConfig = {}; - if (config.requireConfig !== 'ignored') { + if (getInheritedOrGlobal('requireConfig') !== 'ignored') { repoConfig = await detectRepoFileConfig(branchName); } if (!repoConfig.configFileParsed && config.mode === 'silent') { diff --git a/lib/workers/repository/onboarding/branch/check.spec.ts b/lib/workers/repository/onboarding/branch/check.spec.ts index 0a75aa3a21c..6156d40d3ef 100644 --- a/lib/workers/repository/onboarding/branch/check.spec.ts +++ b/lib/workers/repository/onboarding/branch/check.spec.ts @@ -16,7 +16,7 @@ const cache = vi.mocked(_cache); describe('workers/repository/onboarding/branch/check', () => { beforeEach(() => { - GlobalConfig.set({ onboarding: true }); + GlobalConfig.set({ onboarding: true, requireConfig: 'required' }); }); const config = partial({ diff --git a/lib/workers/repository/onboarding/branch/check.ts b/lib/workers/repository/onboarding/branch/check.ts index 373c51786e5..3cb219ade21 100644 --- a/lib/workers/repository/onboarding/branch/check.ts +++ b/lib/workers/repository/onboarding/branch/check.ts @@ -80,13 +80,13 @@ export async function isOnboarded(config: RenovateConfig): Promise { // - The current default branch SHA matches the default SHA found in the cache // Also if there is a closed pr skip using cache as it is outdated if ( - config.requireConfig === 'optional' && + getInheritedOrGlobal('requireConfig') === 'optional' && getInheritedOrGlobal('onboarding') === false ) { // Return early and avoid checking for config files return true; } - if (config.requireConfig === 'ignored') { + if (getInheritedOrGlobal('requireConfig') === 'ignored') { logger.debug('Config file will be ignored'); return true; } @@ -148,7 +148,7 @@ export async function isOnboarded(config: RenovateConfig): Promise { // If onboarding has been disabled and config files are required then the // repository has not been onboarded yet if ( - config.requireConfig === 'required' && + getInheritedOrGlobal('requireConfig') === 'required' && getInheritedOrGlobal('onboarding') === false ) { throw new Error(REPOSITORY_NO_CONFIG); @@ -159,7 +159,7 @@ export async function isOnboarded(config: RenovateConfig): Promise { return false; } logger.debug('Found closed onboarding PR'); - if (config.requireConfig === 'optional') { + if (getInheritedOrGlobal('requireConfig') === 'optional') { logger.debug('Config not mandatory so repo is considered onboarded'); return true; } diff --git a/lib/workers/repository/onboarding/branch/index.spec.ts b/lib/workers/repository/onboarding/branch/index.spec.ts index 8b67bb89245..b6f0e60127e 100644 --- a/lib/workers/repository/onboarding/branch/index.spec.ts +++ b/lib/workers/repository/onboarding/branch/index.spec.ts @@ -47,6 +47,7 @@ describe('workers/repository/onboarding/branch/index', () => { GlobalConfig.set({ onboarding: true, onboardingBranch: config.onboardingBranch, + requireConfig: config.requireConfig, }); OnboardingState.prUpdateRequested = false; scm.getFileList.mockResolvedValue([]); @@ -171,6 +172,7 @@ describe('workers/repository/onboarding/branch/index', () => { GlobalConfig.set({ onboarding: false, onboardingBranch: config.onboardingBranch, + requireConfig: 'optional', }); const res = await checkOnboardingBranch(config); expect(res.repoIsOnboarded).toBeTrue(); @@ -192,6 +194,7 @@ describe('workers/repository/onboarding/branch/index', () => { GlobalConfig.set({ onboarding: false, onboardingBranch: config.onboardingBranch, + requireConfig: 'ignored', }); const res = await checkOnboardingBranch(config); expect(res.repoIsOnboarded).toBeTrue(); @@ -202,6 +205,7 @@ describe('workers/repository/onboarding/branch/index', () => { GlobalConfig.set({ onboarding: false, onboardingBranch: config.onboardingBranch, + requireConfig: 'required', }); scm.getFileList.mockResolvedValueOnce(['package.json']); fs.readLocalFile.mockResolvedValueOnce('{}'); @@ -281,6 +285,10 @@ describe('workers/repository/onboarding/branch/index', () => { it('detects repo is onboarded via PR', async () => { config.requireConfig = 'optional'; + GlobalConfig.set({ + onboardingBranch: config.onboardingBranch, + requireConfig: 'optional', + }); platform.findPr.mockResolvedValueOnce(mock()); const res = await checkOnboardingBranch(config); expect(res.repoIsOnboarded).toBeTrue(); diff --git a/lib/workers/repository/onboarding/pr/index.spec.ts b/lib/workers/repository/onboarding/pr/index.spec.ts index 52d6a440f1e..1c8794b11e7 100644 --- a/lib/workers/repository/onboarding/pr/index.spec.ts +++ b/lib/workers/repository/onboarding/pr/index.spec.ts @@ -39,6 +39,7 @@ describe('workers/repository/onboarding/pr/index', () => { GlobalConfig.set({ onboardingBranch: config.onboardingBranch, onboardingPrTitle: 'Configure Renovate', // default value + requireConfig: config.requireConfig, }); InheritConfig.reset(); }); @@ -465,6 +466,11 @@ describe('workers/repository/onboarding/pr/index', () => { it('creates PR (no require config)', async () => { config.requireConfig = 'optional'; + GlobalConfig.set({ + onboardingBranch: config.onboardingBranch, + onboardingPrTitle: 'Configure Renovate', + requireConfig: 'optional', + }); await ensureOnboardingPr(config, packageFiles, branches); expect(platform.createPr).toHaveBeenCalledTimes(1); }); diff --git a/lib/workers/repository/onboarding/pr/index.ts b/lib/workers/repository/onboarding/pr/index.ts index f3cfbccd293..6cc4e0da44a 100644 --- a/lib/workers/repository/onboarding/pr/index.ts +++ b/lib/workers/repository/onboarding/pr/index.ts @@ -141,7 +141,7 @@ export async function ensureOnboardingPr( config.productLinks!.homepage })! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.\n\n`; prTemplate += - config.requireConfig === 'required' + getInheritedOrGlobal('requireConfig') === 'required' ? emojify( `:vertical_traffic_light: To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.\n\n`, )