diff --git a/lib/manager/helmfile/extract.ts b/lib/manager/helmfile/extract.ts index bd577b4470d15452d83ec1b99ec796e45a30d068..2003757cb1ae41d56cd92abae16c2f568a7e83bf 100644 --- a/lib/manager/helmfile/extract.ts +++ b/lib/manager/helmfile/extract.ts @@ -8,78 +8,91 @@ import { ExtractConfig, PackageDependency, PackageFile } from '../common'; const isValidChartName = (name: string): boolean => !/[!@#$%^&*(),.?":{}/|<>A-Z]/.test(name); +interface Doc { + releases?: { + chart: string; + version: string; + }[]; + repositories?: { + name: string; + url: string; + }[]; +} + export function extractPackageFile( content: string, fileName: string, config: ExtractConfig ): PackageFile { let deps = []; - let doc; + let docs: Doc[]; const aliases: Record<string, string> = {}; try { - doc = yaml.safeLoad(content, { json: true }); + docs = yaml.safeLoadAll(content, null, { json: true }); } catch (err) { logger.debug({ err, fileName }, 'Failed to parse helmfile helmfile.yaml'); return null; } - if (!(doc && is.array(doc.releases))) { - logger.debug({ fileName }, 'helmfile.yaml has no releases'); - return null; - } + for (const doc of docs) { + if (!(doc && is.array(doc.releases))) { + logger.debug({ fileName }, 'helmfile.yaml has no releases'); + return null; + } - if (doc.repositories) { - for (let i = 0; i < doc.repositories.length; i += 1) { - aliases[doc.repositories[i].name] = doc.repositories[i].url; + if (doc.repositories) { + for (let i = 0; i < doc.repositories.length; i += 1) { + aliases[doc.repositories[i].name] = doc.repositories[i].url; + } } - } - logger.debug({ aliases }, 'repositories discovered.'); + logger.debug({ aliases }, 'repositories discovered.'); - deps = doc.releases.map((dep) => { - let depName = dep.chart; - let repoName = null; + deps = doc.releases.map((dep) => { + let depName = dep.chart; + let repoName = null; - // If starts with ./ is for sure a local path - if (dep.chart.startsWith('./')) { - return { - depName, - skipReason: 'local-chart', - } as PackageDependency; - } + // If starts with ./ is for sure a local path + if (dep.chart.startsWith('./')) { + return { + depName, + skipReason: 'local-chart', + } as PackageDependency; + } - if (dep.chart.includes('/')) { - const v = dep.chart.split('/'); - repoName = v.shift(); - depName = v.join('/'); - } else { - repoName = dep.chart; - } + if (dep.chart.includes('/')) { + const v = dep.chart.split('/'); + repoName = v.shift(); + depName = v.join('/'); + } else { + repoName = dep.chart; + } - const res: PackageDependency = { - depName, - currentValue: dep.version, - registryUrls: [aliases[repoName]] - .concat([config.aliases[repoName]]) - .filter(Boolean), - }; + const res: PackageDependency = { + depName, + currentValue: dep.version, + registryUrls: [aliases[repoName]] + .concat([config.aliases[repoName]]) + .filter(Boolean), + }; - // If version is null is probably a local chart - if (!res.currentValue) { - res.skipReason = SkipReason.LocalChart; - } + // If version is null is probably a local chart + if (!res.currentValue) { + res.skipReason = SkipReason.LocalChart; + } - // By definition on helm the chart name should be lowercase letter + number + - - // However helmfile support templating of that field - if (!isValidChartName(res.depName)) { - res.skipReason = SkipReason.UnsupportedChartType; - } + // By definition on helm the chart name should be lowercase letter + number + - + // However helmfile support templating of that field + if (!isValidChartName(res.depName)) { + res.skipReason = SkipReason.UnsupportedChartType; + } - // Skip in case we cannot locate the registry - if (is.emptyArray(res.registryUrls)) { - res.skipReason = SkipReason.UnknownRegistry; - } + // Skip in case we cannot locate the registry + if (is.emptyArray(res.registryUrls)) { + res.skipReason = SkipReason.UnknownRegistry; + } - return res; - }); + return res; + }); + } return { deps, datasource: datasourceHelm.id } as PackageFile; }