diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index 2397c16316a08ede2bcef5f88f3006e9fd51fb38..5dd388664846c091cb2c126dd74d8cf478bb2185 100644 --- a/docs/usage/configuration-options.md +++ b/docs/usage/configuration-options.md @@ -3591,6 +3591,7 @@ This feature works with the following managers: - [`droneci`](modules/manager/droneci/index.md) - [`gitlabci`](modules/manager/gitlabci/index.md) - [`helm-requirements`](modules/manager/helm-requirements/index.md) +- [`helm-values`](modules/manager/helm-values/index.md) - [`helmfile`](modules/manager/helmfile/index.md) - [`helmv3`](modules/manager/helmv3/index.md) - [`kubernetes`](modules/manager/kubernetes/index.md) diff --git a/lib/modules/manager/helm-values/extract.spec.ts b/lib/modules/manager/helm-values/extract.spec.ts index d8eb805db86f7ad6917490c1aa3649fbe33ef9f0..abab66d76f44e0423f697e2494fe3f48dfa33132 100644 --- a/lib/modules/manager/helm-values/extract.spec.ts +++ b/lib/modules/manager/helm-values/extract.spec.ts @@ -1,4 +1,6 @@ import { Fixtures } from '../../../../test/fixtures'; +import { partial } from '../../../../test/util'; +import type { ExtractConfig } from '../types'; import { extractPackageFile } from '.'; const helmDefaultChartInitValues = Fixtures.get( @@ -9,20 +11,34 @@ const helmMultiAndNestedImageValues = Fixtures.get( 'multi_and_nested_image_values.yaml', ); +const config = partial<ExtractConfig>({}); + +const configAliases = partial<ExtractConfig>({ + registryAliases: { + 'quay.io': 'registry.internal/mirror/quay.io', + }, +}); + +const packageFile = 'values.yaml'; + describe('modules/manager/helm-values/extract', () => { describe('extractPackageFile()', () => { it('returns null for invalid yaml file content', () => { - const result = extractPackageFile('nothing here: ['); + const result = extractPackageFile('nothing here: [', packageFile, config); expect(result).toBeNull(); }); it('returns null for empty yaml file content', () => { - const result = extractPackageFile(''); + const result = extractPackageFile('', packageFile, config); expect(result).toBeNull(); }); it('extracts from values.yaml correctly with same structure as "helm create"', () => { - const result = extractPackageFile(helmDefaultChartInitValues); + const result = extractPackageFile( + helmDefaultChartInitValues, + packageFile, + config, + ); expect(result).toMatchSnapshot({ deps: [ { @@ -34,7 +50,11 @@ describe('modules/manager/helm-values/extract', () => { }); it('extracts from complex values file correctly"', () => { - const result = extractPackageFile(helmMultiAndNestedImageValues); + const result = extractPackageFile( + helmMultiAndNestedImageValues, + packageFile, + config, + ); expect(result).toMatchSnapshot(); expect(result?.deps).toHaveLength(5); }); @@ -43,7 +63,7 @@ describe('modules/manager/helm-values/extract', () => { const multiDocumentFile = Fixtures.get( 'single_file_with_multiple_documents.yaml', ); - const result = extractPackageFile(multiDocumentFile); + const result = extractPackageFile(multiDocumentFile, packageFile, config); expect(result).toMatchObject({ deps: [ { @@ -61,5 +81,32 @@ describe('modules/manager/helm-values/extract', () => { ], }); }); + + it('extract data from file with registry aliases', () => { + const multiDocumentFile = Fixtures.get( + 'single_file_with_multiple_documents.yaml', + ); + const result = extractPackageFile( + multiDocumentFile, + packageFile, + configAliases, + ); + expect(result).toMatchObject({ + deps: [ + { + currentValue: 'v0.13.10', + depName: 'registry.internal/mirror/quay.io/metallb/controller', + datasource: 'docker', + versioning: 'docker', + }, + { + currentValue: 'v0.13.10', + depName: 'registry.internal/mirror/quay.io/metallb/speaker', + datasource: 'docker', + versioning: 'docker', + }, + ], + }); + }); }); }); diff --git a/lib/modules/manager/helm-values/extract.ts b/lib/modules/manager/helm-values/extract.ts index 61437fdbb79571efd78b93cd90663ccaef7e577b..f4041420dd4445d10bbda64f00bb5517d7b7dc47 100644 --- a/lib/modules/manager/helm-values/extract.ts +++ b/lib/modules/manager/helm-values/extract.ts @@ -2,23 +2,28 @@ import { logger } from '../../../logger'; import { parseYaml } from '../../../util/yaml'; import { id as dockerVersioning } from '../../versioning/docker'; import { getDep } from '../dockerfile/extract'; -import type { PackageDependency, PackageFileContent } from '../types'; +import type { + ExtractConfig, + PackageDependency, + PackageFileContent, +} from '../types'; import type { HelmDockerImageDependency } from './types'; import { matchesHelmValuesDockerHeuristic, matchesHelmValuesInlineImage, } from './util'; -function getHelmDep({ - registry, - repository, - tag, -}: { - registry: string; - repository: string; - tag: string; -}): PackageDependency { - const dep = getDep(`${registry}${repository}:${tag}`, false); +function getHelmDep( + registry: string, + repository: string, + tag: string, + config: ExtractConfig, +): PackageDependency { + const dep = getDep( + `${registry}${repository}:${tag}`, + false, + config.registryAliases, + ); dep.replaceString = tag; dep.versioning = dockerVersioning; dep.autoReplaceStringTemplate = @@ -34,6 +39,7 @@ function getHelmDep({ function findDependencies( parsedContent: Record<string, unknown> | HelmDockerImageDependency, packageDependencies: Array<PackageDependency>, + config: ExtractConfig, ): Array<PackageDependency> { if (!parsedContent || typeof parsedContent !== 'object') { return packageDependencies; @@ -47,11 +53,15 @@ function findDependencies( registry = registry ? `${registry}/` : ''; const repository = String(currentItem.repository); const tag = `${currentItem.tag ?? currentItem.version}`; - packageDependencies.push(getHelmDep({ repository, tag, registry })); + packageDependencies.push(getHelmDep(registry, repository, tag, config)); } else if (matchesHelmValuesInlineImage(key, value)) { - packageDependencies.push(getDep(value)); + packageDependencies.push(getDep(value, true, config.registryAliases)); } else { - findDependencies(value as Record<string, unknown>, packageDependencies); + findDependencies( + value as Record<string, unknown>, + packageDependencies, + config, + ); } }); return packageDependencies; @@ -59,7 +69,8 @@ function findDependencies( export function extractPackageFile( content: string, - packageFile?: string, + packageFile: string, + config: ExtractConfig, ): PackageFileContent | null { let parsedContent: Record<string, unknown>[] | HelmDockerImageDependency[]; try { @@ -75,7 +86,7 @@ export function extractPackageFile( const deps: PackageDependency<Record<string, any>>[] = []; for (const con of parsedContent) { - deps.push(...findDependencies(con, [])); + deps.push(...findDependencies(con, [], config)); } if (deps.length) {