diff --git a/workspaces/jenkins/.changeset/tasty-wasps-behave.md b/workspaces/jenkins/.changeset/tasty-wasps-behave.md new file mode 100644 index 0000000000..be1f7ed45a --- /dev/null +++ b/workspaces/jenkins/.changeset/tasty-wasps-behave.md @@ -0,0 +1,5 @@ +--- +'@backstage-community/plugin-jenkins-backend': patch +--- + +Add ExtensionPoint to allow usage of a custom JenkinsInfoProvider diff --git a/workspaces/jenkins/plugins/jenkins-backend/src/extensions.ts b/workspaces/jenkins/plugins/jenkins-backend/src/extensions.ts new file mode 100644 index 0000000000..405b2a95f9 --- /dev/null +++ b/workspaces/jenkins/plugins/jenkins-backend/src/extensions.ts @@ -0,0 +1,35 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createExtensionPoint } from '@backstage/backend-plugin-api'; +import { JenkinsInfoProvider } from './service'; + +/** + * @public + */ +export interface JenkinsInfoProviderExtensionPoint { + setInfoProvider(infoProvider: JenkinsInfoProvider): void; +} + +/** + * Extension point that allows a different JenkinsInfoProvider to be used. + * + * @public + */ +export const jenkinsInfoProviderExtensionPoint = + createExtensionPoint({ + id: 'jenkins.info-provider', + }); diff --git a/workspaces/jenkins/plugins/jenkins-backend/src/plugin.ts b/workspaces/jenkins/plugins/jenkins-backend/src/plugin.ts index b3e651c546..c81cccee87 100644 --- a/workspaces/jenkins/plugins/jenkins-backend/src/plugin.ts +++ b/workspaces/jenkins/plugins/jenkins-backend/src/plugin.ts @@ -18,9 +18,13 @@ import { coreServices, createBackendPlugin, } from '@backstage/backend-plugin-api'; -import { DefaultJenkinsInfoProvider } from './service/jenkinsInfoProvider'; +import { + DefaultJenkinsInfoProvider, + JenkinsInfoProvider, +} from './service/jenkinsInfoProvider'; import { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha'; import { JenkinsBuilder } from './service/JenkinsBuilder'; +import { jenkinsInfoProviderExtensionPoint } from './extensions'; /** * Jenkins backend plugin @@ -30,6 +34,17 @@ import { JenkinsBuilder } from './service/JenkinsBuilder'; export const jenkinsPlugin = createBackendPlugin({ pluginId: 'jenkins', register(env) { + let jenkinsInfoProvider: JenkinsInfoProvider | undefined; + + env.registerExtensionPoint(jenkinsInfoProviderExtensionPoint, { + setInfoProvider(customInfoProvider: JenkinsInfoProvider) { + if (jenkinsInfoProvider) { + throw new Error('The JenkinsInfoProvider has been already set'); + } + jenkinsInfoProvider = customInfoProvider; + }, + }); + env.registerInit({ deps: { logger: coreServices.logger, @@ -51,14 +66,17 @@ export const jenkinsPlugin = createBackendPlugin({ auth, httpAuth, }) { - const jenkinsInfoProvider = DefaultJenkinsInfoProvider.fromConfig({ - auth, - httpAuth, - config, - catalog: catalogClient, - discovery, - logger, - }); + jenkinsInfoProvider = + jenkinsInfoProvider ?? + DefaultJenkinsInfoProvider.fromConfig({ + auth, + httpAuth, + config, + catalog: catalogClient, + discovery, + logger, + }); + const builder = JenkinsBuilder.createBuilder({ /** * Logger for logging purposes