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;
 }