diff --git a/bin/create-json-schema.js b/bin/create-json-schema.js index c6c8ecb938126f93e2b30e0107b7154b8599c2b0..5657c021ad2f7a6a6c1b4097b63bfaea41ef73be 100644 --- a/bin/create-json-schema.js +++ b/bin/create-json-schema.js @@ -40,6 +40,9 @@ function createSingleConfig(option) { if (option.default !== undefined) { temp.default = option.default; } + if (option.additionalProperties !== undefined) { + temp.additionalProperties = option.additionalProperties; + } if (temp.type === 'object' && !option.freeChoice) { temp.$ref = '#'; } diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index 61785615cb502e24f1b129bcde941e927a7a7824..8692ad6155aec7029c97dd68c0f28eb37ee08416 100644 --- a/docs/usage/configuration-options.md +++ b/docs/usage/configuration-options.md @@ -21,6 +21,22 @@ Also, be sure to check out Renovate's [shareable config presets](/config-presets If you have any questions about the below config options, or would like to get help/feedback about a config, please post it as an issue in [renovatebot/config-help](https://github.com/renovatebot/config-help) where it will be promptly answered. +## aliases + +Package managers that support repo aliases can be configured here. + +Currently only helm is supported, which contains this default repository alias: + +```json +{ + "aliases": { + "stable": "https://kubernetes-charts.storage.googleapis.com/" + } +} +``` + +Alias values must be properly formatted URIs. + ## ansible Add configuration here if you want to enable or disable something in particular for Ansible files and override the default Docker settings. diff --git a/lib/config/definitions.ts b/lib/config/definitions.ts index ddb37f960a9281a5c781cbfd2d035bbace9fc625..b7268838480ca513c5943d5ab3887e1008705271 100644 --- a/lib/config/definitions.ts +++ b/lib/config/definitions.ts @@ -62,6 +62,7 @@ export interface RenovateStringOption extends RenovateOptionBase { export interface RenovateObjectOption extends RenovateOptionBase { default?: any; + additionalProperties?: {} | boolean; mergeable?: boolean; type: 'object'; } @@ -525,6 +526,16 @@ const options: RenovateOptions[] = [ mergeable: true, cli: false, }, + { + name: 'aliases', + description: 'Aliases for registries, package manager specific', + type: 'object', + default: {}, + additionalProperties: { + type: 'string', + format: 'uri', + }, + }, { name: 'registryUrls', description: @@ -1604,6 +1615,9 @@ const options: RenovateOptions[] = [ stage: 'package', type: 'object', default: { + aliases: { + stable: 'https://kubernetes-charts.storage.googleapis.com/', + }, commitMessageTopic: 'helm chart {{depName}}', fileMatch: ['(^|/)requirements.yaml$'], }, diff --git a/lib/manager/common.ts b/lib/manager/common.ts index 1eb6cc8476f040234eccff9e1dadcffc10dae5e6..71040809bb6ee4ae1a15a57dd1cf75994f0d7425 100644 --- a/lib/manager/common.ts +++ b/lib/manager/common.ts @@ -18,6 +18,7 @@ export interface ExtractConfig extends ManagerConfig { endpoint?: string; global?: any; gradle?: { timeout?: number }; + aliases?: Record<string, string>; ignoreNpmrcFile?: boolean; skipInstalls?: boolean; diff --git a/lib/manager/helm-requirements/extract.ts b/lib/manager/helm-requirements/extract.ts index 1cb380779e5c797c9c62d2d1abd68320668d2549..a9b51571723b9154f75b9c3a0c29400592704ca8 100644 --- a/lib/manager/helm-requirements/extract.ts +++ b/lib/manager/helm-requirements/extract.ts @@ -3,12 +3,13 @@ import upath from 'upath'; import yaml from 'js-yaml'; import { logger } from '../../logger'; -import { PackageFile, PackageDependency } from '../common'; +import { PackageFile, PackageDependency, ExtractConfig } from '../common'; import { platform } from '../../platform'; export async function extractPackageFile( content: string, - fileName: string + fileName: string, + config: ExtractConfig ): Promise<PackageFile> { try { const baseDir = upath.parse(fileName).dir; @@ -50,6 +51,13 @@ export async function extractPackageFile( if (dep.repository) { res.registryUrls = [dep.repository]; if (dep.repository.startsWith('@')) { + const repoWithAtRemoved = dep.repository.slice(1); + const alias = config.aliases[repoWithAtRemoved]; + if (alias) { + res.registryUrls = [alias]; + return res; + } + res.skipReason = 'placeholder-url'; } else { try { diff --git a/renovate-schema.json b/renovate-schema.json index 800492c0400de6364b07b20228a54ceb5ab0fc8f..d59a344cab120d6c981bc9c5d4e4aaa10d8e067e 100644 --- a/renovate-schema.json +++ b/renovate-schema.json @@ -290,6 +290,16 @@ "default": {}, "$ref": "#" }, + "aliases": { + "description": "Aliases for registries, package manager specific", + "type": "object", + "default": {}, + "additionalProperties": { + "type": "string", + "format": "uri" + }, + "$ref": "#" + }, "registryUrls": { "description": "List of URLs to try for dependency lookup. Package manager-specific", "type": "array", @@ -1058,6 +1068,9 @@ "description": "Configuration object for helm requirements.yaml files.", "type": "object", "default": { + "aliases": { + "stable": "https://kubernetes-charts.storage.googleapis.com/" + }, "commitMessageTopic": "helm chart {{depName}}", "fileMatch": ["(^|/)requirements.yaml$"] }, diff --git a/test/manager/helm-requirements/__snapshots__/extract.spec.ts.snap b/test/manager/helm-requirements/__snapshots__/extract.spec.ts.snap index d96cd95435b6a29ccaacbbeab09dfb91743e1300..07b0173fb45f58cb2999c5c9858e809e9f36feeb 100644 --- a/test/manager/helm-requirements/__snapshots__/extract.spec.ts.snap +++ b/test/manager/helm-requirements/__snapshots__/extract.spec.ts.snap @@ -22,6 +22,21 @@ Object { } `; +exports[`lib/manager/helm/extract extractPackageFile() resolves aliased registry urls 1`] = ` +Object { + "datasource": "helm", + "deps": Array [ + Object { + "currentValue": "0.9.0", + "depName": "redis", + "registryUrls": Array [ + "https://my-registry.gcr.io/", + ], + }, + ], +} +`; + exports[`lib/manager/helm/extract extractPackageFile() skips invalid registry urls 1`] = ` Object { "datasource": "helm", diff --git a/test/manager/helm-requirements/extract.spec.ts b/test/manager/helm-requirements/extract.spec.ts index 69fcf2dee32638ee823d2db8023b618153125351..df1ec9f0e9e88bfd68020d218574ce09887b6c1d 100644 --- a/test/manager/helm-requirements/extract.spec.ts +++ b/test/manager/helm-requirements/extract.spec.ts @@ -28,7 +28,11 @@ describe('lib/manager/helm/extract', () => { version: 0.8.1 `; const fileName = 'requirements.yaml'; - const result = await extractPackageFile(content, fileName); + const result = await extractPackageFile(content, fileName, { + aliases: { + stable: 'https://kubernetes-charts.storage.googleapis.com/', + }, + }); expect(result).not.toBeNull(); expect(result).toMatchSnapshot(); expect(result.deps.every(dep => dep.skipReason)); @@ -51,7 +55,11 @@ describe('lib/manager/helm/extract', () => { repository: https://kubernetes-charts.storage.googleapis.com/ `; const fileName = 'requirements.yaml'; - const result = await extractPackageFile(content, fileName); + const result = await extractPackageFile(content, fileName, { + aliases: { + stable: 'https://kubernetes-charts.storage.googleapis.com/', + }, + }); expect(result).not.toBeNull(); expect(result).toMatchSnapshot(); }); @@ -63,9 +71,37 @@ describe('lib/manager/helm/extract', () => { name: example `); const fileName = 'requirements.yaml'; - const result = await extractPackageFile('', fileName); + const result = await extractPackageFile('', fileName, { + aliases: { + stable: 'https://kubernetes-charts.storage.googleapis.com/', + }, + }); expect(result).toBeNull(); }); + it('resolves aliased registry urls', async () => { + platform.getFile.mockReturnValueOnce(` + apiVersion: v1 + appVersion: "1.0" + description: A Helm chart for Kubernetes + name: example + version: 0.1.0 + `); + const content = ` + dependencies: + - name: redis + version: 0.9.0 + repository: '@placeholder' + `; + const fileName = 'requirements.yaml'; + const result = await extractPackageFile(content, fileName, { + aliases: { + placeholder: 'https://my-registry.gcr.io/', + }, + }); + expect(result).not.toBeNull(); + expect(result).toMatchSnapshot(); + expect(result.deps.every(dep => dep.skipReason)); + }); it("doesn't fail if Chart.yaml is invalid", async () => { platform.getFile.mockReturnValueOnce(` Invalid Chart.yaml content. @@ -82,7 +118,11 @@ describe('lib/manager/helm/extract', () => { repository: https://kubernetes-charts.storage.googleapis.com/ `; const fileName = 'requirements.yaml'; - const result = await extractPackageFile(content, fileName); + const result = await extractPackageFile(content, fileName, { + aliases: { + stable: 'https://kubernetes-charts.storage.googleapis.com/', + }, + }); expect(result).toBeNull(); }); it('skips local dependencies', async () => { @@ -103,7 +143,11 @@ describe('lib/manager/helm/extract', () => { repository: file:///some/local/path/ `; const fileName = 'requirements.yaml'; - const result = await extractPackageFile(content, fileName); + const result = await extractPackageFile(content, fileName, { + aliases: { + stable: 'https://kubernetes-charts.storage.googleapis.com/', + }, + }); expect(result).not.toBeNull(); expect(result).toMatchSnapshot(); }); @@ -119,7 +163,11 @@ describe('lib/manager/helm/extract', () => { hello: world `; const fileName = 'requirements.yaml'; - const result = await extractPackageFile(content, fileName); + const result = await extractPackageFile(content, fileName, { + aliases: { + stable: 'https://kubernetes-charts.storage.googleapis.com/', + }, + }); expect(result).toBeNull(); }); it('returns null if requirements.yaml is invalid', async () => { @@ -136,13 +184,21 @@ describe('lib/manager/helm/extract', () => { [ `; const fileName = 'requirements.yaml'; - const result = await extractPackageFile(content, fileName); + const result = await extractPackageFile(content, fileName, { + aliases: { + stable: 'https://kubernetes-charts.storage.googleapis.com/', + }, + }); expect(result).toBeNull(); }); it('returns null if Chart.yaml is empty', async () => { const content = ''; const fileName = 'requirements.yaml'; - const result = await extractPackageFile(content, fileName); + const result = await extractPackageFile(content, fileName, { + aliases: { + stable: 'https://kubernetes-charts.storage.googleapis.com/', + }, + }); expect(result).toBeNull(); }); });