From e3675f104d83dc4fb1ee8d43752babd4a66eed69 Mon Sep 17 00:00:00 2001 From: Alex Cortelyou <1689668+acortelyou@users.noreply.github.com> Date: Wed, 1 May 2024 00:41:05 -0700 Subject: [PATCH] feat(datasource/custom): Support digest in custom datasource (#28760) Co-authored-by: Fabian Stehle Co-authored-by: Fabian Stehle Co-authored-by: Sebastian Poxhofer Co-authored-by: Rhys Arkins --- lib/modules/datasource/custom/index.spec.ts | 9 +++++ lib/modules/datasource/custom/index.ts | 10 +++++- .../repository/process/lookup/index.spec.ts | 33 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/lib/modules/datasource/custom/index.spec.ts b/lib/modules/datasource/custom/index.spec.ts index 001e807c47fe4d..10976ae507f7fb 100644 --- a/lib/modules/datasource/custom/index.spec.ts +++ b/lib/modules/datasource/custom/index.spec.ts @@ -697,4 +697,13 @@ describe('modules/datasource/custom/index', () => { expect(result).toEqual(expected); }); }); + + describe('getDigest', () => { + it('returns null as digest should be provided in releases', async () => { + const digest = await new CustomDatasource().getDigest({ + packageName: 'my-package', + }); + expect(digest).toBeNull(); + }); + }); }); diff --git a/lib/modules/datasource/custom/index.ts b/lib/modules/datasource/custom/index.ts index 64d0fcfff9d757..f9ca969710b2ba 100644 --- a/lib/modules/datasource/custom/index.ts +++ b/lib/modules/datasource/custom/index.ts @@ -2,7 +2,7 @@ import is from '@sindresorhus/is'; import jsonata from 'jsonata'; import { logger } from '../../../logger'; import { Datasource } from '../datasource'; -import type { GetReleasesConfig, ReleaseResult } from '../types'; +import type { DigestConfig, GetReleasesConfig, ReleaseResult } from '../types'; import { fetchers } from './formats'; import { ReleaseResultZodSchema } from './schema'; import { getCustomConfig } from './utils'; @@ -57,4 +57,12 @@ export class CustomDatasource extends Datasource { return null; } } + + override getDigest( + { packageName }: DigestConfig, + newValue?: string, + ): Promise { + // Return null here to support setting a digest: value can be provided digest in getReleases + return Promise.resolve(null); + } } diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts index 3899b15353e211..44068084c938d1 100644 --- a/lib/workers/repository/process/lookup/index.spec.ts +++ b/lib/workers/repository/process/lookup/index.spec.ts @@ -5,6 +5,7 @@ import * as httpMock from '../../../../../test/http-mock'; import { partial } from '../../../../../test/util'; import { getConfig } from '../../../../config/defaults'; import { CONFIG_VALIDATION } from '../../../../constants/error-messages'; +import { CustomDatasource } from '../../../../modules/datasource/custom'; import { DockerDatasource } from '../../../../modules/datasource/docker'; import { GitRefsDatasource } from '../../../../modules/datasource/git-refs'; import { GithubReleasesDatasource } from '../../../../modules/datasource/github-releases'; @@ -62,6 +63,11 @@ describe('workers/repository/process/lookup/index', () => { const getMavenReleases = jest.spyOn(MavenDatasource.prototype, 'getReleases'); + const getCustomDatasourceReleases = jest.spyOn( + CustomDatasource.prototype, + 'getReleases', + ); + const getDockerDigest = jest.spyOn(DockerDatasource.prototype, 'getDigest'); beforeEach(() => { @@ -3849,6 +3855,33 @@ describe('workers/repository/process/lookup/index', () => { }); }); + it('handles digest update for custom datasource', async () => { + config.currentValue = '1.0.0'; + config.packageName = 'my-package'; + config.datasource = CustomDatasource.id; + config.currentDigest = 'zzzzzzzzzzzzzzz'; + getCustomDatasourceReleases.mockResolvedValueOnce({ + releases: [ + { + version: '1.0.0', + newDigest: '0123456789abcdef', + }, + ], + }); + + const { updates } = await Result.wrap( + lookup.lookupUpdates(config), + ).unwrapOrThrow(); + + expect(updates).toEqual([ + { + newDigest: '0123456789abcdef', + newValue: '1.0.0', + updateType: 'digest', + }, + ]); + }); + it('handles digest update for non-version', async () => { config.currentValue = 'alpine'; config.packageName = 'node';