diff --git a/lib/manager/gitlabci-include/__fixtures__/gitlab-ci.2.yaml b/lib/manager/gitlabci-include/__fixtures__/gitlab-ci.2.yaml
deleted file mode 100644
index 0829ba25fcbc74826becac79ce44d6e2bf543782..0000000000000000000000000000000000000000
--- a/lib/manager/gitlabci-include/__fixtures__/gitlab-ci.2.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-include:
-- local: 'lib/manager/gitlabci-include/__fixtures__/include.1.yml'
-
-stages:
-- test
diff --git a/lib/manager/gitlabci-include/__fixtures__/gitlab-ci.3.yaml b/lib/manager/gitlabci-include/__fixtures__/gitlab-ci.3.yaml
deleted file mode 100644
index 8607426d785cab1d6c56af24a9c8722d7c6a0667..0000000000000000000000000000000000000000
--- a/lib/manager/gitlabci-include/__fixtures__/gitlab-ci.3.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-include:
-- local: 'lib/manager/gitlabci-include/__fixtures__/include.1.yml'
-- local: 'lib/manager/gitlabci-include/__fixtures__/include.2.yml'
-
-stages:
-- test
diff --git a/lib/manager/gitlabci-include/__snapshots__/extract.spec.ts.snap b/lib/manager/gitlabci-include/__snapshots__/extract.spec.ts.snap
index a0e6277d1e1afda1fff3ce3c1aa85ea07c97ed08..046e4127deaf45fc129049c17ad2c983e3cc5d14 100644
--- a/lib/manager/gitlabci-include/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/gitlabci-include/__snapshots__/extract.spec.ts.snap
@@ -1,19 +1,5 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`lib/manager/gitlabci-include/extract extractPackageFile() extracts local include block 1`] = `
-Array [
-  Object {
-    "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
-    "currentDigest": undefined,
-    "currentValue": "3.11",
-    "datasource": "docker",
-    "depName": "alpine",
-    "depType": "image",
-    "replaceString": "alpine:3.11",
-  },
-]
-`;
-
 exports[`lib/manager/gitlabci-include/extract extractPackageFile() extracts multiple include blocks 1`] = `
 Array [
   Object {
@@ -36,27 +22,3 @@ Array [
   },
 ]
 `;
-
-exports[`lib/manager/gitlabci-include/extract extractPackageFile() extracts multiple local include blocks 1`] = `
-Array [
-  Object {
-    "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
-    "currentDigest": undefined,
-    "currentValue": "3.11",
-    "datasource": "docker",
-    "depName": "alpine",
-    "depType": "image",
-    "replaceString": "alpine:3.11",
-  },
-  Object {
-    "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
-    "commitMessageTopic": "Node.js",
-    "currentDigest": undefined,
-    "currentValue": "12",
-    "datasource": "docker",
-    "depName": "node",
-    "depType": "image",
-    "replaceString": "node:12",
-  },
-]
-`;
diff --git a/lib/manager/gitlabci-include/extract.spec.ts b/lib/manager/gitlabci-include/extract.spec.ts
index 68c3604297044f78cc96b1d64c3579d63fe58d26..ec24ad47c381d995c84daed290865078d9ef926b 100644
--- a/lib/manager/gitlabci-include/extract.spec.ts
+++ b/lib/manager/gitlabci-include/extract.spec.ts
@@ -5,50 +5,27 @@ const yamlFile = fs.readFileSync(
   'lib/manager/gitlabci-include/__fixtures__/gitlab-ci.1.yaml',
   'utf8'
 );
-const yamlLocal = fs.readFileSync(
-  'lib/manager/gitlabci-include/__fixtures__/gitlab-ci.2.yaml',
-  'utf8'
-);
-
-const yamlLocalBlock = fs.readFileSync(
-  'lib/manager/gitlabci-include/__fixtures__/gitlab-ci.3.yaml',
-  'utf8'
-);
 
 describe('lib/manager/gitlabci-include/extract', () => {
   describe('extractPackageFile()', () => {
-    it('returns null for empty', async () => {
+    it('returns null for empty', () => {
       expect(
-        await extractPackageFile('nothing here', '.gitlab-ci.yml', {})
+        extractPackageFile('nothing here', '.gitlab-ci.yml', {})
       ).toBeNull();
     });
-    it('extracts multiple include blocks', async () => {
-      const res = await extractPackageFile(yamlFile, '.gitlab-ci.yml', {});
+    it('extracts multiple include blocks', () => {
+      const res = extractPackageFile(yamlFile, '.gitlab-ci.yml', {});
       expect(res.deps).toMatchSnapshot();
       expect(res.deps).toHaveLength(3);
     });
-    it('extracts local include block', async () => {
-      const res = await extractPackageFile(yamlLocal, '.gitlab-ci.yml', {});
-      expect(res.deps).toMatchSnapshot();
-      expect(res.deps).toHaveLength(1);
-    });
-    it('extracts multiple local include blocks', async () => {
-      const res = await extractPackageFile(
-        yamlLocalBlock,
-        '.gitlab-ci.yml',
-        {}
-      );
-      expect(res.deps).toMatchSnapshot();
-      expect(res.deps).toHaveLength(2);
-    });
-    it('normalizes configured endpoints', async () => {
+    it('normalizes configured endpoints', () => {
       const endpoints = [
         'http://gitlab.test/api/v4',
         'http://gitlab.test/api/v4/',
       ];
 
       for (const endpoint of endpoints) {
-        const res = await extractPackageFile(yamlFile, '.gitlab-ci.yml', {
+        const res = extractPackageFile(yamlFile, '.gitlab-ci.yml', {
           endpoint,
         });
         expect(res.deps[0].registryUrls[0]).toEqual('http://gitlab.test');
diff --git a/lib/manager/gitlabci-include/extract.ts b/lib/manager/gitlabci-include/extract.ts
index 37f6bae92d2773079afe6bf7fe0447d7da8055fb..effe283fda95133919fbec75eb0f5083ba8ac58f 100644
--- a/lib/manager/gitlabci-include/extract.ts
+++ b/lib/manager/gitlabci-include/extract.ts
@@ -3,8 +3,6 @@ import yaml from 'js-yaml';
 import * as datasourceGitlabTags from '../../datasource/gitlab-tags';
 import { logger } from '../../logger';
 import { SkipReason } from '../../types';
-import { readLocalFile } from '../../util/fs';
-import * as gitlabci from '../gitlabci/extract';
 import type { ExtractConfig, PackageDependency, PackageFile } from '../types';
 
 function extractDepFromIncludeFile(includeObj: {
@@ -25,19 +23,11 @@ function extractDepFromIncludeFile(includeObj: {
   return dep;
 }
 
-async function extractDepsFromIncludeLocal(includeObj: {
-  local: string;
-}): Promise<PackageDependency[] | null> {
-  const content = await readLocalFile(includeObj.local, 'utf8');
-  const deps = gitlabci.extractPackageFile(content)?.deps;
-  return deps;
-}
-
-export async function extractPackageFile(
+export function extractPackageFile(
   content: string,
   _packageFile: string,
   config: ExtractConfig
-): Promise<PackageFile | null> {
+): PackageFile | null {
   const deps: PackageDependency[] = [];
   try {
     // TODO: fix me
@@ -50,13 +40,6 @@ export async function extractPackageFile(
             dep.registryUrls = [config.endpoint.replace(/\/api\/v4\/?/, '')];
           }
           deps.push(dep);
-        } else if (includeObj.local) {
-          const includedDeps = await extractDepsFromIncludeLocal(includeObj);
-          if (includedDeps) {
-            for (const includedDep of includedDeps) {
-              deps.push(includedDep);
-            }
-          }
         }
       }
     }
diff --git a/lib/manager/gitlabci/__fixtures__/gitlab-ci.2.yaml b/lib/manager/gitlabci/__fixtures__/gitlab-ci.2.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/lib/manager/gitlabci/__fixtures__/gitlab-ci.3.yaml b/lib/manager/gitlabci/__fixtures__/gitlab-ci.3.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b977704c90999d8b8b5377b59f66924d7846785b
--- /dev/null
+++ b/lib/manager/gitlabci/__fixtures__/gitlab-ci.3.yaml
@@ -0,0 +1,13 @@
+image:
+  # comment
+  name: renovate/renovate:19.70.8-slim
+
+services:
+  # comment
+  - mariadb:10.4.11
+  # another comment
+  - other/image:1.0.0
+
+include:
+  - local: 'lib/manager/gitlabci/__fixtures__/include.yml'
+  - local: 'lib/manager/gitlabci/__fixtures__/include.1.yml'
diff --git a/lib/manager/gitlabci/__fixtures__/include.1.yml b/lib/manager/gitlabci/__fixtures__/include.1.yml
new file mode 100644
index 0000000000000000000000000000000000000000..76e4de4fa0e75499989852977a65a90ebca3c6eb
--- /dev/null
+++ b/lib/manager/gitlabci/__fixtures__/include.1.yml
@@ -0,0 +1,5 @@
+test:
+  stage: test
+  image: node:12
+  script:
+    - echo test
diff --git a/lib/manager/gitlabci/__fixtures__/include.yml b/lib/manager/gitlabci/__fixtures__/include.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a4c0bb2233106f9a81ebd2c6d5a432dec4d5c184
--- /dev/null
+++ b/lib/manager/gitlabci/__fixtures__/include.yml
@@ -0,0 +1,5 @@
+test:
+  stage: test
+  image: alpine:3.11
+  script:
+    - echo test
diff --git a/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap b/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap
index cf7c455c59d31d5a9cf7bc91cb8b7f6299a7c02b..2e5af6d09286a3efe127424c3c550e0799820a59 100644
--- a/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap
@@ -1,101 +1,177 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`lib/manager/gitlabci/extract extractPackageFile() extracts multiple image lines 1`] = `
+exports[`manager/gitlabci/extract extractAllPackageFiles() extracts multiple image lines 1`] = `
 Array [
   Object {
-    "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
-    "currentDigest": undefined,
-    "currentValue": "2.5.0",
-    "datasource": "docker",
-    "depName": "ruby",
-    "depType": "image",
-    "replaceString": "ruby:2.5.0",
-  },
-  Object {
-    "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
-    "currentDigest": undefined,
-    "currentValue": "latest",
-    "datasource": "docker",
-    "depName": "hadolint/hadolint",
-    "depType": "image",
-    "replaceString": "hadolint/hadolint:latest",
-  },
-  Object {
-    "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
-    "currentDigest": undefined,
-    "currentValue": "latest",
-    "datasource": "docker",
-    "depName": "docker",
-    "depType": "image",
-    "replaceString": "docker:latest",
-  },
-  Object {
-    "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
-    "currentDigest": undefined,
-    "currentValue": "dind",
-    "datasource": "docker",
-    "depName": "docker",
-    "depType": "service-image",
-    "replaceString": "docker:dind",
-  },
-  Object {
-    "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
-    "currentDigest": undefined,
-    "currentValue": "latest",
-    "datasource": "docker",
-    "depName": "docker",
-    "depType": "image",
-    "replaceString": "docker:latest",
-  },
-  Object {
-    "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
-    "currentDigest": undefined,
-    "currentValue": "dind",
-    "datasource": "docker",
-    "depName": "docker",
-    "depType": "service-image",
-    "replaceString": "docker:dind",
+    "deps": Array [
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "2.5.0",
+        "datasource": "docker",
+        "depName": "ruby",
+        "depType": "image",
+        "replaceString": "ruby:2.5.0",
+      },
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "latest",
+        "datasource": "docker",
+        "depName": "hadolint/hadolint",
+        "depType": "image",
+        "replaceString": "hadolint/hadolint:latest",
+      },
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "latest",
+        "datasource": "docker",
+        "depName": "docker",
+        "depType": "image",
+        "replaceString": "docker:latest",
+      },
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "dind",
+        "datasource": "docker",
+        "depName": "docker",
+        "depType": "service-image",
+        "replaceString": "docker:dind",
+      },
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "latest",
+        "datasource": "docker",
+        "depName": "docker",
+        "depType": "image",
+        "replaceString": "docker:latest",
+      },
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "dind",
+        "datasource": "docker",
+        "depName": "docker",
+        "depType": "service-image",
+        "replaceString": "docker:dind",
+      },
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "1.15",
+        "datasource": "docker",
+        "depName": "image-name-test",
+        "depType": "image-name",
+        "replaceString": "image-name-test:1.15",
+      },
+    ],
+    "packageFile": "lib/manager/gitlabci/__fixtures__/gitlab-ci.yaml",
   },
+]
+`;
+
+exports[`manager/gitlabci/extract extractAllPackageFiles() extracts multiple image lines with comments 1`] = `
+Array [
   Object {
-    "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
-    "currentDigest": undefined,
-    "currentValue": "1.15",
-    "datasource": "docker",
-    "depName": "image-name-test",
-    "depType": "image-name",
-    "replaceString": "image-name-test:1.15",
+    "deps": Array [
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "19.70.8-slim",
+        "datasource": "docker",
+        "depName": "renovate/renovate",
+        "depType": "image-name",
+        "replaceString": "renovate/renovate:19.70.8-slim",
+      },
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "10.4.11",
+        "datasource": "docker",
+        "depName": "mariadb",
+        "depType": "service-image",
+        "replaceString": "mariadb:10.4.11",
+      },
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "1.0.0",
+        "datasource": "docker",
+        "depName": "other/image",
+        "depType": "service-image",
+        "replaceString": "other/image:1.0.0",
+      },
+    ],
+    "packageFile": "lib/manager/gitlabci/__fixtures__/gitlab-ci.1.yaml",
   },
 ]
 `;
 
-exports[`lib/manager/gitlabci/extract extractPackageFile() extracts multiple image lines with comments 1`] = `
+exports[`manager/gitlabci/extract extractAllPackageFiles() extracts multiple included image lines 1`] = `
 Array [
   Object {
-    "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
-    "currentDigest": undefined,
-    "currentValue": "19.70.8-slim",
-    "datasource": "docker",
-    "depName": "renovate/renovate",
-    "depType": "image-name",
-    "replaceString": "renovate/renovate:19.70.8-slim",
+    "deps": Array [
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "19.70.8-slim",
+        "datasource": "docker",
+        "depName": "renovate/renovate",
+        "depType": "image-name",
+        "replaceString": "renovate/renovate:19.70.8-slim",
+      },
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "10.4.11",
+        "datasource": "docker",
+        "depName": "mariadb",
+        "depType": "service-image",
+        "replaceString": "mariadb:10.4.11",
+      },
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "1.0.0",
+        "datasource": "docker",
+        "depName": "other/image",
+        "depType": "service-image",
+        "replaceString": "other/image:1.0.0",
+      },
+    ],
+    "packageFile": "lib/manager/gitlabci/__fixtures__/gitlab-ci.3.yaml",
   },
   Object {
-    "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
-    "currentDigest": undefined,
-    "currentValue": "10.4.11",
-    "datasource": "docker",
-    "depName": "mariadb",
-    "depType": "service-image",
-    "replaceString": "mariadb:10.4.11",
+    "deps": Array [
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "currentDigest": undefined,
+        "currentValue": "3.11",
+        "datasource": "docker",
+        "depName": "alpine",
+        "depType": "image",
+        "replaceString": "alpine:3.11",
+      },
+    ],
+    "packageFile": "lib/manager/gitlabci/__fixtures__/include.yml",
   },
   Object {
-    "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
-    "currentDigest": undefined,
-    "currentValue": "1.0.0",
-    "datasource": "docker",
-    "depName": "other/image",
-    "depType": "service-image",
-    "replaceString": "other/image:1.0.0",
+    "deps": Array [
+      Object {
+        "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+        "commitMessageTopic": "Node.js",
+        "currentDigest": undefined,
+        "currentValue": "12",
+        "datasource": "docker",
+        "depName": "node",
+        "depType": "image",
+        "replaceString": "node:12",
+      },
+    ],
+    "packageFile": "lib/manager/gitlabci/__fixtures__/include.1.yml",
   },
 ]
 `;
diff --git a/lib/manager/gitlabci/extract.spec.ts b/lib/manager/gitlabci/extract.spec.ts
index 269e4d30e44be1e986ea854246286cbc2ea656f2..de512c94ef9d37580f1974ce7c18ee6523ea2561 100644
--- a/lib/manager/gitlabci/extract.spec.ts
+++ b/lib/manager/gitlabci/extract.spec.ts
@@ -1,34 +1,62 @@
-import { readFileSync } from 'fs';
-import { extractPackageFile } from './extract';
+import { getName } from '../../../test/util';
+import type { PackageDependency } from '../types';
+import { extractAllPackageFiles } from './extract';
 
-const yamlFile = readFileSync(
-  'lib/manager/gitlabci/__fixtures__/gitlab-ci.yaml',
-  'utf8'
-);
-
-const yamlFile1 = readFileSync(
-  'lib/manager/gitlabci/__fixtures__/gitlab-ci.1.yaml',
-  'utf8'
-);
+describe(getName(__filename), () => {
+  describe('extractAllPackageFiles()', () => {
+    it('returns null for empty', async () => {
+      expect(
+        await extractAllPackageFiles({}, [
+          'lib/manager/gitlabci/__fixtures__/gitlab-ci.2.yaml',
+        ])
+      ).toBeNull();
+    });
+    it('extracts multiple included image lines', async () => {
+      const res = await extractAllPackageFiles({}, [
+        'lib/manager/gitlabci/__fixtures__/gitlab-ci.3.yaml',
+      ]);
+      expect(res).toMatchSnapshot();
+      expect(res).toHaveLength(3);
 
-describe('lib/manager/gitlabci/extract', () => {
-  describe('extractPackageFile()', () => {
-    it('returns null for empty', () => {
-      expect(extractPackageFile('nothing here')).toBeNull();
+      const deps: PackageDependency[] = [];
+      res.forEach((e) => {
+        e.deps.forEach((d) => {
+          deps.push(d);
+        });
+      });
+      expect(deps).toHaveLength(5);
     });
-    it('extracts multiple image lines', () => {
-      const res = extractPackageFile(yamlFile);
-      expect(res.deps).toMatchSnapshot();
-      expect(res.deps).toHaveLength(7);
-      expect(res.deps.some((dep) => dep.currentValue.includes("'"))).toBe(
-        false
-      );
+    it('extracts multiple image lines', async () => {
+      const res = await extractAllPackageFiles({}, [
+        'lib/manager/gitlabci/__fixtures__/gitlab-ci.yaml',
+      ]);
+      expect(res).toMatchSnapshot();
+      expect(res).toHaveLength(1);
+
+      const deps: PackageDependency[] = [];
+      res.forEach((e) => {
+        e.deps.forEach((d) => {
+          deps.push(d);
+        });
+      });
+      expect(deps).toHaveLength(7);
+
+      expect(deps.some((dep) => dep.currentValue.includes("'"))).toBe(false);
     });
+    it('extracts multiple image lines with comments', async () => {
+      const res = await extractAllPackageFiles({}, [
+        'lib/manager/gitlabci/__fixtures__/gitlab-ci.1.yaml',
+      ]);
+      expect(res).toMatchSnapshot();
+      expect(res).toHaveLength(1);
 
-    it('extracts multiple image lines with comments', () => {
-      const res = extractPackageFile(yamlFile1);
-      expect(res.deps).toMatchSnapshot();
-      expect(res.deps).toHaveLength(3);
+      const deps: PackageDependency[] = [];
+      res.forEach((e) => {
+        e.deps.forEach((d) => {
+          deps.push(d);
+        });
+      });
+      expect(deps).toHaveLength(3);
     });
   });
 });
diff --git a/lib/manager/gitlabci/extract.ts b/lib/manager/gitlabci/extract.ts
index dcf7b896be6f7e4ad851366cb620f79437bfb6f5..72a42e9e5e488dcecb93592bbeb732ecdd981085 100644
--- a/lib/manager/gitlabci/extract.ts
+++ b/lib/manager/gitlabci/extract.ts
@@ -1,6 +1,9 @@
+import is from '@sindresorhus/is';
+import yaml from 'js-yaml';
 import { logger } from '../../logger';
+import { readLocalFile } from '../../util/fs';
 import { getDep } from '../dockerfile/extract';
-import type { PackageDependency, PackageFile } from '../types';
+import type { ExtractConfig, PackageDependency, PackageFile } from '../types';
 
 function skipCommentLines(
   lines: string[],
@@ -79,3 +82,49 @@ export function extractPackageFile(content: string): PackageFile | null {
   }
   return { deps };
 }
+
+export async function extractAllPackageFiles(
+  config: ExtractConfig,
+  packageFiles: string[]
+): Promise<PackageFile[] | null> {
+  const filesToExamine = new Set<string>(packageFiles);
+  const results: PackageFile[] = [];
+
+  // extract all includes from the files
+  while (filesToExamine.size > 0) {
+    const file = filesToExamine.values().next().value;
+    filesToExamine.delete(file);
+
+    const content = await readLocalFile(file, 'utf8');
+    const doc = yaml.safeLoad(content, { json: true }) as any;
+    if (doc?.include && is.array(doc.include)) {
+      for (const includeObj of doc.include) {
+        if (includeObj.local) {
+          const fileObj = (includeObj.local as string).replace(/^\//, '');
+          if (!filesToExamine.has(fileObj)) {
+            filesToExamine.add(fileObj);
+          }
+        }
+      }
+    }
+
+    const result = extractPackageFile(content);
+    if (result !== null) {
+      results.push({
+        packageFile: file,
+        deps: result.deps,
+      });
+    }
+  }
+
+  logger.trace(
+    { packageFiles, files: filesToExamine.entries() },
+    'extracted all GitLab CI files'
+  );
+
+  if (!results.length) {
+    return null;
+  }
+
+  return results;
+}
diff --git a/lib/manager/gitlabci/index.ts b/lib/manager/gitlabci/index.ts
index 3abbab03721ffae735e7d8c1483fa55c2a87100f..b5754fe7c9ea55deb0b3e4fe1cdfcb096f6d2c68 100644
--- a/lib/manager/gitlabci/index.ts
+++ b/lib/manager/gitlabci/index.ts
@@ -1,9 +1,9 @@
 import { LANGUAGE_DOCKER } from '../../constants/languages';
-import { extractPackageFile } from './extract';
+import { extractAllPackageFiles, extractPackageFile } from './extract';
 
 const language = LANGUAGE_DOCKER;
 
-export { extractPackageFile, language };
+export { extractAllPackageFiles, extractPackageFile, language };
 
 export const defaultConfig = {
   fileMatch: ['\\.gitlab-ci\\.yml$'],