@backstage/plugin-techdocs-node 1.12.5-next.3 → 1.12.6

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,5 +1,37 @@
1
1
  # @backstage/plugin-techdocs-node
2
2
 
3
+ ## 1.12.6
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+ - @backstage/backend-common@0.23.1
9
+ - @backstage/backend-plugin-api@0.6.20
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
18
+
19
+ ### Patch Changes
20
+
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.
23
+ - d44a20a: Added additional plugin metadata to `package.json`.
24
+ - 5db7536: Updated `getRepoUrlFromLocationAnnotation` to check for Harness SCM integration
25
+ - Updated dependencies
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
30
+ - @backstage/catalog-model@1.5.0
31
+ - @backstage/config@1.2.0
32
+ - @backstage/errors@1.2.4
33
+ - @backstage/integration-aws-node@0.1.12
34
+
3
35
  ## 1.12.5-next.3
4
36
 
5
37
  ### Patch Changes
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);
@@ -158,7 +161,9 @@ const getRepoUrlFromLocationAnnotation = (parsedLocationAnnotation, scmIntegrati
158
161
  const { type: locationType, target } = parsedLocationAnnotation;
159
162
  if (locationType === "url") {
160
163
  const integration = scmIntegrations.byUrl(target);
161
- if (integration && ["github", "gitlab", "bitbucketServer"].includes(integration.type)) {
164
+ if (integration && ["github", "gitlab", "bitbucketServer", "harness"].includes(
165
+ integration.type
166
+ )) {
162
167
  const { filepathtype } = gitUrlParse__default.default(target);
163
168
  if (filepathtype === "") {
164
169
  return { repo_url: target };
@@ -429,6 +434,84 @@ const patchMkdocsYmlWithPlugins = async (mkdocsYmlPath, logger, defaultPlugins =
429
434
  });
430
435
  };
431
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
+
432
515
  class TechdocsGenerator {
433
516
  /**
434
517
  * The default docker image (and version) used to generate content. Public
@@ -512,13 +595,9 @@ class TechdocsGenerator {
512
595
  `Successfully generated docs from ${inputDir} into ${outputDir} using local mkdocs`
513
596
  );
514
597
  break;
515
- case "docker":
516
- if (this.containerRunner === void 0) {
517
- throw new Error(
518
- "Invalid state: containerRunner cannot be undefined when runIn is 'docker'"
519
- );
520
- }
521
- await this.containerRunner.runContainer({
598
+ case "docker": {
599
+ const containerRunner = this.containerRunner || new DockerContainerRunner();
600
+ await containerRunner.runContainer({
522
601
  imageName: this.options.dockerImage ?? TechdocsGenerator.defaultDockerImage,
523
602
  args: ["build", "-d", "/output"],
524
603
  logStream,
@@ -534,6 +613,7 @@ class TechdocsGenerator {
534
613
  `Successfully generated docs from ${inputDir} into ${outputDir} using techdocs-container`
535
614
  );
536
615
  break;
616
+ }
537
617
  default:
538
618
  throw new Error(
539
619
  `Invalid config value "${this.options.runIn}" provided in 'techdocs.generators.techdocs'.`