Skip to content

Commit cb1bd5a

Browse files
authored
feat: allow configFileNames to be set through env (#39144)
* test: add failing test for reading configFileNames from env * fix: move configFileNames handling to shared config parsing * feat: allow configFileNames to be set through env * fix: move unit test from file to index * test: add test for setting configFileNames through cli * fix: fix merge * test: use multiple config file names in tests * test: add a length check after adding custom filenames
1 parent 0f33ed8 commit cb1bd5a

5 files changed

Lines changed: 51 additions & 31 deletions

File tree

lib/config/options/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,6 @@ const options: RenovateOptions[] = [
246246
default: null,
247247
globalOnly: true,
248248
inheritConfigSupport: true,
249-
cli: false,
250-
env: false,
251249
},
252250
{
253251
name: 'onboardingConfigFileName',

lib/workers/global/config/parse/file.spec.ts

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import type { DirectoryResult } from 'tmp-promise';
44
import { dir } from 'tmp-promise';
55
import upath from 'upath';
66
import { expect } from 'vitest';
7-
import { getConfigFileNames } from '../../../../config/app-strings';
87
import { logger } from '../../../../logger';
98
import customConfig from './__fixtures__/config';
109
import * as file from './file';
@@ -202,23 +201,6 @@ describe('workers/global/config/parse/file', () => {
202201
delete process.env.SOME_KEY;
203202
delete process.env.valid_Key;
204203
});
205-
206-
it('appends files from configFileNames to config filenames list', async () => {
207-
const configFile = upath.resolve(tmp.path, 'config4.js');
208-
const fileContent1 = `module.exports = {
209-
"configFileNames": ["myrenovate.json"]
210-
}`;
211-
fs.writeFileSync(configFile, fileContent1, {
212-
encoding: 'utf8',
213-
});
214-
const fileConfig = await file.getConfig({
215-
RENOVATE_CONFIG_FILE: configFile,
216-
});
217-
218-
expect(fileConfig.configFileNames).toBeUndefined();
219-
expect(getConfigFileNames()[0]).toBe('myrenovate.json');
220-
fs.unlinkSync(configFile);
221-
});
222204
});
223205

224206
describe('deleteConfigFile()', () => {

lib/workers/global/config/parse/file.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import {
22
isEmptyStringOrWhitespace,
3-
isNonEmptyArray,
43
isNonEmptyObject,
54
isNonEmptyString,
65
isUndefined,
76
} from '@sindresorhus/is';
87
import fs from 'fs-extra';
9-
import { setUserConfigFileNames } from '../../../../config/app-strings';
108
import type { AllConfig } from '../../../../config/types';
119
import { logger } from '../../../../logger';
1210
import { getParsedContent, migrateAndValidateConfig } from './util';
@@ -71,15 +69,6 @@ export async function getConfig(env: NodeJS.ProcessEnv): Promise<AllConfig> {
7169
delete config.processEnv;
7270
}
7371

74-
if (isNonEmptyArray(config.configFileNames)) {
75-
logger.debug(
76-
{ configFileNames: config.configFileNames },
77-
'Updated the config filenames list',
78-
);
79-
setUserConfigFileNames(config.configFileNames);
80-
delete config.configFileNames;
81-
}
82-
8372
return migrateAndValidateConfig(config, configFile);
8473
}
8574

lib/workers/global/config/parse/index.spec.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import upath from 'upath';
2+
import { getConfigFileNames } from '../../../../config/app-strings';
23
import * as _decrypt from '../../../../config/decrypt';
34
import { CONFIG_PRESETS_INVALID } from '../../../../constants/error-messages';
45
import { getCustomEnv } from '../../../../util/env';
@@ -351,5 +352,45 @@ describe('workers/global/config/parse/index', () => {
351352
);
352353
expect(parsedConfig.extends).toMatchObject([':pinDigests']);
353354
});
355+
356+
it('appends files from configFileNames to config filenames list', async () => {
357+
// Capture the length we add our custom filenames.
358+
const lengthBefore = getConfigFileNames().length;
359+
fileConfigParser.getConfig.mockResolvedValue({
360+
configFileNames: ['myrenovate.json', '.github/myrenovate.json'],
361+
});
362+
const parsedConfig = await configParser.parseConfigs(
363+
defaultEnv,
364+
defaultArgv,
365+
);
366+
expect(parsedConfig.configFileNames).toBeUndefined();
367+
expect(getConfigFileNames()[0]).toBe('myrenovate.json');
368+
expect(getConfigFileNames()[1]).toBe('.github/myrenovate.json');
369+
// Ensure we added exactly two filenames.
370+
expect(getConfigFileNames().length).toBe(lengthBefore + 2);
371+
});
372+
373+
it('supports setting configFileNames through cli', async () => {
374+
fileConfigParser.getConfig.mockResolvedValue({});
375+
defaultArgv = defaultArgv.concat([
376+
'--config-file-names=myrenovate.json,.github/myrenovate.json',
377+
]);
378+
const parsed = await configParser.parseConfigs(defaultEnv, defaultArgv);
379+
expect(parsed.configFileNames).toBeUndefined();
380+
expect(getConfigFileNames()[0]).toBe('myrenovate.json');
381+
expect(getConfigFileNames()[1]).toBe('.github/myrenovate.json');
382+
});
383+
384+
it('supports setting configFileNames through env', async () => {
385+
fileConfigParser.getConfig.mockResolvedValue({});
386+
const env: NodeJS.ProcessEnv = {
387+
RENOVATE_CONFIG_FILE_NAMES:
388+
'["myrenovate.json", ".github/myrenovate.json"]',
389+
};
390+
const parsedConfig = await configParser.parseConfigs(env, defaultArgv);
391+
expect(parsedConfig.configFileNames).toBeUndefined();
392+
expect(getConfigFileNames()[0]).toBe('myrenovate.json');
393+
expect(getConfigFileNames()[1]).toBe('.github/myrenovate.json');
394+
});
354395
});
355396
});

lib/workers/global/config/parse/index.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { isNonEmptyArray, isNonEmptyObject } from '@sindresorhus/is';
2+
import { setUserConfigFileNames } from '../../../../config/app-strings';
23
import { setPrivateKeys } from '../../../../config/decrypt';
34
import * as defaultsParser from '../../../../config/defaults';
45
import { resolveConfigPresets } from '../../../../config/presets';
@@ -182,5 +183,14 @@ export async function parseConfigs(
182183
setCustomEnv(config.customEnvVariables);
183184
}
184185

186+
if (isNonEmptyArray(config.configFileNames)) {
187+
logger.debug(
188+
{ configFileNames: config.configFileNames },
189+
'Updated the config filenames list',
190+
);
191+
setUserConfigFileNames(config.configFileNames);
192+
delete config.configFileNames;
193+
}
194+
185195
return config;
186196
}

0 commit comments

Comments
 (0)