diff --git a/.changeset/famous-roses-smell.md b/.changeset/famous-roses-smell.md index 9ea661cfac..26cbc4b9d3 100644 --- a/.changeset/famous-roses-smell.md +++ b/.changeset/famous-roses-smell.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-techdocs-node': patch +'@backstage/plugin-techdocs-node': minor --- -`TechdocsGenerator` won't require a `containerRunner` option anymore for generating TechDocs in docker +**BREAKING**: `TechdocsGenerator` won't require a `containerRunner` option anymore for generating TechDocs in docker. diff --git a/plugins/techdocs-node/api-report.md b/plugins/techdocs-node/api-report.md index b74772a376..81bba6990f 100644 --- a/plugins/techdocs-node/api-report.md +++ b/plugins/techdocs-node/api-report.md @@ -18,11 +18,6 @@ import { UrlReader } from '@backstage/backend-common'; import * as winston from 'winston'; import { Writable } from 'stream'; -// @public -export interface ContainerRunner { - runContainer(opts: RunContainerOptions): Promise; -} - // @public export class DirectoryPreparer implements PreparerBase { static fromConfig(config: Config, options: PreparerConfig): DirectoryPreparer; @@ -52,7 +47,6 @@ export type GeneratorBuilder = { // @public export type GeneratorOptions = { - containerRunner?: ContainerRunner; logger: Logger; }; @@ -239,19 +233,6 @@ export type ReadinessResponse = { // @public export type RemoteProtocol = 'url' | 'dir'; -// @public -export type RunContainerOptions = { - imageName: string; - command?: string | string[]; - args: string[]; - logStream?: Writable; - mountDirs?: Record; - workingDir?: string; - envVars?: Record; - pullImage?: boolean; - defaultUser?: boolean; -}; - // @public export type SupportedGeneratorKey = 'techdocs' | string; @@ -280,7 +261,6 @@ export interface TechDocsDocument extends IndexableDocument { export class TechdocsGenerator implements GeneratorBase { constructor(options: { logger: Logger; - containerRunner?: ContainerRunner; config: Config; scmIntegrations: ScmIntegrationRegistry; }); diff --git a/plugins/techdocs-node/src/stages/generate/DockerContainerRunner.test.ts b/plugins/techdocs-node/src/stages/generate/DockerContainerRunner.test.ts index 066394ba86..4a9e364af3 100644 --- a/plugins/techdocs-node/src/stages/generate/DockerContainerRunner.test.ts +++ b/plugins/techdocs-node/src/stages/generate/DockerContainerRunner.test.ts @@ -18,7 +18,6 @@ import fs from 'fs-extra'; import Stream, { PassThrough } from 'stream'; import { DockerContainerRunner, UserOptions } from './DockerContainerRunner'; import { createMockDirectory } from '@backstage/backend-test-utils'; -import { ContainerRunner } from './types'; const mockPull = jest.fn(); const mockRun = jest.fn(); @@ -37,7 +36,7 @@ jest.mock( ); describe('DockerContainerRunner', () => { - let containerTaskApi: ContainerRunner; + let containerTaskApi: DockerContainerRunner; const inputDir = createMockDirectory(); const outputDir = createMockDirectory(); diff --git a/plugins/techdocs-node/src/stages/generate/DockerContainerRunner.ts b/plugins/techdocs-node/src/stages/generate/DockerContainerRunner.ts index 31cb6bcaa8..b7cb7f1c86 100644 --- a/plugins/techdocs-node/src/stages/generate/DockerContainerRunner.ts +++ b/plugins/techdocs-node/src/stages/generate/DockerContainerRunner.ts @@ -20,7 +20,7 @@ import { ForwardedError } from '@backstage/errors'; import { PassThrough } from 'stream'; import { pipeline as pipelineStream } from 'stream'; import { promisify } from 'util'; -import { ContainerRunner, RunContainerOptions } from './types'; +import { Writable } from 'stream'; const pipeline = promisify(pipelineStream); @@ -29,18 +29,26 @@ export type UserOptions = { }; /** - * A {@link ContainerRunner} for Docker containers. - * - * @public + * @internal */ -export class DockerContainerRunner implements ContainerRunner { +export class DockerContainerRunner { private readonly dockerClient: Docker; constructor() { this.dockerClient = new Docker(); } - async runContainer(options: RunContainerOptions) { + async runContainer(options: { + imageName: string; + command?: string | string[]; + args: string[]; + logStream?: Writable; + mountDirs?: Record; + workingDir?: string; + envVars?: Record; + pullImage?: boolean; + defaultUser?: boolean; + }) { const { imageName, command, diff --git a/plugins/techdocs-node/src/stages/generate/generators.test.ts b/plugins/techdocs-node/src/stages/generate/generators.test.ts index 3e0571af54..f80f070796 100644 --- a/plugins/techdocs-node/src/stages/generate/generators.test.ts +++ b/plugins/techdocs-node/src/stages/generate/generators.test.ts @@ -14,10 +14,7 @@ * limitations under the License. */ -import { - ContainerRunner, - loggerToWinstonLogger, -} from '@backstage/backend-common'; +import { loggerToWinstonLogger } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { Generators } from './generators'; import { TechdocsGenerator } from './techdocs'; @@ -34,10 +31,6 @@ const mockEntity = { }; describe('generators', () => { - const containerRunner: jest.Mocked = { - runContainer: jest.fn(), - }; - it('should return error if no generator is registered', async () => { const generators = new Generators(); @@ -50,7 +43,6 @@ describe('generators', () => { const generators = new Generators(); const techdocs = TechdocsGenerator.fromConfig(new ConfigReader({}), { logger, - containerRunner, }); generators.register('techdocs', techdocs); diff --git a/plugins/techdocs-node/src/stages/generate/index.ts b/plugins/techdocs-node/src/stages/generate/index.ts index eb0aacff88..aaf27026c2 100644 --- a/plugins/techdocs-node/src/stages/generate/index.ts +++ b/plugins/techdocs-node/src/stages/generate/index.ts @@ -17,8 +17,6 @@ export { TechdocsGenerator } from './techdocs'; export { Generators } from './generators'; export { getMkdocsYml } from './helpers'; export type { - RunContainerOptions, - ContainerRunner, GeneratorBase, GeneratorOptions, GeneratorBuilder, diff --git a/plugins/techdocs-node/src/stages/generate/techdocs.ts b/plugins/techdocs-node/src/stages/generate/techdocs.ts index 6d7e3030a3..b53e1c27d0 100644 --- a/plugins/techdocs-node/src/stages/generate/techdocs.ts +++ b/plugins/techdocs-node/src/stages/generate/techdocs.ts @@ -35,7 +35,6 @@ import { patchMkdocsYmlWithPlugins, } from './mkdocsPatchers'; import { - ContainerRunner, GeneratorBase, GeneratorConfig, GeneratorOptions, @@ -58,18 +57,17 @@ export class TechdocsGenerator implements GeneratorBase { private readonly logger: Logger; private readonly options: GeneratorConfig; private readonly scmIntegrations: ScmIntegrationRegistry; - private containerRunner?: ContainerRunner; + /** * Returns a instance of TechDocs generator * @param config - A Backstage configuration * @param options - Options to configure the generator */ static fromConfig(config: Config, options: GeneratorOptions) { - const { containerRunner, logger } = options; + const { logger } = options; const scmIntegrations = ScmIntegrations.fromConfig(config); return new TechdocsGenerator({ logger, - containerRunner, config, scmIntegrations, }); @@ -77,13 +75,11 @@ export class TechdocsGenerator implements GeneratorBase { constructor(options: { logger: Logger; - containerRunner?: ContainerRunner; config: Config; scmIntegrations: ScmIntegrationRegistry; }) { this.logger = options.logger; this.options = readGeneratorConfig(options.config, options.logger); - this.containerRunner = options.containerRunner; this.scmIntegrations = options.scmIntegrations; } @@ -155,11 +151,9 @@ export class TechdocsGenerator implements GeneratorBase { `Successfully generated docs from ${inputDir} into ${outputDir} using local mkdocs`, ); break; - case 'docker': - if (this.containerRunner === undefined) { - this.containerRunner = new DockerContainerRunner(); - } - await this.containerRunner.runContainer({ + case 'docker': { + const containerRunner = new DockerContainerRunner(); + await containerRunner.runContainer({ imageName: this.options.dockerImage ?? TechdocsGenerator.defaultDockerImage, args: ['build', '-d', '/output'], @@ -176,6 +170,7 @@ export class TechdocsGenerator implements GeneratorBase { `Successfully generated docs from ${inputDir} into ${outputDir} using techdocs-container`, ); break; + } default: throw new Error( `Invalid config value "${this.options.runIn}" provided in 'techdocs.generators.techdocs'.`, diff --git a/plugins/techdocs-node/src/stages/generate/types.ts b/plugins/techdocs-node/src/stages/generate/types.ts index bde764c713..8a54ec5188 100644 --- a/plugins/techdocs-node/src/stages/generate/types.ts +++ b/plugins/techdocs-node/src/stages/generate/types.ts @@ -27,7 +27,6 @@ export type GeneratorRunInType = 'docker' | 'local'; * @public */ export type GeneratorOptions = { - containerRunner?: ContainerRunner; logger: Logger; }; @@ -98,32 +97,3 @@ export type DefaultMkdocsContent = { docs_dir: string; plugins: String[]; }; - -/** - * Options passed to the {@link ContainerRunner.runContainer} method. - * - * @public - */ -export type RunContainerOptions = { - imageName: string; - command?: string | string[]; - args: string[]; - logStream?: Writable; - mountDirs?: Record; - workingDir?: string; - envVars?: Record; - pullImage?: boolean; - defaultUser?: boolean; -}; - -/** - * Handles the running of containers, on behalf of others. - * - * @public - */ -export interface ContainerRunner { - /** - * Runs a container image to completion. - */ - runContainer(opts: RunContainerOptions): Promise; -}