Skip to content

Commit

Permalink
feat(manager/helmsman): Add OCI support (#24183)
Browse files Browse the repository at this point in the history
  • Loading branch information
domolitom committed Sep 8, 2023
1 parent 640258f commit a65129f
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 9 deletions.
16 changes: 11 additions & 5 deletions lib/modules/manager/helmsman/__fixtures__/validHelmsfile.yaml
Expand Up @@ -2,6 +2,7 @@ namespaces:
redis-operator:
strimzi:
monitoring:
test-apps:

helmRepos:
ot-helm: "https://ot-container-kit.github.io/helm-charts/"
Expand All @@ -11,14 +12,14 @@ helmRepos:
prometheus-community: https://prometheus-community.github.io/helm-charts

apps:
# valid apps
# valid apps
kube-prometheus:
enabled: true
namespace: monitoring
chart: prometheus-community/kube-prometheus-stack
version: 19.0.3
valuesFiles:
- ./kube-prometheus/values.yaml
- ./kube-prometheus/values.yaml
priority: -90
loki:
enabled: true
Expand All @@ -44,14 +45,19 @@ apps:
namespace: strimzi
chart: strimzi/strimzi-kafka-operator
version: 0.25.0
podinfo:
enabled: true
namespace: test-apps
chart: oci://ghcr.io/stefanprodan/charts/podinfo
version: 6.4.0

# missing version
# missing version
strimzi-operator-missing-version:
enabled: true
namespace: strimzi
chart: strimzi/strimzi-kafka-operator

# malformed chart
# malformed chart
loki-no-registry-ref:
enabled: true
namespace: monitoring
Expand All @@ -68,7 +74,7 @@ apps:
chart: prometheus-community/
version: 19.0.3
valuesFiles:
- ./kube-prometheus/values.yaml
- ./kube-prometheus/values.yaml
priority: -90
otlp-collector-no-chart:
enabled: true
Expand Down
Expand Up @@ -48,6 +48,12 @@ exports[`modules/manager/helmsman/extract extractPackageFile() extract deps 1`]
"https://strimzi.io/charts/",
],
},
{
"currentValue": "6.4.0",
"datasource": "docker",
"depName": "podinfo",
"packageName": "ghcr.io/stefanprodan/charts/podinfo",
},
{
"datasource": "helm",
"depName": "strimzi-operator-missing-version",
Expand Down
8 changes: 7 additions & 1 deletion lib/modules/manager/helmsman/extract.spec.ts
Expand Up @@ -20,11 +20,17 @@ describe('modules/manager/helmsman/extract', () => {
expect(result).toBeNull();
});

it('returns null if apps not defined', () => {
const fileName = 'incorrect.yaml';
const result = extractPackageFile('incorrect', fileName, {});
expect(result).toBeNull();
});

it('extract deps', () => {
const fileName = 'helmsman.yaml';
const result = extractPackageFile(multiDepFile, fileName, {});
expect(result).not.toBeNull();
expect(result?.deps).toHaveLength(10);
expect(result?.deps).toHaveLength(11);
expect(result?.deps.filter((value) => value.skipReason)).toHaveLength(5);
expect(result).toMatchSnapshot();
});
Expand Down
13 changes: 11 additions & 2 deletions lib/modules/manager/helmsman/extract.ts
Expand Up @@ -2,6 +2,7 @@ import is from '@sindresorhus/is';
import { load } from 'js-yaml';
import { logger } from '../../../logger';
import { regEx } from '../../../util/regex';
import { DockerDatasource } from '../../datasource/docker';
import { HelmDatasource } from '../../datasource/helm';
import type {
ExtractConfig,
Expand Down Expand Up @@ -31,6 +32,14 @@ function createDep(
}
dep.currentValue = anApp.version;

// in case of OCI repository, we need a PackageDependency with a DockerDatasource and a packageName
const isOci = anApp.chart?.startsWith('oci://');
if (isOci) {
dep.datasource = DockerDatasource.id;
dep.packageName = anApp.chart!.replace('oci://', '');
return dep;
}

const regexResult = anApp.chart ? chartRegex.exec(anApp.chart) : null;
if (!regexResult?.groups) {
dep.skipReason = 'invalid-url';
Expand Down Expand Up @@ -63,8 +72,8 @@ export function extractPackageFile(
const doc = load(content, {
json: true,
}) as HelmsmanDocument;
if (!(doc?.helmRepos && doc.apps)) {
logger.debug({ packageFile }, `Missing helmRepos and/or apps keys`);
if (!doc.apps) {
logger.debug({ packageFile }, `Missing apps keys`);
return null;
}

Expand Down
3 changes: 2 additions & 1 deletion lib/modules/manager/helmsman/index.ts
@@ -1,4 +1,5 @@
import type { Category } from '../../../constants';
import { DockerDatasource } from '../../datasource/docker';
import { HelmDatasource } from '../../datasource/helm';
export { extractPackageFile } from './extract';

Expand All @@ -8,4 +9,4 @@ export const defaultConfig = {

export const categories: Category[] = ['cd', 'helm', 'kubernetes'];

export const supportedDatasources = [HelmDatasource.id];
export const supportedDatasources = [HelmDatasource.id, DockerDatasource.id];

0 comments on commit a65129f

Please sign in to comment.