@backstage/plugin-techdocs-node 0.0.0-nightly-20240617021823 → 0.0.0-nightly-20240621021638

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,17 +1,32 @@
1
1
  # @backstage/plugin-techdocs-node
2
2
 
3
- ## 0.0.0-nightly-20240617021823
3
+ ## 0.0.0-nightly-20240621021638
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+ - @backstage/backend-common@0.0.0-nightly-20240621021638
9
+ - @backstage/backend-plugin-api@0.0.0-nightly-20240621021638
10
+ - @backstage/catalog-model@1.5.0
11
+ - @backstage/config@1.2.0
12
+ - @backstage/errors@1.2.4
13
+ - @backstage/integration@1.12.0
14
+ - @backstage/integration-aws-node@0.1.12
15
+ - @backstage/plugin-search-common@1.2.12
16
+
17
+ ## 1.12.5
4
18
 
5
19
  ### Patch Changes
6
20
 
7
21
  - e64bfb2: Allow defining custom build log transport for techdocs builder
22
+ - 48c38f0: `TechdocsGenerator` won't require a `containerRunner` option anymore for generating TechDocs in docker.
8
23
  - d44a20a: Added additional plugin metadata to `package.json`.
9
24
  - 5db7536: Updated `getRepoUrlFromLocationAnnotation` to check for Harness SCM integration
10
25
  - Updated dependencies
11
- - @backstage/backend-plugin-api@0.0.0-nightly-20240617021823
12
- - @backstage/backend-common@0.0.0-nightly-20240617021823
13
- - @backstage/integration@0.0.0-nightly-20240617021823
14
- - @backstage/plugin-search-common@0.0.0-nightly-20240617021823
26
+ - @backstage/backend-common@0.23.0
27
+ - @backstage/backend-plugin-api@0.6.19
28
+ - @backstage/integration@1.12.0
29
+ - @backstage/plugin-search-common@1.2.12
15
30
  - @backstage/catalog-model@1.5.0
16
31
  - @backstage/config@1.2.0
17
32
  - @backstage/errors@1.2.4
package/dist/index.cjs.js CHANGED
@@ -13,6 +13,8 @@ var catalogModel = require('@backstage/catalog-model');
13
13
  var mime = require('mime-types');
14
14
  var createLimiter = require('p-limit');
15
15
  var recursiveReadDir = require('recursive-readdir');
16
+ var Docker = require('dockerode');
17
+ var util = require('util');
16
18
  var integrationAwsNode = require('@backstage/integration-aws-node');
17
19
  var clientS3 = require('@aws-sdk/client-s3');
18
20
  var credentialProviders = require('@aws-sdk/credential-providers');
@@ -37,6 +39,7 @@ var yaml__default = /*#__PURE__*/_interopDefaultCompat(yaml);
37
39
  var mime__default = /*#__PURE__*/_interopDefaultCompat(mime);
38
40
  var createLimiter__default = /*#__PURE__*/_interopDefaultCompat(createLimiter);
39
41
  var recursiveReadDir__default = /*#__PURE__*/_interopDefaultCompat(recursiveReadDir);
42
+ var Docker__default = /*#__PURE__*/_interopDefaultCompat(Docker);
40
43
  var JSON5__default = /*#__PURE__*/_interopDefaultCompat(JSON5);
41
44
  var express__default = /*#__PURE__*/_interopDefaultCompat(express);
42
45
  var os__default = /*#__PURE__*/_interopDefaultCompat(os);
@@ -431,6 +434,84 @@ const patchMkdocsYmlWithPlugins = async (mkdocsYmlPath, logger, defaultPlugins =
431
434
  });
432
435
  };
433
436
 
437
+ const pipeline = util.promisify(stream.pipeline);
438
+ class DockerContainerRunner {
439
+ dockerClient;
440
+ constructor() {
441
+ this.dockerClient = new Docker__default.default();
442
+ }
443
+ async runContainer(options) {
444
+ const {
445
+ imageName,
446
+ command,
447
+ args,
448
+ logStream = new stream.PassThrough(),
449
+ mountDirs = {},
450
+ workingDir,
451
+ envVars = {},
452
+ pullImage = true,
453
+ defaultUser = false
454
+ } = options;
455
+ try {
456
+ await this.dockerClient.ping();
457
+ } catch (e) {
458
+ throw new errors.ForwardedError(
459
+ "This operation requires Docker. Docker does not appear to be available. Docker.ping() failed with",
460
+ e
461
+ );
462
+ }
463
+ if (pullImage) {
464
+ await new Promise((resolve, reject) => {
465
+ this.dockerClient.pull(imageName, {}, (err, stream) => {
466
+ if (err) {
467
+ reject(err);
468
+ return;
469
+ }
470
+ pipeline(stream, logStream, { end: false }).then(resolve).catch(reject);
471
+ });
472
+ });
473
+ }
474
+ const userOptions = {};
475
+ if (!defaultUser && process.getuid && process.getgid) {
476
+ userOptions.User = `${process.getuid()}:${process.getgid()}`;
477
+ }
478
+ const Volumes = {};
479
+ for (const containerDir of Object.values(mountDirs)) {
480
+ Volumes[containerDir] = {};
481
+ }
482
+ const Binds = [];
483
+ for (const [hostDir, containerDir] of Object.entries(mountDirs)) {
484
+ const realHostDir = await fs__default.default.realpath(hostDir);
485
+ Binds.push(`${realHostDir}:${containerDir}`);
486
+ }
487
+ const Env = [];
488
+ for (const [key, value] of Object.entries(envVars)) {
489
+ Env.push(`${key}=${value}`);
490
+ }
491
+ const [{ Error: error, StatusCode: statusCode }] = await this.dockerClient.run(imageName, args, logStream, {
492
+ Volumes,
493
+ HostConfig: {
494
+ AutoRemove: true,
495
+ Binds
496
+ },
497
+ ...workingDir ? { WorkingDir: workingDir } : {},
498
+ Entrypoint: command,
499
+ Env,
500
+ ...userOptions
501
+ });
502
+ if (error) {
503
+ throw new Error(
504
+ `Docker failed to run with the following error message: ${error}`
505
+ );
506
+ }
507
+ if (statusCode !== 0) {
508
+ throw new Error(
509
+ `Docker container returned a non-zero exit code (${statusCode})`
510
+ );
511
+ }
512
+ }
513
+ }
514
+
434
515
  class TechdocsGenerator {
435
516
  /**
436
517
  * The default docker image (and version) used to generate content. Public
@@ -514,13 +595,9 @@ class TechdocsGenerator {
514
595
  `Successfully generated docs from ${inputDir} into ${outputDir} using local mkdocs`
515
596
  );
516
597
  break;
517
- case "docker":
518
- if (this.containerRunner === void 0) {
519
- throw new Error(
520
- "Invalid state: containerRunner cannot be undefined when runIn is 'docker'"
521
- );
522
- }
523
- await this.containerRunner.runContainer({
598
+ case "docker": {
599
+ const containerRunner = this.containerRunner || new DockerContainerRunner();
600
+ await containerRunner.runContainer({
524
601
  imageName: this.options.dockerImage ?? TechdocsGenerator.defaultDockerImage,
525
602
  args: ["build", "-d", "/output"],
526
603
  logStream,
@@ -536,6 +613,7 @@ class TechdocsGenerator {
536
613
  `Successfully generated docs from ${inputDir} into ${outputDir} using techdocs-container`
537
614
  );
538
615
  break;
616
+ }
539
617
  default:
540
618
  throw new Error(
541
619
  `Invalid config value "${this.options.runIn}" provided in 'techdocs.generators.techdocs'.`