diff --git a/.changeset/grumpy-pans-knock.md b/.changeset/grumpy-pans-knock.md new file mode 100644 index 0000000000..74e81e7bec --- /dev/null +++ b/.changeset/grumpy-pans-knock.md @@ -0,0 +1,14 @@ +--- +'@techdocs/cli': patch +'@backstage/plugin-techdocs-node': patch +--- + +fixing techdocs-cli Docker client creation + +Docker client does not need to be created when --no-docker +option is provided. + +If you had DOCKER_CERT_PATH environment variable defined +the Docker client was looking for certificates +and breaking techdocs-cli generate command even with --no-docker +option. diff --git a/packages/techdocs-cli/e2e-tests/techdocs-cli.test.ts b/packages/techdocs-cli/e2e-tests/techdocs-cli.test.ts index e19a8cea2f..15d420af2c 100644 --- a/packages/techdocs-cli/e2e-tests/techdocs-cli.test.ts +++ b/packages/techdocs-cli/e2e-tests/techdocs-cli.test.ts @@ -89,6 +89,23 @@ describe('end-to-end', () => { expect(proc.exit).toEqual(0); }); + it('can generate with DOCKER_* TLS variables and --no-docker option', async () => { + const env = { + DOCKER_HOST: 'tcp://localhost:2376', + DOCKER_TLS_CERTDIR: '/certs', + DOCKER_TLS_VERIFY: '1', + DOCKER_CERT_PATH: '/certs/client', + ...process.env, + }; + const proc = await executeCommand(entryPoint, ['generate', '--no-docker'], { + cwd, + timeout, + env, + }); + expect(proc.stdout).toContain('Successfully generated docs'); + expect(proc.exit).toEqual(0); + }); + it('can serve in mkdocs', async () => { const proc = await executeCommand( entryPoint, diff --git a/packages/techdocs-cli/src/commands/generate/generate.ts b/packages/techdocs-cli/src/commands/generate/generate.ts index 1e4ed220d9..874b904d86 100644 --- a/packages/techdocs-cli/src/commands/generate/generate.ts +++ b/packages/techdocs-cli/src/commands/generate/generate.ts @@ -22,7 +22,10 @@ import { TechdocsGenerator, ParsedLocationAnnotation, } from '@backstage/plugin-techdocs-node'; -import { DockerContainerRunner } from '@backstage/backend-common'; +import { + ContainerRunner, + DockerContainerRunner, +} from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { convertTechDocsRefToLocationAnnotation, @@ -66,8 +69,12 @@ export default async function generate(opts: OptionValues) { }); // Docker client (conditionally) used by the generators, based on techdocs.generators config. - const dockerClient = new Docker(); - const containerRunner = new DockerContainerRunner({ dockerClient }); + let containerRunner: ContainerRunner | undefined; + + if (opts.docker) { + const dockerClient = new Docker(); + containerRunner = new DockerContainerRunner({ dockerClient }); + } let parsedLocationAnnotation = {} as ParsedLocationAnnotation; if (opts.techdocsRef) { diff --git a/plugins/techdocs-node/src/stages/generate/techdocs.ts b/plugins/techdocs-node/src/stages/generate/techdocs.ts index d80449d58c..252c3b2557 100644 --- a/plugins/techdocs-node/src/stages/generate/techdocs.ts +++ b/plugins/techdocs-node/src/stages/generate/techdocs.ts @@ -55,7 +55,7 @@ export class TechdocsGenerator implements GeneratorBase { */ public static readonly defaultDockerImage = 'spotify/techdocs:v1.1.0'; private readonly logger: Logger; - private readonly containerRunner: ContainerRunner; + private readonly containerRunner?: ContainerRunner; private readonly options: GeneratorConfig; private readonly scmIntegrations: ScmIntegrationRegistry; @@ -77,7 +77,7 @@ export class TechdocsGenerator implements GeneratorBase { constructor(options: { logger: Logger; - containerRunner: ContainerRunner; + containerRunner?: ContainerRunner; config: Config; scmIntegrations: ScmIntegrationRegistry; }) { @@ -143,7 +143,7 @@ export class TechdocsGenerator implements GeneratorBase { ); break; case 'docker': - await this.containerRunner.runContainer({ + await this.containerRunner!.runContainer({ imageName: this.options.dockerImage ?? TechdocsGenerator.defaultDockerImage, args: ['build', '-d', '/output'], diff --git a/plugins/techdocs-node/src/stages/generate/types.ts b/plugins/techdocs-node/src/stages/generate/types.ts index bdbdb1095d..2b2bbb21c9 100644 --- a/plugins/techdocs-node/src/stages/generate/types.ts +++ b/plugins/techdocs-node/src/stages/generate/types.ts @@ -28,7 +28,7 @@ export type GeneratorRunInType = 'docker' | 'local'; * @public */ export type GeneratorOptions = { - containerRunner: ContainerRunner; + containerRunner?: ContainerRunner; logger: Logger; };