From a24d9df8757c61f9dc09684cc6bc489e980d94db Mon Sep 17 00:00:00 2001 From: Connor Younglund Date: Thu, 27 Jul 2023 15:19:52 -0400 Subject: [PATCH 1/4] [sonarqube-backend plugin] added optional `externalUrl` config Signed-off-by: Connor Younglund --- .changeset/warm-peas-hang.md | 5 +++ plugins/sonarqube-backend/README.md | 28 ++++++++++++ plugins/sonarqube-backend/config.d.ts | 14 ++++++ .../src/service/router.test.ts | 21 ++++++++- .../sonarqube-backend/src/service/router.ts | 4 +- .../src/service/sonarqubeInfoProvider.test.ts | 43 +++++++++++++++++++ .../src/service/sonarqubeInfoProvider.ts | 22 ++++++++-- 7 files changed, 129 insertions(+), 8 deletions(-) create mode 100644 .changeset/warm-peas-hang.md diff --git a/.changeset/warm-peas-hang.md b/.changeset/warm-peas-hang.md new file mode 100644 index 0000000000..685bdc2489 --- /dev/null +++ b/.changeset/warm-peas-hang.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-sonarqube-backend': minor +--- + +Added optional `externalUrl` config for setting a different frontend URL diff --git a/plugins/sonarqube-backend/README.md b/plugins/sonarqube-backend/README.md index 4d16dce025..9061dc9d1d 100644 --- a/plugins/sonarqube-backend/README.md +++ b/plugins/sonarqube-backend/README.md @@ -138,6 +138,34 @@ sonarqube: apiKey: abcdef0123456789abcedf0123456789ab ``` +#### Example - Different frontend and backend URLs + +In some instances, you might want to use one URL for the backend and another for the frontend. +This can be achieved by using the optional `externalUrl` property in the config. + +##### Single instance config + +```yaml +sonarqube: + baseUrl: https://sonarqube-internal.example.com + externalUrl: https://sonarqube.example.com + apiKey: 123456789abcdef0123456789abcedf012 +``` + +##### Multiple instance config + +```yaml +sonarqube: + instances: + - name: default + baseUrl: https://default-sonarqube-internal.example.com + externalUrl: https://default-sonarqube.example.com + apiKey: 123456789abcdef0123456789abcedf012 + - name: specialProject + baseUrl: https://special-project-sonarqube.example.com + apiKey: abcdef0123456789abcedf0123456789ab +``` + ## Links - [Sonarqube Frontend](../sonarqube/README.md) diff --git a/plugins/sonarqube-backend/config.d.ts b/plugins/sonarqube-backend/config.d.ts index 7e93f61eb4..0e2ac1ca64 100644 --- a/plugins/sonarqube-backend/config.d.ts +++ b/plugins/sonarqube-backend/config.d.ts @@ -23,6 +23,13 @@ export interface Config { */ baseUrl?: string; + /** + * The external url of the sonarqube installation. + * Use this if you want to use a different url for the frontend than the backend. + * @visibility frontend + */ + externalUrl?: string; + /** * The api key to access the sonarqube instance under baseUrl. * @visibility secret @@ -46,6 +53,13 @@ export interface Config { */ baseUrl: string; + /** + * The external url of the sonarqube instance. + * Use this if you want to use a different url for the frontend than the backend. + * @visibility frontend + */ + externalUrl?: string; + /** * The api key to access the sonarqube instance. * @visibility secret diff --git a/plugins/sonarqube-backend/src/service/router.test.ts b/plugins/sonarqube-backend/src/service/router.test.ts index 7045cdf0d2..bede4c7f6f 100644 --- a/plugins/sonarqube-backend/src/service/router.test.ts +++ b/plugins/sonarqube-backend/src/service/router.test.ts @@ -24,7 +24,7 @@ import { SonarqubeFindings } from './sonarqubeInfoProvider'; describe('createRouter', () => { let app: express.Express; const getBaseUrlMock: jest.Mock< - { baseUrl: string }, + { baseUrl: string; externalUrl?: string }, [{ instanceName: string }] > = jest.fn(); const getFindingsMock: jest.Mock< @@ -55,6 +55,7 @@ describe('createRouter', () => { describe('GET /findings', () => { const DUMMY_COMPONENT_KEY = 'my:component'; const DUMMY_INSTANCE_KEY = 'myInstance'; + it('returns ok', async () => { const measures = { analysisDate: '2022-01-01T00:00:00Z', @@ -77,6 +78,7 @@ describe('createRouter', () => { expect(response.status).toEqual(200); expect(response.body).toEqual(measures); }); + it('returns an error when component key is not defined', async () => { const response = await request(app) .get('/findings') @@ -112,9 +114,12 @@ describe('createRouter', () => { expect(response.body).toEqual(measures); }); }); + describe('GET /instanceUrl', () => { const DUMMY_INSTANCE_KEY = 'myInstance'; - const DUMMY_INSTANCE_URL = 'http://sonarqube.example.com'; + const DUMMY_INSTANCE_URL = 'http://sonarqube-internal.example.com'; + const DUMMY_INSTANCE_EXTERNAL_URL = 'http://sonarqube.example.com'; + it('returns ok', async () => { getBaseUrlMock.mockReturnValue({ baseUrl: DUMMY_INSTANCE_URL }); const response = await request(app) @@ -141,5 +146,17 @@ describe('createRouter', () => { expect(response.status).toEqual(200); expect(response.body).toEqual({ instanceUrl: DUMMY_INSTANCE_URL }); }); + + it('returns the external url when provided', async () => { + getBaseUrlMock.mockReturnValue({ + baseUrl: DUMMY_INSTANCE_URL, + externalUrl: DUMMY_INSTANCE_EXTERNAL_URL, + }); + const response = await request(app).get('/instanceUrl').send(); + expect(response.status).toEqual(200); + expect(response.body).toEqual({ + instanceUrl: DUMMY_INSTANCE_EXTERNAL_URL, + }); + }); }); }); diff --git a/plugins/sonarqube-backend/src/service/router.ts b/plugins/sonarqube-backend/src/service/router.ts index f244ae5ce3..9c63c5c3cd 100644 --- a/plugins/sonarqube-backend/src/service/router.ts +++ b/plugins/sonarqube-backend/src/service/router.ts @@ -81,11 +81,11 @@ export async function createRouter( ? `Retrieving sonarqube instance URL for key ${instanceKey}` : `Retrieving default sonarqube instance URL as instanceKey is not provided`, ); - const { baseUrl } = sonarqubeInfoProvider.getBaseUrl({ + const { baseUrl, externalUrl } = sonarqubeInfoProvider.getBaseUrl({ instanceName: instanceKey, }); response.json({ - instanceUrl: baseUrl, + instanceUrl: externalUrl || baseUrl, }); }); diff --git a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts index 72ab2ecee2..151f767974 100644 --- a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts +++ b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts @@ -27,6 +27,7 @@ describe('SonarqubeConfig', () => { const SONARQUBE_DEFAULT_INSTANCE_NAME = 'default'; const DUMMY_SONAR_URL = 'https://sonarqube.example.com'; const DUMMY_SONAR_APIKEY = '123456789abcdef0123456789abcedf012'; + const DUMMY_SIMPLE_OBJECT_FOR_DEFAULT_SONARQUBE_CONFIG = { name: SONARQUBE_DEFAULT_INSTANCE_NAME, baseUrl: DUMMY_SONAR_URL, @@ -112,6 +113,7 @@ describe('SonarqubeConfig', () => { }, ]); }); + it('Throw an error if both a named default config and top level config', async () => { expect(() => SonarqubeConfig.fromConfig( @@ -299,6 +301,46 @@ describe('DefaultSonarqubeInfoProvider', () => { baseUrl: 'https://sonarqube-other.example.com', }); }); + + it('Provide external url for simple config', async () => { + const provider = configureProvider({ + sonarqube: { + baseUrl: 'https://sonarqube-internal.example.com', + externalUrl: 'https://sonarqube.example.com', + apiKey: '123456789abcdef0123456789abcedf012', + }, + }); + + expect(provider.getBaseUrl()).toEqual({ + baseUrl: 'https://sonarqube-internal.example.com', + externalUrl: 'https://sonarqube.example.com', + }); + }); + + it('Provide external url for named config', async () => { + const provider = configureProvider({ + sonarqube: { + instances: [ + { + name: 'default', + baseUrl: 'https://sonarqube.example.com', + apiKey: '123456789abcdef0123456789abcedf012', + }, + { + name: 'other', + baseUrl: 'https://sonarqube-other-internal.example.com', + externalUrl: 'https://sonarqube-other.example.com', + apiKey: '123456789abcdef0123456789abcedf012', + }, + ], + }, + }); + + expect(provider.getBaseUrl({ instanceName: 'other' })).toEqual({ + baseUrl: 'https://sonarqube-other-internal.example.com', + externalUrl: 'https://sonarqube-other.example.com', + }); + }); }); describe('getFindings', () => { @@ -385,6 +427,7 @@ describe('DefaultSonarqubeInfoProvider', () => { apiKey: DUMMY_API_KEY, }, }; + it('Provide findings when everything is ok', async () => { setupHandlers(); const provider = configureProvider(DUMMY_SIMPLE_CONFIG_FOR_PROVIDER); diff --git a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts index 2b96e6764e..6277f6f57e 100644 --- a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts +++ b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts @@ -30,7 +30,10 @@ export interface SonarqubeInfoProvider { * @param instanceName - Name of the sonarqube instance to get the info from * @returns the url of the instance */ - getBaseUrl(options?: { instanceName?: string }): { baseUrl: string }; + getBaseUrl(options?: { instanceName?: string }): { + baseUrl: string; + externalUrl?: string; + }; /** * Query the sonarqube instance corresponding to the instanceName to get all @@ -96,6 +99,10 @@ export interface SonarqubeInstanceConfig { * Base url to access the instance */ baseUrl: string; + /** + * External url to access the instance from the frontend + */ + externalUrl?: string; /** * Access token to access the sonarqube instance as generated in user profile. */ @@ -132,6 +139,7 @@ export class SonarqubeConfig { sonarqubeConfig.getOptionalConfigArray('instances')?.map(c => ({ name: c.getString('name'), baseUrl: c.getString('baseUrl'), + externalUrl: c.getOptionalString('externalUrl'), apiKey: c.getString('apiKey'), })) || []; @@ -142,9 +150,10 @@ export class SonarqubeConfig { // Get these as optional strings and check to give a better error message const baseUrl = sonarqubeConfig.getOptionalString('baseUrl'); + const externalUrl = sonarqubeConfig.getOptionalString('externalUrl'); const apiKey = sonarqubeConfig.getOptionalString('apiKey'); - if (hasNamedDefault && (baseUrl || apiKey)) { + if (hasNamedDefault && (baseUrl || externalUrl || apiKey)) { throw new Error( `Found both a named sonarqube instance with name ${DEFAULT_SONARQUBE_NAME} and top level baseUrl or apiKey config. Use only one style of config.`, ); @@ -160,10 +169,11 @@ export class SonarqubeConfig { if (unnamedAllPresent) { const unnamedInstanceConfig = [ - { name: DEFAULT_SONARQUBE_NAME, baseUrl, apiKey }, + { name: DEFAULT_SONARQUBE_NAME, baseUrl, externalUrl, apiKey }, ] as { name: string; baseUrl: string; + externalUrl?: string; apiKey: string; }[]; @@ -303,11 +313,15 @@ export class DefaultSonarqubeInfoProvider implements SonarqubeInfoProvider { */ getBaseUrl(options: { instanceName?: string } = {}): { baseUrl: string; + externalUrl?: string; } { const instanceConfig = this.config.getInstanceConfig({ sonarqubeName: options.instanceName, }); - return { baseUrl: instanceConfig.baseUrl }; + return { + baseUrl: instanceConfig.baseUrl, + externalUrl: instanceConfig.externalUrl, + }; } /** From b1e9dcec6a21658140fdc364fa49ca42411b2d50 Mon Sep 17 00:00:00 2001 From: Connor Younglund Date: Thu, 27 Jul 2023 15:42:33 -0400 Subject: [PATCH 2/4] updated api-report.md Signed-off-by: Connor Younglund --- plugins/sonarqube-backend/api-report.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/sonarqube-backend/api-report.md b/plugins/sonarqube-backend/api-report.md index 0fbd463cf3..cf0314aad1 100644 --- a/plugins/sonarqube-backend/api-report.md +++ b/plugins/sonarqube-backend/api-report.md @@ -15,6 +15,7 @@ export class DefaultSonarqubeInfoProvider implements SonarqubeInfoProvider { static fromConfig(config: Config): DefaultSonarqubeInfoProvider; getBaseUrl(options?: { instanceName?: string }): { baseUrl: string; + externalUrl?: string; }; getFindings(options: { componentKey: string; @@ -49,6 +50,7 @@ export interface SonarqubeFindings { export interface SonarqubeInfoProvider { getBaseUrl(options?: { instanceName?: string }): { baseUrl: string; + externalUrl?: string; }; getFindings(options: { componentKey: string; @@ -60,6 +62,7 @@ export interface SonarqubeInfoProvider { export interface SonarqubeInstanceConfig { apiKey: string; baseUrl: string; + externalUrl?: string; name: string; } From 8e741a1bd29b92c767e9b308f151d10468be1980 Mon Sep 17 00:00:00 2001 From: Connor Younglund Date: Tue, 1 Aug 2023 08:42:10 -0400 Subject: [PATCH 3/4] renamed config and variables Signed-off-by: Connor Younglund --- .changeset/warm-peas-hang.md | 2 +- plugins/sonarqube-backend/README.md | 6 +++--- plugins/sonarqube-backend/api-report.md | 6 +++--- plugins/sonarqube-backend/config.d.ts | 4 ++-- .../src/service/router.test.ts | 6 +++--- .../sonarqube-backend/src/service/router.ts | 4 ++-- .../src/service/sonarqubeInfoProvider.test.ts | 12 ++++++------ .../src/service/sonarqubeInfoProvider.ts | 19 ++++++++++--------- 8 files changed, 30 insertions(+), 29 deletions(-) diff --git a/.changeset/warm-peas-hang.md b/.changeset/warm-peas-hang.md index 685bdc2489..a8a40c1ccd 100644 --- a/.changeset/warm-peas-hang.md +++ b/.changeset/warm-peas-hang.md @@ -2,4 +2,4 @@ '@backstage/plugin-sonarqube-backend': minor --- -Added optional `externalUrl` config for setting a different frontend URL +Added optional `externalBaseUrl` config for setting a different frontend URL diff --git a/plugins/sonarqube-backend/README.md b/plugins/sonarqube-backend/README.md index 9061dc9d1d..b417fea7c4 100644 --- a/plugins/sonarqube-backend/README.md +++ b/plugins/sonarqube-backend/README.md @@ -141,14 +141,14 @@ sonarqube: #### Example - Different frontend and backend URLs In some instances, you might want to use one URL for the backend and another for the frontend. -This can be achieved by using the optional `externalUrl` property in the config. +This can be achieved by using the optional `externalBaseUrl` property in the config. ##### Single instance config ```yaml sonarqube: baseUrl: https://sonarqube-internal.example.com - externalUrl: https://sonarqube.example.com + externalBaseUrl: https://sonarqube.example.com apiKey: 123456789abcdef0123456789abcedf012 ``` @@ -159,7 +159,7 @@ sonarqube: instances: - name: default baseUrl: https://default-sonarqube-internal.example.com - externalUrl: https://default-sonarqube.example.com + externalBaseUrl: https://default-sonarqube.example.com apiKey: 123456789abcdef0123456789abcedf012 - name: specialProject baseUrl: https://special-project-sonarqube.example.com diff --git a/plugins/sonarqube-backend/api-report.md b/plugins/sonarqube-backend/api-report.md index cf0314aad1..535db37185 100644 --- a/plugins/sonarqube-backend/api-report.md +++ b/plugins/sonarqube-backend/api-report.md @@ -15,7 +15,7 @@ export class DefaultSonarqubeInfoProvider implements SonarqubeInfoProvider { static fromConfig(config: Config): DefaultSonarqubeInfoProvider; getBaseUrl(options?: { instanceName?: string }): { baseUrl: string; - externalUrl?: string; + externalBaseUrl?: string; }; getFindings(options: { componentKey: string; @@ -50,7 +50,7 @@ export interface SonarqubeFindings { export interface SonarqubeInfoProvider { getBaseUrl(options?: { instanceName?: string }): { baseUrl: string; - externalUrl?: string; + externalBaseUrl?: string; }; getFindings(options: { componentKey: string; @@ -62,7 +62,7 @@ export interface SonarqubeInfoProvider { export interface SonarqubeInstanceConfig { apiKey: string; baseUrl: string; - externalUrl?: string; + externalBaseUrl?: string; name: string; } diff --git a/plugins/sonarqube-backend/config.d.ts b/plugins/sonarqube-backend/config.d.ts index 0e2ac1ca64..6e03a53f0c 100644 --- a/plugins/sonarqube-backend/config.d.ts +++ b/plugins/sonarqube-backend/config.d.ts @@ -28,7 +28,7 @@ export interface Config { * Use this if you want to use a different url for the frontend than the backend. * @visibility frontend */ - externalUrl?: string; + externalBaseUrl?: string; /** * The api key to access the sonarqube instance under baseUrl. @@ -58,7 +58,7 @@ export interface Config { * Use this if you want to use a different url for the frontend than the backend. * @visibility frontend */ - externalUrl?: string; + externalBaseUrl?: string; /** * The api key to access the sonarqube instance. diff --git a/plugins/sonarqube-backend/src/service/router.test.ts b/plugins/sonarqube-backend/src/service/router.test.ts index bede4c7f6f..b40e2d1528 100644 --- a/plugins/sonarqube-backend/src/service/router.test.ts +++ b/plugins/sonarqube-backend/src/service/router.test.ts @@ -24,7 +24,7 @@ import { SonarqubeFindings } from './sonarqubeInfoProvider'; describe('createRouter', () => { let app: express.Express; const getBaseUrlMock: jest.Mock< - { baseUrl: string; externalUrl?: string }, + { baseUrl: string; externalBaseUrl?: string }, [{ instanceName: string }] > = jest.fn(); const getFindingsMock: jest.Mock< @@ -147,10 +147,10 @@ describe('createRouter', () => { expect(response.body).toEqual({ instanceUrl: DUMMY_INSTANCE_URL }); }); - it('returns the external url when provided', async () => { + it('returns the external base url when provided', async () => { getBaseUrlMock.mockReturnValue({ baseUrl: DUMMY_INSTANCE_URL, - externalUrl: DUMMY_INSTANCE_EXTERNAL_URL, + externalBaseUrl: DUMMY_INSTANCE_EXTERNAL_URL, }); const response = await request(app).get('/instanceUrl').send(); expect(response.status).toEqual(200); diff --git a/plugins/sonarqube-backend/src/service/router.ts b/plugins/sonarqube-backend/src/service/router.ts index 9c63c5c3cd..5a993b5d59 100644 --- a/plugins/sonarqube-backend/src/service/router.ts +++ b/plugins/sonarqube-backend/src/service/router.ts @@ -81,11 +81,11 @@ export async function createRouter( ? `Retrieving sonarqube instance URL for key ${instanceKey}` : `Retrieving default sonarqube instance URL as instanceKey is not provided`, ); - const { baseUrl, externalUrl } = sonarqubeInfoProvider.getBaseUrl({ + const { baseUrl, externalBaseUrl } = sonarqubeInfoProvider.getBaseUrl({ instanceName: instanceKey, }); response.json({ - instanceUrl: externalUrl || baseUrl, + instanceUrl: externalBaseUrl || baseUrl, }); }); diff --git a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts index 151f767974..468020c1b3 100644 --- a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts +++ b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.test.ts @@ -302,22 +302,22 @@ describe('DefaultSonarqubeInfoProvider', () => { }); }); - it('Provide external url for simple config', async () => { + it('Provide external base url for simple config', async () => { const provider = configureProvider({ sonarqube: { baseUrl: 'https://sonarqube-internal.example.com', - externalUrl: 'https://sonarqube.example.com', + externalBaseUrl: 'https://sonarqube.example.com', apiKey: '123456789abcdef0123456789abcedf012', }, }); expect(provider.getBaseUrl()).toEqual({ baseUrl: 'https://sonarqube-internal.example.com', - externalUrl: 'https://sonarqube.example.com', + externalBaseUrl: 'https://sonarqube.example.com', }); }); - it('Provide external url for named config', async () => { + it('Provide external base url for named config', async () => { const provider = configureProvider({ sonarqube: { instances: [ @@ -329,7 +329,7 @@ describe('DefaultSonarqubeInfoProvider', () => { { name: 'other', baseUrl: 'https://sonarqube-other-internal.example.com', - externalUrl: 'https://sonarqube-other.example.com', + externalBaseUrl: 'https://sonarqube-other.example.com', apiKey: '123456789abcdef0123456789abcedf012', }, ], @@ -338,7 +338,7 @@ describe('DefaultSonarqubeInfoProvider', () => { expect(provider.getBaseUrl({ instanceName: 'other' })).toEqual({ baseUrl: 'https://sonarqube-other-internal.example.com', - externalUrl: 'https://sonarqube-other.example.com', + externalBaseUrl: 'https://sonarqube-other.example.com', }); }); }); diff --git a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts index 6277f6f57e..a5c0bf985a 100644 --- a/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts +++ b/plugins/sonarqube-backend/src/service/sonarqubeInfoProvider.ts @@ -32,7 +32,7 @@ export interface SonarqubeInfoProvider { */ getBaseUrl(options?: { instanceName?: string }): { baseUrl: string; - externalUrl?: string; + externalBaseUrl?: string; }; /** @@ -102,7 +102,7 @@ export interface SonarqubeInstanceConfig { /** * External url to access the instance from the frontend */ - externalUrl?: string; + externalBaseUrl?: string; /** * Access token to access the sonarqube instance as generated in user profile. */ @@ -139,7 +139,7 @@ export class SonarqubeConfig { sonarqubeConfig.getOptionalConfigArray('instances')?.map(c => ({ name: c.getString('name'), baseUrl: c.getString('baseUrl'), - externalUrl: c.getOptionalString('externalUrl'), + externalBaseUrl: c.getOptionalString('externalBaseUrl'), apiKey: c.getString('apiKey'), })) || []; @@ -150,10 +150,11 @@ export class SonarqubeConfig { // Get these as optional strings and check to give a better error message const baseUrl = sonarqubeConfig.getOptionalString('baseUrl'); - const externalUrl = sonarqubeConfig.getOptionalString('externalUrl'); + const externalBaseUrl = + sonarqubeConfig.getOptionalString('externalBaseUrl'); const apiKey = sonarqubeConfig.getOptionalString('apiKey'); - if (hasNamedDefault && (baseUrl || externalUrl || apiKey)) { + if (hasNamedDefault && (baseUrl || externalBaseUrl || apiKey)) { throw new Error( `Found both a named sonarqube instance with name ${DEFAULT_SONARQUBE_NAME} and top level baseUrl or apiKey config. Use only one style of config.`, ); @@ -169,11 +170,11 @@ export class SonarqubeConfig { if (unnamedAllPresent) { const unnamedInstanceConfig = [ - { name: DEFAULT_SONARQUBE_NAME, baseUrl, externalUrl, apiKey }, + { name: DEFAULT_SONARQUBE_NAME, baseUrl, externalBaseUrl, apiKey }, ] as { name: string; baseUrl: string; - externalUrl?: string; + externalBaseUrl?: string; apiKey: string; }[]; @@ -313,14 +314,14 @@ export class DefaultSonarqubeInfoProvider implements SonarqubeInfoProvider { */ getBaseUrl(options: { instanceName?: string } = {}): { baseUrl: string; - externalUrl?: string; + externalBaseUrl?: string; } { const instanceConfig = this.config.getInstanceConfig({ sonarqubeName: options.instanceName, }); return { baseUrl: instanceConfig.baseUrl, - externalUrl: instanceConfig.externalUrl, + externalBaseUrl: instanceConfig.externalBaseUrl, }; } From 6711f7739ae92c8ec3e244150fcfc4db12cf0b81 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 12 Aug 2023 14:54:30 +0200 Subject: [PATCH 4/4] Update .changeset/warm-peas-hang.md Signed-off-by: Patrik Oldsberg --- .changeset/warm-peas-hang.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/warm-peas-hang.md b/.changeset/warm-peas-hang.md index a8a40c1ccd..5359e2c547 100644 --- a/.changeset/warm-peas-hang.md +++ b/.changeset/warm-peas-hang.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-sonarqube-backend': minor +'@backstage/plugin-sonarqube-backend': patch --- Added optional `externalBaseUrl` config for setting a different frontend URL