Merge pull request #29641 from awanlin/github-catalog/remove-backend-common

GitHub catalog - Updated `GithubLocationAnalyzer` and removed `@backstage/backend-common`
This commit is contained in:
Fredrik Adelöw
2025-04-22 13:41:58 +02:00
committed by GitHub
7 changed files with 63 additions and 96 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-github': minor
---
**BREAKING** The `GithubLocationAnalyzer` now requires the `AuthService` and the `CatalogService` when being constructed and the `TokenManger` has been removed.
@@ -51,7 +51,6 @@
"test": "backstage-cli package test"
},
"dependencies": {
"@backstage/backend-common": "^0.25.0",
"@backstage/backend-plugin-api": "workspace:^",
"@backstage/catalog-client": "workspace:^",
"@backstage/catalog-model": "workspace:^",
@@ -6,11 +6,10 @@
import { AnalyzeOptions } from '@backstage/plugin-catalog-node';
import { AuthService } from '@backstage/backend-plugin-api';
import { BackendFeature } from '@backstage/backend-plugin-api';
import { CatalogApi } from '@backstage/catalog-client';
import { CatalogProcessor } from '@backstage/plugin-catalog-node';
import { CatalogProcessorEmit } from '@backstage/plugin-catalog-node';
import { CatalogService } from '@backstage/plugin-catalog-node';
import { Config } from '@backstage/config';
import { DiscoveryService } from '@backstage/backend-plugin-api';
import { Entity } from '@backstage/catalog-model';
import { EntityProvider } from '@backstage/plugin-catalog-node';
import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
@@ -26,7 +25,6 @@ import { SchedulerService } from '@backstage/backend-plugin-api';
import { SchedulerServiceTaskRunner } from '@backstage/backend-plugin-api';
import { ScmIntegrationRegistry } from '@backstage/integration';
import { ScmLocationAnalyzer } from '@backstage/plugin-catalog-node';
import { TokenManager } from '@backstage/backend-common';
import { UserEntity } from '@backstage/catalog-model';
// @public
@@ -127,11 +125,9 @@ export class GithubLocationAnalyzer implements ScmLocationAnalyzer {
// @public (undocumented)
export type GithubLocationAnalyzerOptions = {
config: Config;
discovery: DiscoveryService;
tokenManager?: TokenManager;
auth?: AuthService;
auth: AuthService;
githubCredentialsProvider?: GithubCredentialsProvider;
catalog?: CatalogApi;
catalog: CatalogService;
};
// @public
@@ -38,15 +38,12 @@ import {
mockServices,
} from '@backstage/backend-test-utils';
import { setupServer } from 'msw/node';
import { http, HttpResponse } from 'msw';
import { catalogServiceMock } from '@backstage/plugin-catalog-node/testUtils';
const server = setupServer();
describe('GithubLocationAnalyzer', () => {
const mockDiscovery = mockServices.discovery.mock({
getBaseUrl: async () => 'http://localhost:7007',
});
const mockAuthService = mockServices.auth.mock({
const auth = mockServices.auth.mock({
getPluginRequestToken: async () => ({ token: 'abc123' }),
});
const config = mockServices.rootConfig({
@@ -56,49 +53,48 @@ describe('GithubLocationAnalyzer', () => {
},
},
});
const catalog = catalogServiceMock.mock({
addLocation: jest.fn(async location => ({
location: {
id: 'test',
target: location.target,
type: location.type ?? 'url',
},
exists: false,
entities: [
{
apiVersion: 'backstage.io/v1alpha1',
kind: 'Location',
metadata: {
name: 'test-entity',
},
spec: {
type: 'url',
target: 'whatever',
},
},
{
apiVersion: 'backstage.io/v1alpha1',
kind: 'Component',
metadata: {
title: 'Test Entity',
name: 'test-entity-2',
description: 'The expected description 2',
},
spec: {
type: 'some-type',
lifecycle: 'experimental',
owner: 'someone',
},
},
],
})),
});
registerMswTestHooks(server);
beforeEach(() => {
server.use(
http.post('http://localhost:7007/locations', () =>
HttpResponse.json(
{
location: 'test',
exists: false,
entities: [
{
apiVersion: 'backstage.io/v1alpha1',
kind: 'Location',
metadata: {
name: 'test-entity',
},
spec: {
type: 'url',
target: 'whatever',
},
},
{
apiVersion: 'backstage.io/v1alpha1',
kind: 'Component',
metadata: {
title: 'Test Entity',
name: 'test-entity-2',
description: 'The expected description 2',
},
spec: {
type: 'some-type',
lifecycle: 'experimental',
owner: 'someone',
},
},
],
},
{ status: 201 },
),
),
);
jest.clearAllMocks();
octokit.repos.get.mockResolvedValue({
data: { default_branch: 'my_default_branch' },
});
@@ -114,11 +110,8 @@ describe('GithubLocationAnalyzer', () => {
return Promise.reject();
});
const analyzer = new GithubLocationAnalyzer({
discovery: mockDiscovery,
auth: mockAuthService,
config,
});
const analyzer = new GithubLocationAnalyzer({ catalog, auth, config });
const result = await analyzer.analyze({
url: 'https://github.com/foo/bar',
});
@@ -141,11 +134,8 @@ describe('GithubLocationAnalyzer', () => {
return Promise.reject();
});
const analyzer = new GithubLocationAnalyzer({
discovery: mockDiscovery,
auth: mockAuthService,
config,
});
const analyzer = new GithubLocationAnalyzer({ catalog, auth, config });
const result = await analyzer.analyze({
url: 'https://github.com/foo/bar',
catalogFilename: 'anvil.yaml',
@@ -167,11 +157,8 @@ describe('GithubLocationAnalyzer', () => {
return Promise.reject();
});
const analyzer = new GithubLocationAnalyzer({
discovery: mockDiscovery,
auth: mockAuthService,
config,
});
const analyzer = new GithubLocationAnalyzer({ catalog, auth, config });
const result = await analyzer.analyze({
url: 'https://github.com/foo/bar',
catalogFilename: '.gitignore',
@@ -14,7 +14,6 @@
* limitations under the License.
*/
import { CatalogApi, CatalogClient } from '@backstage/catalog-client';
import {
DefaultGithubCredentialsProvider,
GithubCredentialsProvider,
@@ -26,46 +25,36 @@ import { isEmpty, trimEnd } from 'lodash';
import parseGitUrl from 'git-url-parse';
import {
AnalyzeOptions,
CatalogService,
ScmLocationAnalyzer,
} from '@backstage/plugin-catalog-node';
import {
TokenManager,
createLegacyAuthAdapters,
} from '@backstage/backend-common';
import { Config } from '@backstage/config';
import { AuthService, DiscoveryService } from '@backstage/backend-plugin-api';
import { AuthService } from '@backstage/backend-plugin-api';
import { extname } from 'path';
/** @public */
export type GithubLocationAnalyzerOptions = {
config: Config;
discovery: DiscoveryService;
tokenManager?: TokenManager;
auth?: AuthService;
auth: AuthService;
githubCredentialsProvider?: GithubCredentialsProvider;
catalog?: CatalogApi;
catalog: CatalogService;
};
/** @public */
export class GithubLocationAnalyzer implements ScmLocationAnalyzer {
private readonly catalogClient: CatalogApi;
private readonly catalogClient: CatalogService;
private readonly githubCredentialsProvider: GithubCredentialsProvider;
private readonly integrations: ScmIntegrationRegistry;
private readonly auth: AuthService;
constructor(options: GithubLocationAnalyzerOptions) {
this.catalogClient =
options.catalog ?? new CatalogClient({ discoveryApi: options.discovery });
this.catalogClient = options.catalog;
this.integrations = ScmIntegrations.fromConfig(options.config);
this.githubCredentialsProvider =
options.githubCredentialsProvider ||
DefaultGithubCredentialsProvider.fromIntegrations(this.integrations);
this.auth = createLegacyAuthAdapters({
auth: options.auth,
discovery: options.discovery,
tokenManager: options.tokenManager,
}).auth;
this.auth = options.auth;
}
supports(url: string) {
@@ -115,11 +104,6 @@ export class GithubLocationAnalyzer implements ScmLocationAnalyzer {
});
const defaultBranch = repoInformation.data.default_branch;
const { token: serviceToken } = await this.auth.getPluginRequestToken({
onBehalfOf: await this.auth.getOwnServiceCredentials(),
targetPluginId: 'catalog',
});
const result = await Promise.all(
searchResult.data.items
.map(i => `${trimEnd(url, '/')}/blob/${defaultBranch}/${i.path}`)
@@ -130,7 +114,7 @@ export class GithubLocationAnalyzer implements ScmLocationAnalyzer {
target,
dryRun: true,
},
{ token: serviceToken },
{ credentials: await this.auth.getOwnServiceCredentials() },
);
return addLocationResult.entities.map(e => ({
location: { type: 'url', target },
@@ -21,8 +21,8 @@ import {
import {
catalogAnalysisExtensionPoint,
catalogProcessingExtensionPoint,
catalogServiceRef,
} from '@backstage/plugin-catalog-node/alpha';
import { catalogServiceRef } from '@backstage/plugin-catalog-node';
import { eventsServiceRef } from '@backstage/plugin-events-node';
import { GithubEntityProvider } from '../providers/GithubEntityProvider';
import { GithubLocationAnalyzer } from '../analyzers/GithubLocationAnalyzer';
@@ -42,7 +42,6 @@ export const githubCatalogModule = createBackendModule({
auth: coreServices.auth,
catalogProcessing: catalogProcessingExtensionPoint,
config: coreServices.rootConfig,
discovery: coreServices.discovery,
events: eventsServiceRef,
logger: coreServices.logger,
scheduler: coreServices.scheduler,
@@ -55,13 +54,11 @@ export const githubCatalogModule = createBackendModule({
logger,
scheduler,
catalogAnalyzers,
discovery,
auth,
catalog,
}) {
catalogAnalyzers.addScmLocationAnalyzer(
new GithubLocationAnalyzer({
discovery,
config,
auth,
catalog,
-1
View File
@@ -5579,7 +5579,6 @@ __metadata:
version: 0.0.0-use.local
resolution: "@backstage/plugin-catalog-backend-module-github@workspace:plugins/catalog-backend-module-github"
dependencies:
"@backstage/backend-common": "npm:^0.25.0"
"@backstage/backend-plugin-api": "workspace:^"
"@backstage/backend-test-utils": "workspace:^"
"@backstage/catalog-client": "workspace:^"