From 3d29ce3381515ae6c86a36f339c5f06440ea5f08 Mon Sep 17 00:00:00 2001
From: Caio Andrade <caiofbpa@icloud.com>
Date: Tue, 27 Apr 2021 10:41:54 -0300
Subject: [PATCH] fix(gitlabci): Support named services (#9732)

Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
---
 .../gitlabci/__fixtures__/gitlab-ci.5.yaml    | 10 +++++
 .../__snapshots__/extract.spec.ts.snap        | 37 +++++++++++++++++++
 lib/manager/gitlabci/extract.spec.ts          |  9 +++++
 lib/manager/gitlabci/extract.ts               |  2 +-
 4 files changed, 57 insertions(+), 1 deletion(-)
 create mode 100644 lib/manager/gitlabci/__fixtures__/gitlab-ci.5.yaml

diff --git a/lib/manager/gitlabci/__fixtures__/gitlab-ci.5.yaml b/lib/manager/gitlabci/__fixtures__/gitlab-ci.5.yaml
new file mode 100644
index 0000000000..488485385e
--- /dev/null
+++ b/lib/manager/gitlabci/__fixtures__/gitlab-ci.5.yaml
@@ -0,0 +1,10 @@
+image:
+  # comment
+  name: renovate/renovate:19.70.8-slim
+
+services:
+  # comment
+  - mariadb:10.4.11
+  # another comment
+  - name: other/image:1.0.0
+    alias: imagealias
diff --git a/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap b/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap
index 89a2a02592..bb3fedc111 100644
--- a/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap
@@ -174,3 +174,40 @@ Array [
   },
 ]
 `;
+
+exports[`manager/gitlabci/extract extractAllPackageFiles() extracts named services 1`] = `
+Array [
+  Object {
+    "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.5.yaml",
+  },
+]
+`;
diff --git a/lib/manager/gitlabci/extract.spec.ts b/lib/manager/gitlabci/extract.spec.ts
index 1c624c5635..d739dcaae0 100644
--- a/lib/manager/gitlabci/extract.spec.ts
+++ b/lib/manager/gitlabci/extract.spec.ts
@@ -28,6 +28,15 @@ describe(getName(), () => {
       expect(deps).toHaveLength(5);
     });
 
+    it('extracts named services', async () => {
+      const res = await extractAllPackageFiles({}, [
+        'lib/manager/gitlabci/__fixtures__/gitlab-ci.5.yaml',
+      ]);
+      expect(res).toMatchSnapshot();
+      expect(res).toHaveLength(1);
+      expect(res[0].deps).toHaveLength(3);
+    });
+
     it('extracts multiple image lines', async () => {
       const res = await extractAllPackageFiles({}, [
         'lib/manager/gitlabci/__fixtures__/gitlab-ci.yaml',
diff --git a/lib/manager/gitlabci/extract.ts b/lib/manager/gitlabci/extract.ts
index 356d94176e..35eb6470b9 100644
--- a/lib/manager/gitlabci/extract.ts
+++ b/lib/manager/gitlabci/extract.ts
@@ -61,7 +61,7 @@ export function extractPackageFile(content: string): PackageFile | null {
           foundImage = false;
           const serviceImageLine = skipCommentLines(lines, lineNumber + 1);
           logger.trace(`serviceImageLine: "${serviceImageLine.line}"`);
-          const serviceImageMatch = /^\s*-\s*'?"?([^\s'"]+)'?"?\s*$/.exec(
+          const serviceImageMatch = /^\s*-\s*(?:name:\s*)?'?"?([^\s'"]+)'?"?\s*$/.exec(
             serviceImageLine.line
           );
           if (serviceImageMatch) {
-- 
GitLab