From 27861b773322972c62a51f917021601f6f7eeaa6 Mon Sep 17 00:00:00 2001 From: Sebastian Poxhofer Date: Mon, 6 Sep 2021 11:24:21 +0200 Subject: [PATCH] feat(manager/helmv3): support helm chart dependencies in OCI images (#11584) --- .../__snapshots__/artifacts.spec.ts.snap | 6 ++- .../helmv3/__snapshots__/extract.spec.ts.snap | 23 +++++++++++ lib/manager/helmv3/artifacts.ts | 3 ++ lib/manager/helmv3/extract.spec.ts | 39 +++++++++++++++++++ lib/manager/helmv3/extract.ts | 13 ++++++- 5 files changed, 81 insertions(+), 3 deletions(-) diff --git a/lib/manager/helmv3/__snapshots__/artifacts.spec.ts.snap b/lib/manager/helmv3/__snapshots__/artifacts.spec.ts.snap index 0388f42d24794e..53bd016a64ee3c 100644 --- a/lib/manager/helmv3/__snapshots__/artifacts.spec.ts.snap +++ b/lib/manager/helmv3/__snapshots__/artifacts.spec.ts.snap @@ -19,6 +19,7 @@ Array [ "cwd": "/tmp/github/some/repo", "encoding": "utf-8", "env": Object { + "HELM_EXPERIMENTAL_OCI": "1", "HOME": "/home/user", "HTTPS_PROXY": "https://example.com", "HTTP_PROXY": "http://example.com", @@ -53,6 +54,7 @@ Array [ "cwd": "/tmp/github/some/repo", "encoding": "utf-8", "env": Object { + "HELM_EXPERIMENTAL_OCI": "1", "HOME": "/home/user", "HTTPS_PROXY": "https://example.com", "HTTP_PROXY": "http://example.com", @@ -87,6 +89,7 @@ Array [ "cwd": "/tmp/github/some/repo", "encoding": "utf-8", "env": Object { + "HELM_EXPERIMENTAL_OCI": "1", "HOME": "/home/user", "HTTPS_PROXY": "https://example.com", "HTTP_PROXY": "http://example.com", @@ -128,11 +131,12 @@ Array [ }, }, Object { - "cmd": "docker run --rm --name=renovate_helm --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -w \\"/tmp/github/some/repo\\" renovate/helm bash -l -c \\"helm dependency update ''\\"", + "cmd": "docker run --rm --name=renovate_helm --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -e HELM_EXPERIMENTAL_OCI -w \\"/tmp/github/some/repo\\" renovate/helm bash -l -c \\"helm dependency update ''\\"", "options": Object { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", "env": Object { + "HELM_EXPERIMENTAL_OCI": "1", "HOME": "/home/user", "HTTPS_PROXY": "https://example.com", "HTTP_PROXY": "http://example.com", diff --git a/lib/manager/helmv3/__snapshots__/extract.spec.ts.snap b/lib/manager/helmv3/__snapshots__/extract.spec.ts.snap index 4c79e1380e1175..547524fa8d8e9d 100644 --- a/lib/manager/helmv3/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/helmv3/__snapshots__/extract.spec.ts.snap @@ -1,5 +1,28 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`manager/helmv3/extract extractPackageFile() extract correctly oci references 1`] = ` +Object { + "datasource": "helm", + "deps": Array [ + Object { + "currentValue": "0.1.0", + "datasource": "docker", + "depName": "library", + "lookupName": "ghcr.io/ankitabhopatkar13/library", + "registryUrls": Array [], + }, + Object { + "currentValue": "0.8.1", + "depName": "postgresql", + "registryUrls": Array [ + "https://charts.helm.sh/stable", + ], + }, + ], + "packageFileVersion": "0.1.0", +} +`; + exports[`manager/helmv3/extract extractPackageFile() parses simple Chart.yaml correctly 1`] = ` Object { "datasource": "helm", diff --git a/lib/manager/helmv3/artifacts.ts b/lib/manager/helmv3/artifacts.ts index 1903724d8497f5..3414afa6c3d102 100644 --- a/lib/manager/helmv3/artifacts.ts +++ b/lib/manager/helmv3/artifacts.ts @@ -17,6 +17,9 @@ async function helmUpdate(manifestPath: string): Promise { docker: { image: 'helm', }, + extraEnv: { + HELM_EXPERIMENTAL_OCI: '1', + }, }; await exec(cmd, execOptions); } diff --git a/lib/manager/helmv3/extract.spec.ts b/lib/manager/helmv3/extract.spec.ts index e9710fd4ec5800..3aa609097db193 100644 --- a/lib/manager/helmv3/extract.spec.ts +++ b/lib/manager/helmv3/extract.spec.ts @@ -1,4 +1,5 @@ import { fs } from '../../../test/util'; +import * as datasourceDocker from '../../datasource/docker'; import { extractPackageFile } from './extract'; jest.mock('../../util/fs'); @@ -66,6 +67,44 @@ describe('manager/helmv3/extract', () => { ], }); }); + + it('extract correctly oci references', async () => { + const content = ` + apiVersion: v2 + name: app2 + description: A Helm chart for Kubernetes + type: application + version: 0.1.0 + appVersion: "1.16.0" + dependencies: + - name: library + version: 0.1.0 + repository: oci://ghcr.io/ankitabhopatkar13/library + import-values: + - defaults + - name: postgresql + version: 0.8.1 + repository: https://charts.helm.sh/stable + condition: postgresql.enabled + `; + const fileName = 'Chart.yaml'; + const result = await extractPackageFile(content, fileName, { + aliases: { + stable: 'https://charts.helm.sh/stable', + }, + }); + expect(result).toMatchSnapshot({ + deps: [ + { + depName: 'library', + datasource: datasourceDocker.id, + currentValue: '0.1.0', + }, + { depName: 'postgresql', currentValue: '0.8.1' }, + ], + }); + }); + it('resolves aliased registry urls', async () => { const content = ` apiVersion: v2 diff --git a/lib/manager/helmv3/extract.ts b/lib/manager/helmv3/extract.ts index d589d3403c260b..bc0266ca3b12bb 100644 --- a/lib/manager/helmv3/extract.ts +++ b/lib/manager/helmv3/extract.ts @@ -1,5 +1,6 @@ import is from '@sindresorhus/is'; import { load } from 'js-yaml'; +import * as datasourceDocker from '../../datasource/docker'; import { HelmDatasource } from '../../datasource/helm'; import { logger } from '../../logger'; import { SkipReason } from '../../types'; @@ -75,8 +76,16 @@ export async function extractPackageFile( } else { try { const url = new URL(dep.repository); - if (url.protocol === 'file:') { - res.skipReason = SkipReason.LocalDependency; + switch (url.protocol) { + case 'oci:': + res.datasource = datasourceDocker.id; + res.lookupName = dep.repository.replace('oci://', ''); + res.registryUrls = []; + break; + case 'file:': + res.skipReason = SkipReason.LocalDependency; + break; + default: } } catch (err) { logger.debug({ err }, 'Error parsing url');