diff --git a/lib/modules/manager/helm-values/__fixtures__/single_file_with_multiple_documents.yaml b/lib/modules/manager/helm-values/__fixtures__/single_file_with_multiple_documents.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e7ec683ced19753391a72715aba07dafa1a88c77 --- /dev/null +++ b/lib/modules/manager/helm-values/__fixtures__/single_file_with_multiple_documents.yaml @@ -0,0 +1,38 @@ +apiVersion: source.toolkit.fluxcd.io/v1beta2 +kind: HelmRepository +metadata: + name: metallb + namespace: flux-system +spec: + interval: 30m + url: https://metallb.github.io/metallb +--- +apiVersion: helm.toolkit.fluxcd.io/v2beta1 +kind: HelmRelease +metadata: + name: metallb + namespace: flux-system +spec: + interval: 5m + install: + createNamespace: true + targetNamespace: metallb-system + chart: + spec: + chart: metallb + version: 0.13.10 + sourceRef: + kind: HelmRepository + name: metallb + namespace: flux-system + values: + controller: + image: + repository: quay.io/metallb/controller + tag: v0.13.10 + speaker: + image: + repository: quay.io/metallb/speaker + tag: v0.13.10 + frr: + enabled: false diff --git a/lib/modules/manager/helm-values/extract.spec.ts b/lib/modules/manager/helm-values/extract.spec.ts index 933954c235c9f400afb84344a54f92eb0dd3164b..9798984a8816618c30106893a3d71e3ea0e08a4f 100644 --- a/lib/modules/manager/helm-values/extract.spec.ts +++ b/lib/modules/manager/helm-values/extract.spec.ts @@ -42,5 +42,28 @@ describe('modules/manager/helm-values/extract', () => { expect(result).toMatchSnapshot(); expect(result?.deps).toHaveLength(5); }); + + it('extract data from file with multiple documents', () => { + const multiDocumentFile = Fixtures.get( + 'single_file_with_multiple_documents.yaml' + ); + const result = extractPackageFile(multiDocumentFile); + expect(result).toMatchObject({ + deps: [ + { + currentValue: 'v0.13.10', + depName: 'quay.io/metallb/controller', + datasource: 'docker', + versioning: 'docker', + }, + { + currentValue: 'v0.13.10', + depName: '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 719f47b564d2df681ffbd15aaf8e76e10c06d02d..ce0f929000a082d8f94b55ff8192d43f8c2ca15d 100644 --- a/lib/modules/manager/helm-values/extract.ts +++ b/lib/modules/manager/helm-values/extract.ts @@ -1,4 +1,4 @@ -import { load } from 'js-yaml'; +import { loadAll } from 'js-yaml'; import { logger } from '../../../logger'; import { id as dockerVersioning } from '../../versioning/docker'; import { getDep } from '../dockerfile/extract'; @@ -61,18 +61,23 @@ export function extractPackageFile( content: string, packageFile?: string ): PackageFileContent | null { - let parsedContent: Record<string, unknown> | HelmDockerImageDependency; + let parsedContent: Record<string, unknown>[] | HelmDockerImageDependency[]; try { // a parser that allows extracting line numbers would be preferable, with // the current approach we need to match anything we find again during the update // TODO: fix me (#9610) - parsedContent = load(content, { json: true }) as any; + parsedContent = loadAll(content, null, { json: true }) as any; } catch (err) { logger.debug({ err, packageFile }, 'Failed to parse helm-values YAML'); return null; } try { - const deps = findDependencies(parsedContent, []); + const deps: PackageDependency<Record<string, any>>[] = []; + + for (const con of parsedContent) { + deps.push(...findDependencies(con, [])); + } + if (deps.length) { return { deps }; }