From 4cc21fa1cd7a003f7f22449e87718d1510b150e9 Mon Sep 17 00:00:00 2001
From: mugi <62197019+mugioka@users.noreply.github.com>
Date: Wed, 21 Jun 2023 21:35:04 +0900
Subject: [PATCH] feat(manager/helmfile): use the specific helmfile version
 that specified in the helmfile.lock. (#22904)

---
 lib/modules/manager/helmfile/artifacts.spec.ts |  7 ++-----
 lib/modules/manager/helmfile/artifacts.ts      | 11 +++++++++--
 lib/modules/manager/helmfile/schema.ts         |  4 ++++
 lib/modules/manager/helmfile/types.ts          |  9 ++++++++-
 lib/modules/manager/helmfile/utils.ts          |  9 +++++++--
 5 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/lib/modules/manager/helmfile/artifacts.spec.ts b/lib/modules/manager/helmfile/artifacts.spec.ts
index bfdaa57a08..d36b45bda5 100644
--- a/lib/modules/manager/helmfile/artifacts.spec.ts
+++ b/lib/modules/manager/helmfile/artifacts.spec.ts
@@ -325,7 +325,7 @@ describe('modules/manager/helmfile/artifacts', () => {
             'bash -l -c "' +
             'install-tool helm v3.7.2' +
             ' && ' +
-            'install-tool helmfile v0.129.0' +
+            'install-tool helmfile 0.151.0' +
             ' && ' +
             'install-tool kustomize 5.0.0' +
             ' && ' +
@@ -338,7 +338,7 @@ describe('modules/manager/helmfile/artifacts', () => {
       binarySource: 'install',
       expectedCommands: [
         { cmd: 'install-tool helm v3.7.2' },
-        { cmd: 'install-tool helmfile v0.129.0' },
+        { cmd: 'install-tool helmfile 0.151.0' },
         { cmd: 'install-tool kustomize 5.0.0' },
         { cmd: 'helmfile deps -f helmfile.yaml' },
       ],
@@ -359,9 +359,6 @@ describe('modules/manager/helmfile/artifacts', () => {
       datasource.getPkgReleases.mockResolvedValueOnce({
         releases: [{ version: 'v3.7.2' }],
       });
-      datasource.getPkgReleases.mockResolvedValueOnce({
-        releases: [{ version: 'v0.129.0' }],
-      });
       datasource.getPkgReleases.mockResolvedValueOnce({
         releases: [{ version: '5.0.0' }],
       });
diff --git a/lib/modules/manager/helmfile/artifacts.ts b/lib/modules/manager/helmfile/artifacts.ts
index 4e0fed89a5..87c0b6c229 100644
--- a/lib/modules/manager/helmfile/artifacts.ts
+++ b/lib/modules/manager/helmfile/artifacts.ts
@@ -14,7 +14,12 @@ import { getFile } from '../../../util/git';
 import { regEx } from '../../../util/regex';
 import { generateHelmEnvs } from '../helmv3/common';
 import type { UpdateArtifact, UpdateArtifactsResult } from '../types';
-import { generateRegistryLoginCmd, isOCIRegistry, parseDoc } from './utils';
+import {
+  generateRegistryLoginCmd,
+  isOCIRegistry,
+  parseDoc,
+  parseLock,
+} from './utils';
 
 export async function updateArtifacts({
   packageFileName,
@@ -51,7 +56,9 @@ export async function updateArtifacts({
       },
       {
         toolName: 'helmfile',
-        constraint: config.constraints?.helmfile,
+        constraint:
+          config.constraints?.helmfile ??
+          parseLock(existingLockFileContent).version,
       },
     ];
     const needKustomize = updatedDeps.some(
diff --git a/lib/modules/manager/helmfile/schema.ts b/lib/modules/manager/helmfile/schema.ts
index 8ed7904400..dd4ac7ff2f 100644
--- a/lib/modules/manager/helmfile/schema.ts
+++ b/lib/modules/manager/helmfile/schema.ts
@@ -19,3 +19,7 @@ export const DocSchema = z.object({
   releases: z.array(ReleaseSchema).optional(),
   repositories: z.array(RepositorySchema).optional(),
 });
+
+export const LockSchema = z.object({
+  version: z.string(),
+});
diff --git a/lib/modules/manager/helmfile/types.ts b/lib/modules/manager/helmfile/types.ts
index 7667d98288..a5bd8e60cf 100644
--- a/lib/modules/manager/helmfile/types.ts
+++ b/lib/modules/manager/helmfile/types.ts
@@ -1,9 +1,16 @@
 import type { z } from 'zod';
 
-import type { DocSchema, ReleaseSchema, RepositorySchema } from './schema';
+import type {
+  DocSchema,
+  LockSchema,
+  ReleaseSchema,
+  RepositorySchema,
+} from './schema';
 
 export type Release = z.infer<typeof ReleaseSchema>;
 
 export type Repository = z.infer<typeof RepositorySchema>;
 
 export type Doc = z.infer<typeof DocSchema>;
+
+export type Lock = z.infer<typeof LockSchema>;
diff --git a/lib/modules/manager/helmfile/utils.ts b/lib/modules/manager/helmfile/utils.ts
index 578ee04c06..b8acb7cc11 100644
--- a/lib/modules/manager/helmfile/utils.ts
+++ b/lib/modules/manager/helmfile/utils.ts
@@ -7,8 +7,8 @@ import { DockerDatasource } from '../../datasource/docker';
 import { generateLoginCmd } from '../helmv3/common';
 import type { RepositoryRule } from '../helmv3/types';
 
-import { DocSchema } from './schema';
-import type { Doc, Release, Repository } from './types';
+import { DocSchema, LockSchema } from './schema';
+import type { Doc, Lock, Release, Repository } from './types';
 
 /** Returns true if a helmfile release contains kustomize specific keys **/
 export function kustomizationsKeysUsed(release: Release): boolean {
@@ -36,6 +36,11 @@ export function parseDoc(packageFileContent: string): Doc {
   return DocSchema.parse(doc);
 }
 
+export function parseLock(lockFileContent: string): Lock {
+  const lock = yaml.load(lockFileContent);
+  return LockSchema.parse(lock);
+}
+
 export function isOCIRegistry(repository: Repository): boolean {
   return repository.oci === true;
 }
-- 
GitLab