From 997e5a1216a6e25493c0539a30ea88b4e910cc89 Mon Sep 17 00:00:00 2001 From: Jamie Magee <jamie.magee@gmail.com> Date: Mon, 8 Aug 2022 21:34:29 -0700 Subject: [PATCH] feat(datasource/azure-pipelines-tasks): add `azure-pipelines-tasks` datasource (#16904) Co-authored-by: Michael Kriese <michael.kriese@visualon.de> --- lib/modules/datasource/api.ts | 2 ++ .../azure-pipelines-tasks/index.spec.ts | 31 +++++++++++++++++ .../datasource/azure-pipelines-tasks/index.ts | 33 +++++++++++++++++++ .../azure-pipelines-tasks/readme.md | 2 ++ .../manager/azure-pipelines/extract.spec.ts | 26 +++++++++++++-- .../manager/azure-pipelines/extract.ts | 2 ++ lib/modules/manager/azure-pipelines/index.ts | 6 +++- 7 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 lib/modules/datasource/azure-pipelines-tasks/index.spec.ts create mode 100644 lib/modules/datasource/azure-pipelines-tasks/index.ts create mode 100644 lib/modules/datasource/azure-pipelines-tasks/readme.md diff --git a/lib/modules/datasource/api.ts b/lib/modules/datasource/api.ts index 386241a255..4bb76b0b3c 100644 --- a/lib/modules/datasource/api.ts +++ b/lib/modules/datasource/api.ts @@ -1,6 +1,7 @@ import { AdoptiumJavaDatasource } from './adoptium-java'; import { ArtifactoryDatasource } from './artifactory'; import { AwsMachineImageDataSource } from './aws-machine-image'; +import { AzurePipelinesTasksDatasource } from './azure-pipelines-tasks'; import { BitBucketTagsDatasource } from './bitbucket-tags'; import { CdnJsDatasource } from './cdnjs'; import { ClojureDatasource } from './clojure'; @@ -51,6 +52,7 @@ export default api; api.set(AdoptiumJavaDatasource.id, new AdoptiumJavaDatasource()); api.set(ArtifactoryDatasource.id, new ArtifactoryDatasource()); api.set(AwsMachineImageDataSource.id, new AwsMachineImageDataSource()); +api.set(AzurePipelinesTasksDatasource.id, new AzurePipelinesTasksDatasource()); api.set(BitBucketTagsDatasource.id, new BitBucketTagsDatasource()); api.set(CdnJsDatasource.id, new CdnJsDatasource()); api.set(ClojureDatasource.id, new ClojureDatasource()); diff --git a/lib/modules/datasource/azure-pipelines-tasks/index.spec.ts b/lib/modules/datasource/azure-pipelines-tasks/index.spec.ts new file mode 100644 index 0000000000..add7ea3b40 --- /dev/null +++ b/lib/modules/datasource/azure-pipelines-tasks/index.spec.ts @@ -0,0 +1,31 @@ +import { getPkgReleases } from '..'; +import { AzurePipelinesTasksDatasource } from '.'; + +describe('modules/datasource/azure-pipelines-tasks/index', () => { + it('returns null for unknown task', async () => { + expect( + await getPkgReleases({ + datasource: AzurePipelinesTasksDatasource.id, + depName: 'unknown', + }) + ).toBeNull(); + }); + + it('supports built-in tasks', async () => { + expect( + await getPkgReleases({ + datasource: AzurePipelinesTasksDatasource.id, + depName: 'AutomatedAnalysis', + }) + ).toEqual({ releases: [{ version: '0.171.0' }, { version: '0.198.0' }] }); + }); + + it('is case insensitive', async () => { + expect( + await getPkgReleases({ + datasource: AzurePipelinesTasksDatasource.id, + depName: 'automatedanalysis', + }) + ).toEqual({ releases: [{ version: '0.171.0' }, { version: '0.198.0' }] }); + }); +}); diff --git a/lib/modules/datasource/azure-pipelines-tasks/index.ts b/lib/modules/datasource/azure-pipelines-tasks/index.ts new file mode 100644 index 0000000000..72a2c699d8 --- /dev/null +++ b/lib/modules/datasource/azure-pipelines-tasks/index.ts @@ -0,0 +1,33 @@ +import dataFiles from '../../../data-files.generated'; +import { id as versioning } from '../../versioning/loose'; +import { Datasource } from '../datasource'; +import type { GetReleasesConfig, ReleaseResult } from '../types'; + +export class AzurePipelinesTasksDatasource extends Datasource { + static readonly id = 'azure-pipelines-tasks'; + + private readonly builtInTasks: Record<string, string[]>; + + constructor() { + super(AzurePipelinesTasksDatasource.id); + this.builtInTasks = JSON.parse( + dataFiles.get('data/azure-pipelines-tasks.json')! + ); + } + + override readonly customRegistrySupport = false; + + override readonly defaultVersioning = versioning; + + getReleases({ + packageName, + }: GetReleasesConfig): Promise<ReleaseResult | null> { + const versions = this.builtInTasks[packageName.toLowerCase()]; + if (versions) { + const releases = versions.map((version) => ({ version })); + return Promise.resolve({ releases }); + } + + return Promise.resolve(null); + } +} diff --git a/lib/modules/datasource/azure-pipelines-tasks/readme.md b/lib/modules/datasource/azure-pipelines-tasks/readme.md new file mode 100644 index 0000000000..109140e561 --- /dev/null +++ b/lib/modules/datasource/azure-pipelines-tasks/readme.md @@ -0,0 +1,2 @@ +This datasource returns versions of the [built-in Azure Pipelines tasks](https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/?view=azure-devops). +It does not yet support Azure Pipelines tasks from the [Visual Studio Marketplace](https://marketplace.visualstudio.com/search?target=AzureDevOps&category=Azure%20Pipelines) diff --git a/lib/modules/manager/azure-pipelines/extract.spec.ts b/lib/modules/manager/azure-pipelines/extract.spec.ts index 0563cab3b6..82ff78295a 100644 --- a/lib/modules/manager/azure-pipelines/extract.spec.ts +++ b/lib/modules/manager/azure-pipelines/extract.spec.ts @@ -1,4 +1,5 @@ import { Fixtures } from '../../../../test/fixtures'; +import { AzurePipelinesTasksDatasource } from '../../datasource/azure-pipelines-tasks'; import { extractAzurePipelinesTasks, extractContainer, @@ -96,6 +97,7 @@ describe('modules/manager/azure-pipelines/extract', () => { expect(extractAzurePipelinesTasks('Bash@3')).toEqual({ depName: 'Bash', currentValue: '3', + datasource: AzurePipelinesTasksDatasource.id, }); }); @@ -142,7 +144,13 @@ describe('modules/manager/azure-pipelines/extract', () => { azurePipelinesStages, azurePipelinesFilename ); - expect(res?.deps).toEqual([{ depName: 'Bash', currentValue: '3' }]); + expect(res?.deps).toEqual([ + { + depName: 'Bash', + currentValue: '3', + datasource: AzurePipelinesTasksDatasource.id, + }, + ]); }); it('should extract jobs', () => { @@ -150,7 +158,13 @@ describe('modules/manager/azure-pipelines/extract', () => { azurePipelinesJobs, azurePipelinesFilename ); - expect(res?.deps).toEqual([{ depName: 'Bash', currentValue: '3' }]); + expect(res?.deps).toEqual([ + { + depName: 'Bash', + currentValue: '3', + datasource: AzurePipelinesTasksDatasource.id, + }, + ]); }); it('should extract steps', () => { @@ -158,7 +172,13 @@ describe('modules/manager/azure-pipelines/extract', () => { azurePipelinesSteps, azurePipelinesFilename ); - expect(res?.deps).toEqual([{ depName: 'Bash', currentValue: '3' }]); + expect(res?.deps).toEqual([ + { + depName: 'Bash', + currentValue: '3', + datasource: AzurePipelinesTasksDatasource.id, + }, + ]); }); it('should return null when task alias used', () => { diff --git a/lib/modules/manager/azure-pipelines/extract.ts b/lib/modules/manager/azure-pipelines/extract.ts index 5a8045e7e9..dbb80ac654 100644 --- a/lib/modules/manager/azure-pipelines/extract.ts +++ b/lib/modules/manager/azure-pipelines/extract.ts @@ -1,6 +1,7 @@ import { load } from 'js-yaml'; import { logger } from '../../../logger'; import { regEx } from '../../../util/regex'; +import { AzurePipelinesTasksDatasource } from '../../datasource/azure-pipelines-tasks'; import { GitTagsDatasource } from '../../datasource/git-tags'; import { getDep } from '../dockerfile/extract'; import type { PackageDependency, PackageFile } from '../types'; @@ -59,6 +60,7 @@ export function extractAzurePipelinesTasks( return { depName: match.groups.name, currentValue: match.groups.version, + datasource: AzurePipelinesTasksDatasource.id, }; } return null; diff --git a/lib/modules/manager/azure-pipelines/index.ts b/lib/modules/manager/azure-pipelines/index.ts index bf14289b54..5fc99be02a 100644 --- a/lib/modules/manager/azure-pipelines/index.ts +++ b/lib/modules/manager/azure-pipelines/index.ts @@ -1,3 +1,4 @@ +import { AzurePipelinesTasksDatasource } from '../../datasource/azure-pipelines-tasks'; import { GitTagsDatasource } from '../../datasource/git-tags'; export { extractPackageFile } from './extract'; @@ -5,4 +6,7 @@ export const defaultConfig = { fileMatch: ['azure.*pipelines?.*\\.ya?ml$'], }; -export const supportedDatasources = [GitTagsDatasource.id]; +export const supportedDatasources = [ + AzurePipelinesTasksDatasource.id, + GitTagsDatasource.id, +]; -- GitLab