diff --git a/lib/manager/flux/artifacts.spec.ts b/lib/manager/flux/artifacts.spec.ts index 16e81ce062910b2d231919c3bf74a0298a9bc31f..393c43724514cde0cc42f31ebbe7e9b5b3f0cf6a 100644 --- a/lib/manager/flux/artifacts.spec.ts +++ b/lib/manager/flux/artifacts.spec.ts @@ -14,13 +14,21 @@ describe('manager/flux/artifacts', () => { }); it('replaces existing value', async () => { - mockExecAll(exec, { stdout: '', stderr: '' }); + const snapshots = mockExecAll(exec, { stdout: '', stderr: '' }); fs.readLocalFile.mockResolvedValueOnce('old'); fs.readLocalFile.mockResolvedValueOnce('test'); const res = await updateArtifacts({ packageFileName: 'clusters/my-cluster/flux-system/gotk-components.yaml', - updatedDeps: [{ newVersion: '1.0.1' }], + updatedDeps: [ + { + newVersion: '1.0.1', + managerData: { + components: + 'source-controller,kustomize-controller,helm-controller,notification-controller', + }, + }, + ], newPackageFileContent: undefined, config: {}, }); @@ -34,6 +42,9 @@ describe('manager/flux/artifacts', () => { }, }, ]); + expect(snapshots[0].cmd).toBe( + 'flux install --export --components source-controller,kustomize-controller,helm-controller,notification-controller > clusters/my-cluster/flux-system/gotk-components.yaml' + ); }); it('ignores non-system manifests', async () => { diff --git a/lib/manager/flux/artifacts.ts b/lib/manager/flux/artifacts.ts index 85f984c422e9ad0b1930ddc681caafda9b009207..d543603759949dc8869f25ba83c85666c5310d4e 100644 --- a/lib/manager/flux/artifacts.ts +++ b/lib/manager/flux/artifacts.ts @@ -10,13 +10,18 @@ export async function updateArtifacts({ packageFileName, updatedDeps, }: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> { - if (!isSystemManifest(packageFileName) || !updatedDeps[0]?.newVersion) { + const systemDep = updatedDeps[0]; + if (!isSystemManifest(packageFileName) || !systemDep?.newVersion) { return null; } const existingFileContent = await readLocalFile(packageFileName); try { logger.debug(`Updating Flux system manifests`); - const cmd = `flux install --export > ${quote(packageFileName)}`; + const args: string[] = ['--export']; + if (systemDep.managerData?.components) { + args.push('--components', quote(systemDep.managerData.components)); + } + const cmd = `flux install ${args.join(' ')} > ${quote(packageFileName)}`; const execOptions: ExecOptions = { docker: { image: 'sidecar', diff --git a/lib/manager/flux/extract.spec.ts b/lib/manager/flux/extract.spec.ts index 92d2edeca73b3c9aa125f0c162b96280dc7f0fd6..2b2e2b18393569db2abf1528df633deea56d95fd 100644 --- a/lib/manager/flux/extract.spec.ts +++ b/lib/manager/flux/extract.spec.ts @@ -29,7 +29,7 @@ describe('manager/flux/extract', () => { ], }); }); - it('extracts version from system manifests', () => { + it('extracts version and components from system manifests', () => { const result = extractPackageFile( loadFixture('system.yaml'), 'clusters/my-cluster/flux-system/gotk-components.yaml' @@ -40,10 +40,21 @@ describe('manager/flux/extract', () => { currentValue: 'v0.24.1', datasource: 'github-releases', depName: 'fluxcd/flux2', + managerData: { + components: + 'source-controller,kustomize-controller,helm-controller,notification-controller', + }, }, ], }); }); + it('considers components optional in system manifests', () => { + const result = extractPackageFile( + `# Flux Version: v0.27.0`, + 'clusters/my-cluster/flux-system/gotk-components.yaml' + ); + expect(result.deps[0].managerData.components).toBeUndefined(); + }); it('ignores system manifests without a version', () => { const result = extractPackageFile( 'not actually a system manifest!', diff --git a/lib/manager/flux/extract.ts b/lib/manager/flux/extract.ts index 7c1cb51b53fc992338330235a8590ad1791137d7..bc58a0dfe15a4df4895eca1f48a50989dd9c5447 100644 --- a/lib/manager/flux/extract.ts +++ b/lib/manager/flux/extract.ts @@ -10,7 +10,9 @@ import type { FluxManifest, FluxResource, ResourceFluxManifest } from './types'; function readManifest(content: string, file: string): FluxManifest | null { if (isSystemManifest(file)) { - const versionMatch = regEx(/#\s*Flux\s+Version:\s*(\S+)/).exec(content); + const versionMatch = regEx( + /#\s*Flux\s+Version:\s*(\S+)(?:\s*#\s*Components:\s*([A-Za-z,-]+))?/ + ).exec(content); if (!versionMatch) { return null; } @@ -18,6 +20,7 @@ function readManifest(content: string, file: string): FluxManifest | null { kind: 'system', file: file, version: versionMatch[1], + components: versionMatch[2], }; } @@ -79,6 +82,9 @@ function resolveManifest( depName: 'fluxcd/flux2', datasource: GithubReleasesDatasource.id, currentValue: manifest.version, + managerData: { + components: manifest.components, + }, }, ]; case 'resource': diff --git a/lib/manager/flux/types.ts b/lib/manager/flux/types.ts index 69e88a4631edf1f203cbb53ef912b8fb6675942b..b048afea8a2b4b77bf4d8b4df64f6905482aa7c1 100644 --- a/lib/manager/flux/types.ts +++ b/lib/manager/flux/types.ts @@ -48,6 +48,7 @@ export interface ResourceFluxManifest extends FluxFile { export interface SystemFluxManifest extends FluxFile { kind: 'system'; version: string; + components: string; } export type FluxManifest = ResourceFluxManifest | SystemFluxManifest;