diff --git a/.changeset/kind-paws-visit.md b/.changeset/kind-paws-visit.md new file mode 100644 index 0000000000..d0b615127f --- /dev/null +++ b/.changeset/kind-paws-visit.md @@ -0,0 +1,12 @@ +--- +'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch +'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch +'@backstage/plugin-scaffolder-backend-module-github': patch +'@backstage/plugin-scaffolder-backend-module-rails': patch +'@backstage/plugin-scaffolder-node-test-utils': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-scaffolder-common': patch +'@backstage/plugin-scaffolder-node': patch +--- + +Got rid of most `@backstage/backend-common` usages diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index 95c592197a..73551ce8f3 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -45,7 +45,6 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.examples.test.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.examples.test.ts index 5cf8969b55..3a4c43c4ab 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.examples.test.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.examples.test.ts @@ -13,13 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { createConfluenceToMarkdownAction } from './confluenceToMarkdown'; -import { loggerToWinstonLogger } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; import { createMockDirectory, - mockServices, registerMswTestHooks, } from '@backstage/backend-test-utils'; import { rest } from 'msw'; @@ -58,9 +57,6 @@ describe('confluence:transform:markdown examples', () => { repoUrl: string; }>; - const logger = loggerToWinstonLogger(mockServices.logger.mock()); - jest.spyOn(logger, 'info'); - const mockDir = createMockDirectory(); const workspacePath = mockDir.resolve('workspace'); @@ -75,8 +71,8 @@ describe('confluence:transform:markdown examples', () => { mockContext = createMockActionContext({ input: yaml.parse(examples[0].example).steps[0].input, workspacePath, - logger, }); + jest.spyOn(mockContext.logger, 'info'); mockDir.setContent({ 'workspace/mkdocs.yml': 'File contents' }); }); @@ -139,10 +135,10 @@ describe('confluence:transform:markdown examples', () => { await action.handler(mockContext); - expect(logger.info).toHaveBeenCalledWith( + expect(mockContext.logger.info).toHaveBeenCalledWith( `Fetching the mkdocs.yml catalog from https://github.com/organization-name/repo-name/blob/main/mkdocs.yml`, ); - expect(logger.info).toHaveBeenCalledTimes(5); + expect(mockContext.logger.info).toHaveBeenCalledTimes(5); expect(mockDir.content({ path: 'workspace/docs' })).toEqual({ img: { 'testing.pdf': Buffer.from('hello') }, diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts index a54e5dcc63..b8dd017349 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/src/actions/confluence/confluenceToMarkdown.test.ts @@ -15,12 +15,10 @@ */ import { createConfluenceToMarkdownAction } from './confluenceToMarkdown'; -import { loggerToWinstonLogger } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; import { createMockDirectory, - mockServices, registerMswTestHooks, } from '@backstage/backend-test-utils'; import type { ActionContext } from '@backstage/plugin-scaffolder-node'; @@ -57,9 +55,6 @@ describe('confluence:transform:markdown', () => { repoUrl: string; }>; - const logger = loggerToWinstonLogger(mockServices.logger.mock()); - jest.spyOn(logger, 'info'); - const mockDir = createMockDirectory(); const workspacePath = mockDir.resolve('workspace'); @@ -80,8 +75,8 @@ describe('confluence:transform:markdown', () => { 'https://notreal.github.com/space/backstage/blob/main/mkdocs.yml', }, workspacePath, - logger, }); + jest.spyOn(mockContext.logger, 'info'); mockDir.setContent({ 'workspace/mkdocs.yml': 'File contents' }); }); @@ -144,10 +139,10 @@ describe('confluence:transform:markdown', () => { await action.handler(mockContext); - expect(logger.info).toHaveBeenCalledWith( + expect(mockContext.logger.info).toHaveBeenCalledWith( `Fetching the mkdocs.yml catalog from https://notreal.github.com/space/backstage/blob/main/mkdocs.yml`, ); - expect(logger.info).toHaveBeenCalledTimes(5); + expect(mockContext.logger.info).toHaveBeenCalledTimes(5); expect(mockDir.content({ path: 'workspace/docs' })).toEqual({ img: { 'testing.pdf': Buffer.from('hello') }, @@ -193,10 +188,10 @@ describe('confluence:transform:markdown', () => { await action.handler(mockContext); - expect(logger.info).toHaveBeenCalledWith( + expect(mockContext.logger.info).toHaveBeenCalledWith( `Fetching the mkdocs.yml catalog from https://notreal.github.com/space/backstage/blob/main/mkdocs.yml`, ); - expect(logger.info).toHaveBeenCalledTimes(5); + expect(mockContext.logger.info).toHaveBeenCalledTimes(5); expect(mockDir.content({ path: 'workspace/docs' })).toEqual({ 'mkdocs.md': 'hello world', diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index cafc58d90a..fd02ea0100 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -43,7 +43,6 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/backend-common": "^0.25.0", "@backstage/backend-defaults": "workspace:^", "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", diff --git a/plugins/scaffolder-backend-module-cookiecutter/report.api.md b/plugins/scaffolder-backend-module-cookiecutter/report.api.md index 19f43389dc..8321ac505c 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/report.api.md +++ b/plugins/scaffolder-backend-module-cookiecutter/report.api.md @@ -6,11 +6,37 @@ /// import { BackendFeature } from '@backstage/backend-plugin-api'; -import { ContainerRunner } from '@backstage/backend-common'; import { JsonObject } from '@backstage/types'; import { ScmIntegrations } from '@backstage/integration'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { UrlReaderService } from '@backstage/backend-plugin-api'; +import { Writable } from 'stream'; + +// @public +export interface ContainerRunner { + runContainer(opts: { + imageName: string; + command?: string | string[]; + args: string[]; + logStream?: Writable; + mountDirs?: Record; + workingDir?: string; + envVars?: Record; + pullImage?: boolean; + defaultUser?: boolean; + pullOptions?: { + authconfig?: { + username?: string; + password?: string; + auth?: string; + email?: string; + serveraddress?: string; + [key: string]: unknown; + }; + [key: string]: unknown; + }; + }): Promise; +} // @public const cookiecutterModule: BackendFeature; diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/ContainerRunner.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/ContainerRunner.ts new file mode 100644 index 0000000000..a0b639148f --- /dev/null +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/ContainerRunner.ts @@ -0,0 +1,50 @@ +/* + * Copyright 2022 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 { Writable } from 'stream'; + +/** + * Handles the running of containers. + * + * @public + */ +export interface ContainerRunner { + /** + * Runs a container image to completion. + */ + runContainer(opts: { + imageName: string; + command?: string | string[]; + args: string[]; + logStream?: Writable; + mountDirs?: Record; + workingDir?: string; + envVars?: Record; + pullImage?: boolean; + defaultUser?: boolean; + pullOptions?: { + authconfig?: { + username?: string; + password?: string; + auth?: string; + email?: string; + serveraddress?: string; + [key: string]: unknown; + }; + [key: string]: unknown; + }; + }): Promise; +} diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.examples.test.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.examples.test.ts index 73c17d8ac0..37615ea95b 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.examples.test.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.examples.test.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { ContainerRunner } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { JsonObject } from '@backstage/types'; import { ScmIntegrations } from '@backstage/integration'; @@ -26,6 +25,7 @@ import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test- import { examples } from './cookiecutter.examples'; import yaml from 'yaml'; import { UrlReaderService } from '@backstage/backend-plugin-api'; +import { ContainerRunner } from './ContainerRunner'; const executeShellCommand = jest.fn(); const commandExists = jest.fn(); diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts index 52946ce7fd..8428536bb5 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { ContainerRunner } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { JsonObject } from '@backstage/types'; import { ScmIntegrations } from '@backstage/integration'; @@ -25,6 +24,7 @@ import type { ActionContext } from '@backstage/plugin-scaffolder-node'; import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils'; import { Writable } from 'stream'; import { UrlReaderService } from '@backstage/backend-plugin-api'; +import { ContainerRunner } from './ContainerRunner'; const executeShellCommand = jest.fn(); const commandExists = jest.fn(); diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts index 6e540d7fca..b72e25f349 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { ContainerRunner } from '@backstage/backend-common'; import { UrlReaderService, resolveSafeChildPath, @@ -32,6 +31,7 @@ import { executeShellCommand, } from '@backstage/plugin-scaffolder-node'; import { examples } from './cookiecutter.examples'; +import { ContainerRunner } from './ContainerRunner'; export class CookiecutterRunner { private readonly containerRunner?: ContainerRunner; diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/index.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/index.ts index bbe5a16a04..2df0b789a0 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/index.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/index.ts @@ -13,4 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +export { type ContainerRunner } from './ContainerRunner'; export { createFetchCookiecutterAction } from './cookiecutter'; diff --git a/plugins/scaffolder-backend-module-github/package.json b/plugins/scaffolder-backend-module-github/package.json index c33b7d113b..bb38f2b7a8 100644 --- a/plugins/scaffolder-backend-module-github/package.json +++ b/plugins/scaffolder-backend-module-github/package.json @@ -42,7 +42,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:^", diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts index 9133b0d300..9d14747189 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { createRootLogger } from '@backstage/backend-common'; import { Config, ConfigReader } from '@backstage/config'; import { GithubCredentialsProvider, @@ -29,9 +28,6 @@ import { createPublishGithubPullRequestAction } from './githubPullRequest'; import { createMockDirectory } from '@backstage/backend-test-utils'; import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils'; -// Make sure root logger is initialized ahead of FS mock -createRootLogger(); - type GithubPullRequestActionInput = ReturnType< typeof createPublishGithubPullRequestAction > extends TemplateAction diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.examples.test.ts index 2ec4effe56..e9cc9d95de 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.examples.test.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + jest.mock('@backstage/plugin-scaffolder-node', () => { return { ...jest.requireActual('@backstage/plugin-scaffolder-node'), @@ -40,28 +41,6 @@ import { createGithubRepoPushAction } from './githubRepoPush'; import { examples } from './githubRepoPush.examples'; import yaml from 'yaml'; -const mockGit = { - init: jest.fn(), - add: jest.fn(), - checkout: jest.fn(), - commit: jest - .fn() - .mockResolvedValue('220f19cc36b551763d157f1b5e4a4b446165dbd6'), - fetch: jest.fn(), - addRemote: jest.fn(), - push: jest.fn(), -}; - -jest.mock('@backstage/backend-common', () => ({ - loggerToWinstonLogger: jest.requireActual('@backstage/backend-common') - .loggerToWinstonLogger, - Git: { - fromAuth() { - return mockGit; - }, - }, -})); - jest.mock('./helpers', () => { return { ...jest.requireActual('./helpers'), diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.test.ts index 9ff8cd123c..7fdf2e1af6 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.test.ts @@ -14,28 +14,6 @@ * limitations under the License. */ -const mockGit = { - init: jest.fn(), - add: jest.fn(), - checkout: jest.fn(), - commit: jest - .fn() - .mockResolvedValue('220f19cc36b551763d157f1b5e4a4b446165dbd6'), - fetch: jest.fn(), - addRemote: jest.fn(), - push: jest.fn(), -}; - -jest.mock('@backstage/backend-common', () => ({ - loggerToWinstonLogger: jest.requireActual('@backstage/backend-common') - .loggerToWinstonLogger, - Git: { - fromAuth() { - return mockGit; - }, - }, -})); - jest.mock('./gitHelpers', () => { return { ...jest.requireActual('./gitHelpers'), diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 3cb8447786..53a3995a9b 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -43,7 +43,6 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/errors": "workspace:^", diff --git a/plugins/scaffolder-backend-module-rails/report.api.md b/plugins/scaffolder-backend-module-rails/report.api.md index 07b3713b15..ef45922221 100644 --- a/plugins/scaffolder-backend-module-rails/report.api.md +++ b/plugins/scaffolder-backend-module-rails/report.api.md @@ -3,12 +3,40 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +/// + import { BackendFeature } from '@backstage/backend-plugin-api'; -import { ContainerRunner } from '@backstage/backend-common'; import { JsonObject } from '@backstage/types'; import { ScmIntegrations } from '@backstage/integration'; import { TemplateAction } from '@backstage/plugin-scaffolder-node'; import { UrlReaderService } from '@backstage/backend-plugin-api'; +import { Writable } from 'stream'; + +// @public +export interface ContainerRunner { + runContainer(opts: { + imageName: string; + command?: string | string[]; + args: string[]; + logStream?: Writable; + mountDirs?: Record; + workingDir?: string; + envVars?: Record; + pullImage?: boolean; + defaultUser?: boolean; + pullOptions?: { + authconfig?: { + username?: string; + password?: string; + auth?: string; + email?: string; + serveraddress?: string; + [key: string]: unknown; + }; + [key: string]: unknown; + }; + }): Promise; +} // @public export function createFetchRailsAction(options: { diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/ContainerRunner.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/ContainerRunner.ts new file mode 100644 index 0000000000..a0b639148f --- /dev/null +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/ContainerRunner.ts @@ -0,0 +1,50 @@ +/* + * Copyright 2022 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 { Writable } from 'stream'; + +/** + * Handles the running of containers. + * + * @public + */ +export interface ContainerRunner { + /** + * Runs a container image to completion. + */ + runContainer(opts: { + imageName: string; + command?: string | string[]; + args: string[]; + logStream?: Writable; + mountDirs?: Record; + workingDir?: string; + envVars?: Record; + pullImage?: boolean; + defaultUser?: boolean; + pullOptions?: { + authconfig?: { + username?: string; + password?: string; + auth?: string; + email?: string; + serveraddress?: string; + [key: string]: unknown; + }; + [key: string]: unknown; + }; + }): Promise; +} diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.examples.test.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.examples.test.ts index 6bc84e04ad..5753c2f1ce 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.examples.test.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.examples.test.ts @@ -27,7 +27,6 @@ jest.mock('./railsNewRunner', () => { }; }); -import { ContainerRunner } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; import { resolve as resolvePath } from 'path'; @@ -38,6 +37,7 @@ import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test- import { examples } from './index.examples'; import yaml from 'yaml'; import { UrlReaderService } from '@backstage/backend-plugin-api'; +import { ContainerRunner } from './ContainerRunner'; describe('fetch:rails', () => { const mockDir = createMockDirectory(); diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts index 616c90e0de..fc9443efc0 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts @@ -27,7 +27,6 @@ jest.mock('./railsNewRunner', () => { }; }); -import { ContainerRunner } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; import { resolve as resolvePath } from 'path'; @@ -37,6 +36,7 @@ import { createMockDirectory } from '@backstage/backend-test-utils'; import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils'; import { Writable } from 'stream'; import { UrlReaderService } from '@backstage/backend-plugin-api'; +import { ContainerRunner } from './ContainerRunner'; describe('fetch:rails', () => { const mockDir = createMockDirectory(); diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts index 4d5db0f3ef..0e27810db3 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { ContainerRunner } from '@backstage/backend-common'; import { JsonObject } from '@backstage/types'; import { InputError } from '@backstage/errors'; import { ScmIntegrations } from '@backstage/integration'; @@ -29,6 +28,9 @@ import { RailsNewRunner } from './railsNewRunner'; import { PassThrough } from 'stream'; import { examples } from './index.examples'; import { UrlReaderService } from '@backstage/backend-plugin-api'; +import { ContainerRunner } from './ContainerRunner'; + +export { type ContainerRunner }; /** * Creates the `fetch:rails` Scaffolder action. diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.test.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.test.ts index 47104c66e1..be5da9383e 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.test.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.test.ts @@ -27,11 +27,11 @@ jest.mock( commandExists(...args), ); -import { ContainerRunner } from '@backstage/backend-common'; import path from 'path'; import { PassThrough } from 'stream'; import { RailsNewRunner } from './railsNewRunner'; import { createMockDirectory } from '@backstage/backend-test-utils'; +import { ContainerRunner } from './ContainerRunner'; describe('Rails Templater', () => { const containerRunner: jest.Mocked = { diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts index 31cfea4a76..73dd4417ad 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { ContainerRunner } from '@backstage/backend-common'; import fs from 'fs-extra'; import path from 'path'; import { executeShellCommand } from '@backstage/plugin-scaffolder-node'; @@ -25,6 +24,7 @@ import { } from './railsArgumentResolver'; import { JsonObject } from '@backstage/types'; import { Writable } from 'stream'; +import { ContainerRunner } from './ContainerRunner'; export class RailsNewRunner { private readonly containerRunner?: ContainerRunner; diff --git a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts index abb35d86c2..db1e38c89a 100644 --- a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts +++ b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { loggerToWinstonLogger } from '@backstage/backend-common'; import { coreServices, createBackendPlugin, @@ -52,6 +51,7 @@ import { createWaitAction, } from './scaffolder'; import { createRouter } from './service/router'; +import { loggerToWinstonLogger } from './util/loggerToWinstonLogger'; /** * Scaffolder plugin diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index 2239583cb7..8614f99388 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -38,8 +38,8 @@ import { mockCredentials, mockServices, } from '@backstage/backend-test-utils'; -import { loggerToWinstonLogger } from '@backstage/backend-common'; import { LoggerService } from '@backstage/backend-plugin-api'; +import { loggerToWinstonLogger } from '../../util/loggerToWinstonLogger'; describe('NunjucksWorkflowRunner', () => { let logger: LoggerService; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 63d4172659..906f6d1857 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -38,7 +38,6 @@ import { TemplateActionRegistry } from '../actions'; import { generateExampleOutput, isTruthy } from './helper'; import { TaskTrackType, WorkflowResponse, WorkflowRunner } from './types'; -import { loggerToWinstonLogger } from '@backstage/backend-common'; import type { AuditorService, PermissionsService, @@ -60,6 +59,7 @@ import { createDefaultFilters } from '../../lib/templating/filters'; import { scaffolderActionRules } from '../../service/rules'; import { createCounterMetric, createHistogramMetric } from '../../util/metrics'; import { BackstageLoggerTransport, WinstonLogger } from './logger'; +import { loggerToWinstonLogger } from '../../util/loggerToWinstonLogger'; type NunjucksWorkflowRunnerOptions = { workingDirectory: string; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts index c617a4a84e..dc89100b95 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts @@ -14,10 +14,7 @@ * limitations under the License. */ -import { - DatabaseManager, - loggerToWinstonLogger, -} from '@backstage/backend-common'; +import { DatabaseManager } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { TaskSpec } from '@backstage/plugin-scaffolder-common'; import { @@ -27,6 +24,7 @@ import { import { DatabaseTaskStore } from './DatabaseTaskStore'; import { StorageTaskBroker, TaskManager } from './StorageTaskBroker'; import { mockServices } from '@backstage/backend-test-utils'; +import { loggerToWinstonLogger } from '../../util/loggerToWinstonLogger'; async function createStore(): Promise { const manager = DatabaseManager.fromConfig( diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts index 013d5d3296..dd9233a5ee 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts @@ -15,10 +15,7 @@ */ import os from 'os'; -import { - DatabaseManager, - loggerToWinstonLogger, -} from '@backstage/backend-common'; +import { DatabaseManager } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { DatabaseTaskStore } from './DatabaseTaskStore'; import { StorageTaskBroker } from './StorageTaskBroker'; @@ -35,6 +32,7 @@ import { WorkflowRunner } from './types'; import ObservableImpl from 'zen-observable'; import waitForExpect from 'wait-for-expect'; import { mockServices } from '@backstage/backend-test-utils'; +import { loggerToWinstonLogger } from '../../util/loggerToWinstonLogger'; jest.mock('./NunjucksWorkflowRunner'); const MockedNunjucksWorkflowRunner = diff --git a/plugins/scaffolder-backend/src/service/router.test.ts b/plugins/scaffolder-backend/src/service/router.test.ts index 42a89cc7f3..0e0da1970f 100644 --- a/plugins/scaffolder-backend/src/service/router.test.ts +++ b/plugins/scaffolder-backend/src/service/router.test.ts @@ -14,10 +14,7 @@ * limitations under the License. */ -import { - DatabaseManager, - loggerToWinstonLogger, -} from '@backstage/backend-common'; +import { DatabaseManager } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import express from 'express'; @@ -52,6 +49,7 @@ import { UrlReaders } from '@backstage/backend-defaults/urlReader'; import { catalogServiceMock } from '@backstage/plugin-catalog-node/testUtils'; import { EventsService } from '@backstage/plugin-events-node'; import { DatabaseService } from '@backstage/backend-plugin-api'; +import { loggerToWinstonLogger } from '../util/loggerToWinstonLogger'; const mockAccess = jest.fn(); diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index bd04eaad1b..ac6cfd38d0 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -14,10 +14,7 @@ * limitations under the License. */ -import { - createLegacyAuthAdapters, - HostDiscovery, -} from '@backstage/backend-common'; +import { createLegacyAuthAdapters } from '@backstage/backend-common'; import { AuditorService, AuthService, @@ -112,6 +109,7 @@ import { parseStringsParam, } from './helpers'; import { scaffolderActionRules, scaffolderTemplateRules } from './rules'; +import { HostDiscovery } from '@backstage/backend-defaults/discovery'; /** * diff --git a/plugins/scaffolder-backend/src/util/loggerToWinstonLogger.ts b/plugins/scaffolder-backend/src/util/loggerToWinstonLogger.ts new file mode 100644 index 0000000000..ff76549ec3 --- /dev/null +++ b/plugins/scaffolder-backend/src/util/loggerToWinstonLogger.ts @@ -0,0 +1,67 @@ +/* + * Copyright 2022 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 { LoggerService } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; +import { Logger as WinstonLogger, createLogger } from 'winston'; +import Transport, { TransportStreamOptions } from 'winston-transport'; + +class BackstageLoggerTransport extends Transport { + constructor( + private readonly backstageLogger: LoggerService, + opts?: TransportStreamOptions, + ) { + super(opts); + } + + log(info: unknown, callback: VoidFunction) { + if (typeof info !== 'object' || info === null) { + callback(); + return; + } + const { level, message, ...meta } = info as JsonObject; + switch (level) { + case 'error': + this.backstageLogger.error(String(message), meta); + break; + case 'warn': + this.backstageLogger.warn(String(message), meta); + break; + case 'info': + this.backstageLogger.info(String(message), meta); + break; + case 'debug': + this.backstageLogger.debug(String(message), meta); + break; + default: + this.backstageLogger.info(String(message), meta); + } + callback(); + } +} + +/** + * A helper function to convert a Backstage LoggerService to a Winston Logger. + * @internal + */ +export function loggerToWinstonLogger( + logger: LoggerService, + opts?: TransportStreamOptions, +): WinstonLogger { + return createLogger({ + transports: [new BackstageLoggerTransport(logger, opts)], + }); +} diff --git a/plugins/scaffolder-common/src/alpha.ts b/plugins/scaffolder-common/src/alpha.ts index 9a8c021d15..82585fcf1d 100644 --- a/plugins/scaffolder-common/src/alpha.ts +++ b/plugins/scaffolder-common/src/alpha.ts @@ -13,4 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + export * from './permissions'; diff --git a/plugins/scaffolder-node-test-utils/package.json b/plugins/scaffolder-node-test-utils/package.json index eafa3d78f9..c178e182dd 100644 --- a/plugins/scaffolder-node-test-utils/package.json +++ b/plugins/scaffolder-node-test-utils/package.json @@ -40,10 +40,12 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/backend-common": "^0.25.0", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/backend-test-utils": "workspace:^", "@backstage/plugin-scaffolder-node": "workspace:^", - "@backstage/types": "workspace:^" + "@backstage/types": "workspace:^", + "winston": "^3.2.1", + "winston-transport": "^4.7.0" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/plugins/scaffolder-node-test-utils/src/actions/loggerToWinstonLogger.ts b/plugins/scaffolder-node-test-utils/src/actions/loggerToWinstonLogger.ts new file mode 100644 index 0000000000..ff76549ec3 --- /dev/null +++ b/plugins/scaffolder-node-test-utils/src/actions/loggerToWinstonLogger.ts @@ -0,0 +1,67 @@ +/* + * Copyright 2022 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 { LoggerService } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; +import { Logger as WinstonLogger, createLogger } from 'winston'; +import Transport, { TransportStreamOptions } from 'winston-transport'; + +class BackstageLoggerTransport extends Transport { + constructor( + private readonly backstageLogger: LoggerService, + opts?: TransportStreamOptions, + ) { + super(opts); + } + + log(info: unknown, callback: VoidFunction) { + if (typeof info !== 'object' || info === null) { + callback(); + return; + } + const { level, message, ...meta } = info as JsonObject; + switch (level) { + case 'error': + this.backstageLogger.error(String(message), meta); + break; + case 'warn': + this.backstageLogger.warn(String(message), meta); + break; + case 'info': + this.backstageLogger.info(String(message), meta); + break; + case 'debug': + this.backstageLogger.debug(String(message), meta); + break; + default: + this.backstageLogger.info(String(message), meta); + } + callback(); + } +} + +/** + * A helper function to convert a Backstage LoggerService to a Winston Logger. + * @internal + */ +export function loggerToWinstonLogger( + logger: LoggerService, + opts?: TransportStreamOptions, +): WinstonLogger { + return createLogger({ + transports: [new BackstageLoggerTransport(logger, opts)], + }); +} diff --git a/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts b/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts index 076bb0ce22..eb03ac0a0f 100644 --- a/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts +++ b/plugins/scaffolder-node-test-utils/src/actions/mockActionContext.ts @@ -15,7 +15,6 @@ */ import { PassThrough } from 'stream'; -import { loggerToWinstonLogger } from '@backstage/backend-common'; import { createMockDirectory, mockCredentials, @@ -23,6 +22,7 @@ import { } from '@backstage/backend-test-utils'; import { JsonObject, JsonValue } from '@backstage/types'; import { ActionContext } from '@backstage/plugin-scaffolder-node'; +import { loggerToWinstonLogger } from './loggerToWinstonLogger'; /** * A utility method to create a mock action context for scaffolder actions. diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 3c8c589bde..908bc97b5f 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -54,7 +54,6 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/errors": "workspace:^", @@ -69,6 +68,7 @@ "p-limit": "^3.1.0", "tar": "^6.1.12", "winston": "^3.2.1", + "winston-transport": "^4.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" }, diff --git a/plugins/scaffolder-node/src/actions/gitHelpers.test.ts b/plugins/scaffolder-node/src/actions/gitHelpers.test.ts index 664cc5c893..2e8eb9366f 100644 --- a/plugins/scaffolder-node/src/actions/gitHelpers.test.ts +++ b/plugins/scaffolder-node/src/actions/gitHelpers.test.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { loggerToWinstonLogger } from '@backstage/backend-common'; import { Git } from '../scm'; import { commitAndPushRepo, @@ -25,6 +24,7 @@ import { cloneRepo, } from './gitHelpers'; import { mockServices } from '@backstage/backend-test-utils'; +import { loggerToWinstonLogger } from './loggerToWinstonLogger'; jest.mock('../scm', () => ({ Git: { diff --git a/plugins/scaffolder-node/src/actions/loggerToWinstonLogger.ts b/plugins/scaffolder-node/src/actions/loggerToWinstonLogger.ts new file mode 100644 index 0000000000..ff76549ec3 --- /dev/null +++ b/plugins/scaffolder-node/src/actions/loggerToWinstonLogger.ts @@ -0,0 +1,67 @@ +/* + * Copyright 2022 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 { LoggerService } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; +import { Logger as WinstonLogger, createLogger } from 'winston'; +import Transport, { TransportStreamOptions } from 'winston-transport'; + +class BackstageLoggerTransport extends Transport { + constructor( + private readonly backstageLogger: LoggerService, + opts?: TransportStreamOptions, + ) { + super(opts); + } + + log(info: unknown, callback: VoidFunction) { + if (typeof info !== 'object' || info === null) { + callback(); + return; + } + const { level, message, ...meta } = info as JsonObject; + switch (level) { + case 'error': + this.backstageLogger.error(String(message), meta); + break; + case 'warn': + this.backstageLogger.warn(String(message), meta); + break; + case 'info': + this.backstageLogger.info(String(message), meta); + break; + case 'debug': + this.backstageLogger.debug(String(message), meta); + break; + default: + this.backstageLogger.info(String(message), meta); + } + callback(); + } +} + +/** + * A helper function to convert a Backstage LoggerService to a Winston Logger. + * @internal + */ +export function loggerToWinstonLogger( + logger: LoggerService, + opts?: TransportStreamOptions, +): WinstonLogger { + return createLogger({ + transports: [new BackstageLoggerTransport(logger, opts)], + }); +} diff --git a/yarn.lock b/yarn.lock index 053f8494ec..db39b2ea2c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7407,7 +7407,6 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown@workspace:plugins/scaffolder-backend-module-confluence-to-markdown" dependencies: - "@backstage/backend-common": ^0.25.0 "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" @@ -7428,7 +7427,6 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-backend-module-cookiecutter@workspace:plugins/scaffolder-backend-module-cookiecutter" dependencies: - "@backstage/backend-common": ^0.25.0 "@backstage/backend-defaults": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" @@ -7503,7 +7501,6 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-backend-module-github@workspace:plugins/scaffolder-backend-module-github" dependencies: - "@backstage/backend-common": ^0.25.0 "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/catalog-client": "workspace:^" @@ -7566,7 +7563,6 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-backend-module-rails@workspace:plugins/scaffolder-backend-module-rails" dependencies: - "@backstage/backend-common": ^0.25.0 "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" @@ -7705,7 +7701,7 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-node-test-utils@workspace:plugins/scaffolder-node-test-utils" dependencies: - "@backstage/backend-common": ^0.25.0 + "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" @@ -7714,6 +7710,8 @@ __metadata: react: ^18.0.2 react-dom: ^18.0.2 react-router-dom: ^6.3.0 + winston: ^3.2.1 + winston-transport: ^4.7.0 peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 @@ -7729,7 +7727,6 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-scaffolder-node@workspace:plugins/scaffolder-node" dependencies: - "@backstage/backend-common": ^0.25.0 "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/catalog-model": "workspace:^" @@ -7747,6 +7744,7 @@ __metadata: p-limit: ^3.1.0 tar: ^6.1.12 winston: ^3.2.1 + winston-transport: ^4.7.0 zod: ^3.22.4 zod-to-json-schema: ^3.20.4 languageName: unknown