From 914ab95cb0c52ac5e292b69e10e0f1a5e564ce8f Mon Sep 17 00:00:00 2001
From: Eugene Vilensky <evilensky@gmail.com>
Date: Mon, 9 Dec 2024 01:41:12 -0600
Subject: [PATCH] feat(managers/circleci): add registryAliases support to
 circleci manager (#32945)

Co-authored-by: Michael Kriese <michael.kriese@gmx.de>
---
 docs/usage/configuration-options.md          |  1 +
 lib/modules/manager/circleci/extract.spec.ts | 27 ++++++++++++++++++++
 lib/modules/manager/circleci/extract.ts      | 11 +++++---
 3 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md
index 003eb19459..0ce57dc796 100644
--- a/docs/usage/configuration-options.md
+++ b/docs/usage/configuration-options.md
@@ -3691,6 +3691,7 @@ This feature works with the following managers:
 
 - [`ansible`](modules/manager/ansible/index.md)
 - [`bitbucket-pipelines`](modules/manager/bitbucket-pipelines/index.md)
+- [`circleci`](modules/manager/circleci/index.md)
 - [`docker-compose`](modules/manager/docker-compose/index.md)
 - [`dockerfile`](modules/manager/dockerfile/index.md)
 - [`droneci`](modules/manager/droneci/index.md)
diff --git a/lib/modules/manager/circleci/extract.spec.ts b/lib/modules/manager/circleci/extract.spec.ts
index 92eb5c145d..7feeb83add 100644
--- a/lib/modules/manager/circleci/extract.spec.ts
+++ b/lib/modules/manager/circleci/extract.spec.ts
@@ -13,6 +13,33 @@ describe('modules/manager/circleci/extract', () => {
       expect(extractPackageFile('nothing here')).toBeNull();
     });
 
+    it('handles registry alias', () => {
+      const res = extractPackageFile(
+        'executors:\n  my-executor:\n    docker:\n      - image: quay.io/myName/myPackage:0.6.2',
+        '',
+        {
+          registryAliases: {
+            'quay.io': 'my-quay-mirror.registry.com',
+            'index.docker.io': 'my-docker-mirror.registry.com',
+          },
+        },
+      );
+      expect(res).toEqual({
+        deps: [
+          {
+            autoReplaceStringTemplate:
+              'quay.io/myName/myPackage:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',
+            currentDigest: undefined,
+            currentValue: '0.6.2',
+            datasource: 'docker',
+            depName: 'my-quay-mirror.registry.com/myName/myPackage',
+            depType: 'docker',
+            replaceString: 'quay.io/myName/myPackage:0.6.2',
+          },
+        ],
+      });
+    });
+
     it('extracts multiple image and resolves yaml anchors', () => {
       const res = extractPackageFile(file1);
       expect(res?.deps).toEqual([
diff --git a/lib/modules/manager/circleci/extract.ts b/lib/modules/manager/circleci/extract.ts
index e56da71ea4..660fb4eb35 100644
--- a/lib/modules/manager/circleci/extract.ts
+++ b/lib/modules/manager/circleci/extract.ts
@@ -4,12 +4,17 @@ import { parseSingleYaml } from '../../../util/yaml';
 import { OrbDatasource } from '../../datasource/orb';
 import * as npmVersioning from '../../versioning/npm';
 import { getDep } from '../dockerfile/extract';
-import type { PackageDependency, PackageFileContent } from '../types';
+import type {
+  ExtractConfig,
+  PackageDependency,
+  PackageFileContent,
+} from '../types';
 import { CircleCiFile, type CircleCiJob } from './schema';
 
 export function extractPackageFile(
   content: string,
   packageFile?: string,
+  config?: ExtractConfig,
 ): PackageFileContent | null {
   const deps: PackageDependency[] = [];
   try {
@@ -38,7 +43,7 @@ export function extractPackageFile(
     for (const job of environments) {
       for (const dockerElement of coerceArray(job.docker)) {
         deps.push({
-          ...getDep(dockerElement.image),
+          ...getDep(dockerElement.image, true, config?.registryAliases),
           depType: 'docker',
         });
       }
@@ -46,7 +51,7 @@ export function extractPackageFile(
 
     for (const alias of coerceArray(parsed.aliases)) {
       deps.push({
-        ...getDep(alias.image),
+        ...getDep(alias.image, true, config?.registryAliases),
         depType: 'docker',
       });
     }
-- 
GitLab