diff --git a/lib/modules/datasource/terraform-module/__fixtures__/registry-versions-with-source.json b/lib/modules/datasource/terraform-module/__fixtures__/registry-versions-with-source.json new file mode 100644 index 00000000000000..614ef26c199a61 --- /dev/null +++ b/lib/modules/datasource/terraform-module/__fixtures__/registry-versions-with-source.json @@ -0,0 +1,35 @@ +{ + "modules": [ + { + "versions": [ + { + "version": "0.0.2", + "submodules": [], + "root": { + "dependencies": [], + "providers": [ + { + "name": "local", + "version": "" + } + ] + } + }, + { + "version": "0.0.1", + "submodules": [], + "root": { + "dependencies": [], + "providers": [ + { + "name": "local", + "version": "" + } + ] + } + } + ], + "source": "https://gitlab.com/renovate-issue-25003/mymodule" + } + ] +} diff --git a/lib/modules/datasource/terraform-module/index.spec.ts b/lib/modules/datasource/terraform-module/index.spec.ts index de102a2324b298..8360e066faba4e 100644 --- a/lib/modules/datasource/terraform-module/index.spec.ts +++ b/lib/modules/datasource/terraform-module/index.spec.ts @@ -5,6 +5,9 @@ import { TerraformModuleDatasource } from '.'; const consulData = Fixtures.get('registry-consul.json'); const consulVersionsData = Fixtures.get('registry-consul-versions.json'); +const versionsDataWithSourceUrl = Fixtures.get( + 'registry-versions-with-source.json' +); const serviceDiscoveryResult = Fixtures.get('service-discovery.json'); const serviceDiscoveryCustomResult = Fixtures.get( 'service-custom-discovery.json' @@ -176,6 +179,32 @@ describe('modules/datasource/terraform-module/index', () => { }); }); + it('processes real data from third party including source url', async () => { + httpMock + .scope('https://terraform.company.com') + .get('/v1/modules/renovate-issue-25003/mymodule/local/versions') + .reply(200, versionsDataWithSourceUrl) + .get('/.well-known/terraform.json') + .reply(200, serviceDiscoveryResult); + const res = await getPkgReleases({ + datasource, + packageName: 'renovate-issue-25003/mymodule/local', + registryUrls: ['https://terraform.company.com'], + }); + expect(res).toEqual({ + registryUrl: 'https://terraform.company.com', + releases: [ + { + version: '0.0.1', + }, + { + version: '0.0.2', + }, + ], + sourceUrl: 'https://gitlab.com/renovate-issue-25003/mymodule', + }); + }); + it('processes with registry in name', async () => { httpMock .scope(baseUrl) diff --git a/lib/modules/datasource/terraform-module/index.ts b/lib/modules/datasource/terraform-module/index.ts index e85a5c7c99934c..81e3e2a6c36ad9 100644 --- a/lib/modules/datasource/terraform-module/index.ts +++ b/lib/modules/datasource/terraform-module/index.ts @@ -2,6 +2,7 @@ import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; import { regEx } from '../../../util/regex'; import { coerceString } from '../../../util/string'; +import { validateUrl } from '../../../util/url'; import * as hashicorpVersioning from '../../versioning/hashicorp'; import type { GetReleasesConfig, ReleaseResult } from '../types'; import { TerraformDatasource } from './base'; @@ -159,6 +160,12 @@ export class TerraformModuleDatasource extends TerraformDatasource { version, })), }; + + // Add the source URL if given + if (validateUrl(res.modules[0].source)) { + dep.sourceUrl = res.modules[0].source; + } + return dep; } diff --git a/lib/modules/datasource/terraform-module/types.ts b/lib/modules/datasource/terraform-module/types.ts index c394ee55a463bd..4a47ada419ca83 100644 --- a/lib/modules/datasource/terraform-module/types.ts +++ b/lib/modules/datasource/terraform-module/types.ts @@ -22,6 +22,9 @@ export interface TerraformModuleVersions { export interface TerraformModuleVersionsModules { versions: TerraformModuleVersionsModuleVersion[]; + // 'source' is not part of the base spec but GitLab supports it: + // https://docs.gitlab.com/ee/api/packages/terraform-modules.html#list-available-versions-for-a-specific-module + source?: string; } export interface TerraformModuleVersionsModuleVersion {