diff --git a/plugins/renovate-backend/src/wrapper/platforms/index.test.ts b/plugins/renovate-backend/src/wrapper/platforms/index.test.ts index af2254dba..4a5629a25 100644 --- a/plugins/renovate-backend/src/wrapper/platforms/index.test.ts +++ b/plugins/renovate-backend/src/wrapper/platforms/index.test.ts @@ -1,6 +1,6 @@ import { getPlatformEnvs } from './index'; import { mockDeep } from 'jest-mock-extended'; -import { DefaultGithubCredentialsProvider } from '@backstage/integration'; +import { DefaultGithubCredentialsProvider, DefaultAzureDevOpsCredentialsProvider } from '@backstage/integration'; import { mockServices } from '@backstage/backend-test-utils'; const githubCredentialProvider = mockDeep(); @@ -8,9 +8,15 @@ DefaultGithubCredentialsProvider.fromIntegrations = jest .fn() .mockReturnValue(githubCredentialProvider); +const azureCredentialProvider = mockDeep(); +DefaultAzureDevOpsCredentialsProvider.fromIntegrations = jest + .fn() + .mockReturnValue(azureCredentialProvider); + describe('wrapper/platforms', () => { beforeEach(() => { githubCredentialProvider.getCredentials.mockReset(); + azureCredentialProvider.getCredentials.mockReset(); }); it('throw if platform could not be identified', async () => { @@ -153,4 +159,51 @@ describe('wrapper/platforms', () => { RENOVATE_TOKEN: 'bbbbbbbbbb', }); }); + + it('return env for azure devops with token', async () => { + const rootConfig = mockServices.rootConfig({ + data: { + integrations: { + github: [ + { + host: 'github.com', + token: 'aaaaaa', + }, + ], + azure: [ + { + host: 'dev.azure.com', + token: 'cccccccc', + }, + ], + }, + }, + }); + githubCredentialProvider.getCredentials.mockResolvedValue({ + token: 'aaaaaa', + type: 'token', + }); + azureCredentialProvider.getCredentials.mockResolvedValue({ + token: 'cccccccc', + type: 'token', + }); + await expect( + getPlatformEnvs( + { + host: 'dev.azure.com', + repository: 'myOrg/myRepo', + }, + { + rootConfig, + logger: mockServices.logger.mock(), + }, + ), + ).resolves.toEqual({ + RENOVATE_ENDPOINT: 'https://dev.azure.com', + GITHUB_COM_TOKEN: 'aaaaaa', + RENOVATE_PLATFORM: 'azure', + RENOVATE_REPOSITORIES: 'myOrg/myRepo', + RENOVATE_TOKEN: 'cccccccc', + }); + }); }); diff --git a/plugins/renovate-backend/src/wrapper/platforms/index.ts b/plugins/renovate-backend/src/wrapper/platforms/index.ts index d546e01be..dad7dfcd1 100644 --- a/plugins/renovate-backend/src/wrapper/platforms/index.ts +++ b/plugins/renovate-backend/src/wrapper/platforms/index.ts @@ -1,6 +1,7 @@ import { DefaultGitlabCredentialsProvider, ScmIntegrations, + DefaultAzureDevOpsCredentialsProvider, } from '@backstage/integration'; import is from '@sindresorhus/is'; import { PlatformEnvsOptions } from './types'; @@ -52,6 +53,25 @@ export async function getPlatformEnvs( env.RENOVATE_REPOSITORIES = target.repository; } break; + case 'azure': + case 'azure-devops': + case 'azuredevops': + { + const cred = await DefaultAzureDevOpsCredentialsProvider.fromIntegrations( + integrations, + ).getCredentials({ url }); + const azureIntegrationConfig = requireConfigVariable( + integrations.azure.byHost(target.host)?.config, + errMsg, + ); + env.RENOVATE_PLATFORM = 'azure'; + // Use configured apiBaseUrl if present, otherwise fall back to host + env.RENOVATE_ENDPOINT = + azureIntegrationConfig.apiBaseUrl ?? `https://${target.host}`; + env.RENOVATE_TOKEN = requireConfigVariable(cred.token, errMsg); + env.RENOVATE_REPOSITORIES = target.repository; + } + break; default: throw new Error(`Unsupported platform type ${integration.type}`); }