@secustor/backstage-plugin-renovate-backend 0.8.1 → 0.9.0

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,23 @@
1
1
  # @secustor/backstage-plugin-renovate-backend
2
2
 
3
+ ## 0.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#237](https://github.com/secustor/backstage-plugins/pull/237) [`2dca129`](https://github.com/secustor/backstage-plugins/commit/2dca129a5d53a2b2afa8ea445e37a63feaabf139) Thanks [@secustor](https://github.com/secustor)! - Support supplying URLs with missing protocol to RenovateStarter
8
+
9
+ - [#233](https://github.com/secustor/backstage-plugins/pull/233) [`de9e112`](https://github.com/secustor/backstage-plugins/commit/de9e1125ba87d7d43efb632f5643a52c87dbe0ac) Thanks [@secustor](https://github.com/secustor)! - BREAKING CHANGE! Renovate runs are now controlled by queues supplied via separate packages. Similar to `runtime` the backend comes without a default implementation.
10
+
11
+ ### Patch Changes
12
+
13
+ - [#237](https://github.com/secustor/backstage-plugins/pull/237) [`a9443be`](https://github.com/secustor/backstage-plugins/commit/a9443be50f4c2becc5bd07512f344d8bc2b2e409) Thanks [@secustor](https://github.com/secustor)! - Return correctly taskID instead of runID, when calling POST /runs
14
+
15
+ - [#235](https://github.com/secustor/backstage-plugins/pull/235) [`d7e1b7c`](https://github.com/secustor/backstage-plugins/commit/d7e1b7ca9a9903ef8b8616f7e018a4a93647a621) Thanks [@secustor](https://github.com/secustor)! - Remove deprecated imports and remove usage of @backstage/backend-common
16
+
17
+ - Updated dependencies [[`2dca129`](https://github.com/secustor/backstage-plugins/commit/2dca129a5d53a2b2afa8ea445e37a63feaabf139), [`de9e112`](https://github.com/secustor/backstage-plugins/commit/de9e1125ba87d7d43efb632f5643a52c87dbe0ac), [`d7e1b7c`](https://github.com/secustor/backstage-plugins/commit/d7e1b7ca9a9903ef8b8616f7e018a4a93647a621), [`5127503`](https://github.com/secustor/backstage-plugins/commit/51275030592f999140fce2fea25f54d0fd2ae8f8)]:
18
+ - @secustor/backstage-plugin-renovate-common@0.5.0
19
+ - @secustor/backstage-plugin-renovate-node@0.3.0
20
+
3
21
  ## 0.8.1
4
22
 
5
23
  ### Patch Changes
package/README.md CHANGED
@@ -34,9 +34,6 @@ renovate:
34
34
  # x > 0 number of reports to maintain
35
35
  minimumReports: -1
36
36
  schedules:
37
- jobSync:
38
- frequency: { minutes: 60 }
39
- timeout: { minutes: 60 }
40
37
  cleanup:
41
38
  frequency: { minutes: 60 }
42
39
  timeout: { minutes: 60 }
@@ -48,6 +45,9 @@ renovate:
48
45
  # ID of the runtime provided via extension point. This option is required as the backend comes with no runtime by default.
49
46
  type: docker
50
47
 
48
+ queue:
49
+ type: local-fastq
50
+
51
51
  config:
52
52
  # only do a lookup and create reports with updates and do not open PRs
53
53
  dryRun: lookup
package/dist/index.cjs.js CHANGED
@@ -2,17 +2,16 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var backendCommon = require('@backstage/backend-common');
5
+ var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter');
6
6
  var express = require('express');
7
7
  var backendOpenapiUtils = require('@backstage/backend-openapi-utils');
8
8
  var zod = require('zod');
9
9
  var backstagePluginRenovateCommon = require('@secustor/backstage-plugin-renovate-common');
10
- var errors = require('@backstage/errors');
11
10
  var catalogClient = require('@backstage/catalog-client');
12
- var backendPluginApi = require('@backstage/backend-plugin-api');
13
11
  var is = require('@sindresorhus/is');
12
+ var backendPluginApi = require('@backstage/backend-plugin-api');
14
13
  var integration = require('@backstage/integration');
15
- var backendTasks = require('@backstage/backend-tasks');
14
+ var errors = require('@backstage/errors');
16
15
  var nanoid = require('nanoid');
17
16
  var backstagePluginRenovateNode = require('@secustor/backstage-plugin-renovate-node');
18
17
  var catalogModel = require('@backstage/catalog-model');
@@ -313,6 +312,11 @@ const spec = {
313
312
  type: "string",
314
313
  description: "stringified Entity with SourceLocation URL annotation",
315
314
  example: "component:default/backstage-plugins-example"
315
+ },
316
+ {
317
+ type: "string",
318
+ description: "host and path",
319
+ example: "secustor/backstage-plugins"
316
320
  }
317
321
  ]
318
322
  },
@@ -350,13 +354,20 @@ const spec = {
350
354
  };
351
355
  const createOpenApiRouter = async (options) => backendOpenapiUtils.createValidatedOpenApiRouter(spec, options);
352
356
 
353
- const target = zod.z.string();
357
+ const target = zod.z.string().or(backstagePluginRenovateCommon.targetRepo);
354
358
  const runRequestBody = zod.z.object({
355
359
  target
356
360
  });
357
361
 
358
362
  async function createRouter(runner, options) {
359
- const { auth, logger, databaseHandler, discovery } = options;
363
+ const {
364
+ auth,
365
+ rootConfig: config,
366
+ logger,
367
+ databaseHandler,
368
+ discovery
369
+ } = options;
370
+ const middlewareFactory = rootHttpRouter.MiddlewareFactory.create({ logger, config });
360
371
  const client = new catalogClient.CatalogClient({ discoveryApi: discovery });
361
372
  const router = await createOpenApiRouter();
362
373
  router.use(express__default.default.json());
@@ -403,35 +414,31 @@ async function createRouter(runner, options) {
403
414
  router.post("/runs", async (request, response) => {
404
415
  const body = runRequestBody.safeParse(request.body);
405
416
  if (!body.success) {
406
- response.status(400).json({ error: body.error });
417
+ response.status(400).json({ error: body.error.toString() });
407
418
  return;
408
419
  }
409
420
  let target = body.data.target;
410
- if (backstagePluginRenovateCommon.isEntityRef(target)) {
421
+ if (is__default.default.string(target) && backstagePluginRenovateCommon.isEntityRef(target)) {
411
422
  const { token } = await auth.getPluginRequestToken({
412
423
  onBehalfOf: await auth.getOwnServiceCredentials(),
413
424
  targetPluginId: "catalog"
414
425
  });
415
- const result = await client.getEntityByRef(target, { token });
416
- if (result) {
417
- target = result;
426
+ const result2 = await client.getEntityByRef(target, { token });
427
+ if (result2) {
428
+ target = result2;
418
429
  }
419
430
  }
420
431
  const targetRepo = backstagePluginRenovateCommon.getTargetRepo(target);
421
432
  const id = backstagePluginRenovateCommon.getTaskID(targetRepo);
422
- try {
423
- await runner.trigger(targetRepo);
424
- response.status(202).json({ runID: id });
425
- } catch (e) {
426
- if (errors.isError(e) && errors.ConflictError.name === e.name) {
427
- logger.debug("Task already running", { taskID: id });
428
- response.status(423).json({ error: e });
429
- } else {
430
- response.status(400).json({ error: e });
431
- }
433
+ const result = await runner.runNext(targetRepo);
434
+ if (result.status === "already-running") {
435
+ logger.debug("Task already running", { taskID: id });
436
+ response.status(423).json({ error: "Task is already running" });
437
+ return;
432
438
  }
439
+ response.status(202).json({ taskID: id });
433
440
  });
434
- router.use(backendCommon.errorHandler());
441
+ router.use(middlewareFactory.error());
435
442
  return router;
436
443
  }
437
444
 
@@ -522,7 +529,7 @@ function getRuntimeConfigs(rootConfig) {
522
529
  function getScheduleDefinition(pluginConfig, variant) {
523
530
  try {
524
531
  const scheduleConfig = pluginConfig.getConfig(`schedules.${variant}`);
525
- return backendTasks.readTaskScheduleDefinitionFromConfig(scheduleConfig);
532
+ return backendPluginApi.readSchedulerServiceTaskScheduleDefinitionFromConfig(scheduleConfig);
526
533
  } catch (e) {
527
534
  return {
528
535
  scope: "global",
@@ -582,30 +589,80 @@ function getCacheEnvs(config, logger) {
582
589
  };
583
590
  }
584
591
 
592
+ function createQueue(queues, rootConfig, runnable) {
593
+ const type = getPluginConfig(rootConfig).getString("queue.type");
594
+ const factory = queues.get(type);
595
+ if (!factory) {
596
+ throw new Error(`Could not find Queue implementation ${type}`);
597
+ }
598
+ return factory(runnable);
599
+ }
600
+
585
601
  class RenovateRunner {
586
- scheduler;
587
- rootConfig;
588
- databaseHandler;
589
- logger;
590
- runtimes;
591
- constructor(databaseHandler, rootConfig, logger, runtimes, scheduler) {
602
+ constructor(queueFactories, databaseHandler, rootConfig, logger, runtimes) {
592
603
  this.databaseHandler = databaseHandler;
593
604
  this.rootConfig = rootConfig;
594
605
  this.logger = logger;
595
606
  this.runtimes = runtimes;
596
- this.scheduler = scheduler;
607
+ this.queue = createQueue(queueFactories, rootConfig, this);
597
608
  }
609
+ queue;
598
610
  static async from(options) {
599
- const { databaseHandler, rootConfig, runtimes, logger, scheduler } = options;
611
+ const { databaseHandler, rootConfig, runtimes, logger, queueFactories } = options;
600
612
  return new RenovateRunner(
613
+ queueFactories,
601
614
  databaseHandler,
602
615
  rootConfig,
603
616
  logger,
604
- runtimes,
605
- scheduler
617
+ runtimes
618
+ );
619
+ }
620
+ async addToQueue(...targets) {
621
+ const props = targets.map((target) => {
622
+ const jobId = backstagePluginRenovateCommon.getTaskID(target);
623
+ const targetRepo = backstagePluginRenovateCommon.getTargetRepo(target);
624
+ return {
625
+ jobId,
626
+ data: {
627
+ id: jobId,
628
+ target: targetRepo
629
+ }
630
+ };
631
+ });
632
+ return await this.queue.addBulk(props);
633
+ }
634
+ async runNext(target) {
635
+ const jobId = backstagePluginRenovateCommon.getTaskID(target);
636
+ const targetRepo = backstagePluginRenovateCommon.getTargetRepo(target);
637
+ return await this.queue.add(
638
+ jobId,
639
+ { id: jobId, target: targetRepo },
640
+ {
641
+ force: true,
642
+ insertInFront: true
643
+ }
606
644
  );
607
645
  }
608
- async renovate(runID, target, { logger }) {
646
+ async run(props) {
647
+ const { id, target } = props;
648
+ const runID = nanoid.nanoid();
649
+ const logger = this.logger.child({ runID, jobID: id, ...target });
650
+ try {
651
+ logger.info("Renovate run starting");
652
+ const report = await this.renovate(props, logger);
653
+ await this.databaseHandler.addReport({
654
+ runID,
655
+ taskID: id,
656
+ report,
657
+ target,
658
+ logger
659
+ });
660
+ logger.info("Renovate run successfully finished");
661
+ } catch (e) {
662
+ logger.error("Renovate failed", errors.isError(e) ? e : {});
663
+ }
664
+ }
665
+ async renovate({ id, target }, logger) {
609
666
  const { runtime, config: runtimeConfig } = getRuntimeConfigs(
610
667
  this.rootConfig
611
668
  );
@@ -617,7 +674,7 @@ class RenovateRunner {
617
674
  // setup logging
618
675
  LOG_FORMAT: "json",
619
676
  LOG_LEVEL: "debug",
620
- LOG_CONTEXT: runID,
677
+ LOG_CONTEXT: id,
621
678
  RENOVATE_REPORT_TYPE: "logging",
622
679
  // setup platform specifics
623
680
  ...await getPlatformEnvs(target, {
@@ -628,65 +685,19 @@ class RenovateRunner {
628
685
  };
629
686
  const renovateConfig = getRenovateConfig(this.rootConfig);
630
687
  const promise = wrapperRuntime.run({
631
- runID,
688
+ runID: id,
632
689
  env,
633
690
  renovateConfig,
634
- runtimeConfig
691
+ runtimeConfig,
692
+ logger
635
693
  });
636
- return await promise.then((result) => {
694
+ return promise.then((result) => {
637
695
  return extractReport({
638
696
  logger,
639
697
  logStream: result.stdout
640
698
  });
641
699
  });
642
700
  }
643
- async run(id, target) {
644
- const runID = nanoid.nanoid();
645
- const logger = this.logger.child({ runID, taskID: id, ...target });
646
- try {
647
- logger.info("Renovate run starting");
648
- const report = await this.renovate(id, target, { logger });
649
- await this.databaseHandler.addReport({
650
- runID,
651
- taskID: id,
652
- report,
653
- target,
654
- logger
655
- });
656
- logger.info("Renovate run successfully finished");
657
- } catch (e) {
658
- logger.error("Renovate failed", errors.isError(e) ? e : {});
659
- }
660
- }
661
- async trigger(target) {
662
- const id = backstagePluginRenovateCommon.getTaskID(target);
663
- const childLogger = this.logger.child({ taskID: id });
664
- await this.schedule(target);
665
- childLogger.debug("Triggering task");
666
- try {
667
- await this.scheduler.triggerTask(id);
668
- } catch (e) {
669
- childLogger.debug("Triggering task has failed", errors.isError(e) ? e : {});
670
- throw e;
671
- }
672
- }
673
- async schedule(target) {
674
- const id = backstagePluginRenovateCommon.getTaskID(target);
675
- const childLogger = this.logger.child({ taskID: id });
676
- const targetRepo = backstagePluginRenovateCommon.getTargetRepo(target);
677
- const schedules = await this.scheduler.getScheduledTasks();
678
- if (!schedules.some((task) => task.id === id)) {
679
- childLogger.debug("Scheduling task");
680
- await this.scheduler.scheduleTask({
681
- id,
682
- fn: () => this.run(id, targetRepo),
683
- ...getScheduleDefinition(
684
- getPluginConfig(this.rootConfig),
685
- "renovation"
686
- )
687
- });
688
- }
689
- }
690
701
  }
691
702
 
692
703
  const migrationsDir = backendPluginApi.resolvePackagePath(
@@ -768,9 +779,9 @@ async function scheduleJobSync(renovateRunner, routerOptions) {
768
779
  const { scheduler, auth, rootConfig, discovery } = routerOptions;
769
780
  const client = new catalogClient.CatalogClient({ discoveryApi: discovery });
770
781
  const pluginConfig = getPluginConfig(rootConfig);
771
- const schedule = getScheduleDefinition(pluginConfig, "jobSync");
782
+ const schedule = getScheduleDefinition(pluginConfig, "renovation");
772
783
  return scheduler.scheduleTask({
773
- id: `renovate_job_sync`,
784
+ id: `renovate_scheduled_runs`,
774
785
  ...schedule,
775
786
  fn: async () => {
776
787
  const { token } = await auth.getPluginRequestToken({
@@ -793,9 +804,7 @@ async function scheduleJobSync(renovateRunner, routerOptions) {
793
804
  },
794
805
  { token }
795
806
  );
796
- for (const entity of entities) {
797
- renovateRunner.schedule(entity);
798
- }
807
+ await renovateRunner.addToQueue(...entities);
799
808
  }
800
809
  });
801
810
  }
@@ -834,6 +843,17 @@ const renovatePlugin = backendPluginApi.createBackendPlugin({
834
843
  runtimes.set(id, runtime);
835
844
  }
836
845
  });
846
+ const queueFactories = /* @__PURE__ */ new Map();
847
+ env.registerExtensionPoint(backstagePluginRenovateNode.renovateQueueExtensionPoint, {
848
+ addQueueFactory(id, factory) {
849
+ if (queueFactories.has(id)) {
850
+ throw new Error(
851
+ ` ${id} has been already registered. Only one queue with the same ID is allowed to be registered`
852
+ );
853
+ }
854
+ queueFactories.set(id, factory);
855
+ }
856
+ });
837
857
  env.registerInit({
838
858
  deps: {
839
859
  rootConfig: backendPluginApi.coreServices.rootConfig,
@@ -849,7 +869,8 @@ const renovatePlugin = backendPluginApi.createBackendPlugin({
849
869
  const routerOptions = {
850
870
  ...options,
851
871
  databaseHandler: await DatabaseHandler.create({ database, logger }),
852
- runtimes
872
+ runtimes,
873
+ queueFactories
853
874
  };
854
875
  const renovateRunner = await RenovateRunner.from(routerOptions);
855
876
  await scheduleJobSync(renovateRunner, routerOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/schema/openapi.generated.ts","../src/service/schema.ts","../src/service/router.ts","../src/wrapper/platforms/github.ts","../src/wrapper/platforms/index.ts","../src/config/index.ts","../src/wrapper/utils.ts","../src/wrapper/index.ts","../src/service/databaseHandler.ts","../src/service/jobSync.ts","../src/service/cleanupTask.ts","../src/plugin.ts"],"sourcesContent":["//\n\n// ******************************************************************\n// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. *\n// ******************************************************************\nimport { createValidatedOpenApiRouter } from '@backstage/backend-openapi-utils';\n\nexport const spec = {\n openapi: '3.0.0',\n info: {\n title: 'renovate',\n description: 'Backstage Renovate API',\n version: '0.1.0',\n },\n servers: [\n {\n description: 'local test setup',\n url: 'http://localhost:7007',\n },\n ],\n paths: {\n '/health': {\n get: {\n summary: 'Get health status of the plugin',\n responses: {\n '200': {\n description: 'health status is green',\n content: {\n 'application/json': {\n schema: {\n type: 'string',\n example: 'ok',\n },\n },\n },\n },\n },\n },\n },\n '/reports': {\n get: {\n summary: 'Get all reports',\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/reports/{host}': {\n get: {\n summary: 'Get reports for host',\n parameters: [\n {\n name: 'host',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'github.com',\n },\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n '404': {\n description: 'unknown host',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/reports/{host}/{repository}': {\n get: {\n summary: 'Get reports for repository',\n parameters: [\n {\n name: 'host',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'github.com',\n },\n },\n {\n name: 'repository',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'myOrg/myRepository',\n },\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n '404': {\n description: 'unknown repository',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/runs': {\n post: {\n summary: 'Start or get Renovate runs',\n requestBody: {\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['target'],\n properties: {\n target: {\n $ref: '#/components/schemas/target',\n },\n },\n },\n },\n },\n },\n responses: {\n '202': {\n description: 'Run has been scheduled',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n taskID: {\n description: 'id of the scheduler task',\n type: 'string',\n example: '9-d_CO9JlaEmd-OM9QfkI',\n },\n },\n },\n },\n },\n },\n '400': {\n description: 'Unexpected incoming data',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n error: {\n $ref: '#/components/schemas/error',\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n components: {\n parameters: {\n keepLatest: {\n name: 'keepLatest',\n description: 'how many reports of all targets should be kept',\n in: 'query',\n required: false,\n example: 3,\n schema: {\n type: 'number',\n },\n },\n },\n responses: {\n 'deleted-successful': {\n description: 'Successful deleted',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n deleted: {\n type: 'number',\n example: 15,\n description: 'Numbers of reports deleted',\n },\n },\n },\n },\n },\n },\n reports: {\n description: 'Returns reports',\n content: {\n 'application/json': {\n schema: {\n type: 'array',\n items: {\n type: 'object',\n additionalProperties: false,\n required: [\n 'taskID',\n 'repository',\n 'host',\n 'timestamp',\n 'report',\n ],\n properties: {\n taskID: {\n type: 'string',\n },\n timestamp: {\n type: 'string',\n format: 'date-time',\n },\n host: {\n type: 'string',\n },\n repository: {\n type: 'string',\n },\n report: {\n $ref: '#/components/schemas/repositoryReport',\n },\n },\n },\n },\n },\n },\n },\n },\n schemas: {\n error: {\n anyOf: [\n {\n type: 'object',\n example: {\n message: \"I'm an error\",\n code: 1111,\n },\n },\n {\n type: 'string',\n example: \"I'm an error\",\n },\n ],\n },\n target: {\n anyOf: [\n {\n type: 'string',\n description: 'URL to an repository',\n example: 'https://github.com/secustor/renovate-test',\n },\n {\n type: 'string',\n description:\n 'stringified Entity with SourceLocation URL annotation',\n example: 'component:default/backstage-plugins-example',\n },\n ],\n },\n repositoryReportList: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/repositoryReport',\n },\n },\n repositoryReport: {\n description: 'report for a specific repository',\n type: 'object',\n additionalProperties: false,\n required: ['branches', 'packageFiles', 'problems'],\n properties: {\n branches: {\n type: 'array',\n items: {\n type: 'object',\n },\n },\n packageFiles: {\n type: 'object',\n },\n problems: {\n type: 'array',\n items: {\n type: 'object',\n },\n },\n },\n },\n },\n },\n} as const;\nexport const createOpenApiRouter = async (\n options?: Parameters<typeof createValidatedOpenApiRouter>['1'],\n) => createValidatedOpenApiRouter<typeof spec>(spec, options);\n","import { z } from 'zod';\n\nexport const target = z.string();\n\nexport const runRequestBody = z.object({\n target,\n});\n","import { errorHandler } from '@backstage/backend-common';\nimport express from 'express';\nimport { createOpenApiRouter } from '../schema/openapi.generated';\nimport { runRequestBody } from './schema';\nimport type { RouterOptions } from './types';\nimport {\n getTargetRepo,\n getTaskID,\n isEntityRef,\n} from '@secustor/backstage-plugin-renovate-common';\nimport { RenovateRunner } from '../wrapper';\nimport { ConflictError, isError } from '@backstage/errors';\nimport { CatalogClient } from '@backstage/catalog-client';\nimport type { Entity } from '@backstage/catalog-model';\n\nexport async function createRouter(\n runner: RenovateRunner,\n options: RouterOptions,\n): Promise<express.Router> {\n const { auth, logger, databaseHandler, discovery } = options;\n\n const client = new CatalogClient({ discoveryApi: discovery });\n\n const router = await createOpenApiRouter();\n router.use(express.json());\n\n router.get('/health', (_, response) => {\n logger.debug('healthcheck request');\n response.json('ok');\n });\n\n router.get('/reports', async (_request, response) => {\n const reports = await databaseHandler.getReports();\n response.status(200).json(reports);\n });\n\n router.delete('/reports', async (request, response) => {\n const modified = await databaseHandler.deleteReports({\n keepLatest: request.query.keepLatest,\n });\n response.status(200).json({ modified });\n });\n\n router.get('/reports/:host', async (request, response) => {\n const reports = await databaseHandler.getReports({\n ...request.params,\n });\n response.status(200).json(reports);\n });\n\n router.delete('/reports/:host', async (request, response) => {\n const modified = await databaseHandler.deleteReportsByTarget(\n request.params,\n { keepLatest: request.query.keepLatest },\n );\n response.status(200).json({ modified });\n });\n\n router.get('/reports/:host/:repository', async (request, response) => {\n const reports = await databaseHandler.getReports({\n ...request.params,\n });\n response.status(200).json(reports);\n });\n\n router.delete('/reports/:host/:repository', async (request, response) => {\n const modified = await databaseHandler.deleteReportsByTarget(\n request.params,\n { keepLatest: request.query.keepLatest },\n );\n response.status(200).json({ modified });\n });\n\n router.post('/runs', async (request, response) => {\n const body = runRequestBody.safeParse(request.body);\n if (!body.success) {\n response.status(400).json({ error: body.error });\n return;\n }\n let target: string | Entity = body.data.target;\n\n // check if we got an entity ref and if yes get the entity\n if (isEntityRef(target)) {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n const result = await client.getEntityByRef(target, { token });\n if (result) {\n target = result;\n }\n }\n\n // trigger Renovate run\n const targetRepo = getTargetRepo(target);\n const id = getTaskID(targetRepo);\n try {\n await runner.trigger(targetRepo);\n response.status(202).json({ runID: id });\n } catch (e) {\n if (isError(e) && ConflictError.name === e.name) {\n logger.debug('Task already running', { taskID: id });\n response.status(423).json({ error: e });\n } else {\n response.status(400).json({ error: e });\n }\n }\n });\n router.use(errorHandler());\n return router;\n}\n","import {\n DefaultGithubCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\n\nexport async function getGithubToken(\n integrations: ScmIntegrations,\n url: string,\n): Promise<string | undefined> {\n const cred = await DefaultGithubCredentialsProvider.fromIntegrations(\n integrations,\n ).getCredentials({ url });\n return cred.token;\n}\n","import {\n DefaultGitlabCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\nimport is from '@sindresorhus/is';\nimport { PlatformEnvsOptions } from './types';\nimport { TargetRepo } from '@secustor/backstage-plugin-renovate-common';\nimport { getGithubToken } from './github';\n\n/*\n Returns record of Renovate environment variables specific for the platform of targetUrl\n */\nexport async function getPlatformEnvs(\n target: TargetRepo,\n context: PlatformEnvsOptions,\n): Promise<Record<string, string>> {\n const { rootConfig, logger } = context;\n\n const env: Record<string, string> = {};\n // add Renovate platform and tokens\n const integrations = ScmIntegrations.fromConfig(rootConfig);\n const integration = integrations.byHost(target.host);\n if (is.nullOrUndefined(integration)) {\n throw new Error(\n `Could not identify platform for target ${target.host}/${target.repository}`,\n );\n }\n\n const errMsg = `No credentials could be found for url and '${integration.type}' type for host ${target.host}`;\n const url = `https://${target.host}/${target.repository}`;\n switch (integration.type) {\n case 'github': {\n env.RENOVATE_PLATFORM = integration.type;\n const token = await getGithubToken(integrations, url);\n env.RENOVATE_TOKEN = requireConfigVariable(token, errMsg);\n env.RENOVATE_REPOSITORIES = target.repository;\n break;\n }\n case 'gitlab':\n {\n const cred = await DefaultGitlabCredentialsProvider.fromIntegrations(\n integrations,\n ).getCredentials({ url });\n const gitLabIntegrationConfig = requireConfigVariable(\n integrations.gitlab.byHost(target.host)?.config,\n errMsg,\n );\n env.RENOVATE_PLATFORM = integration.type;\n env.RENOVATE_ENDPOINT =\n gitLabIntegrationConfig.apiBaseUrl ?? `https://${target.host}/api/v4`;\n env.RENOVATE_TOKEN = requireConfigVariable(cred.token, errMsg);\n env.RENOVATE_REPOSITORIES = target.repository;\n }\n break;\n default:\n throw new Error(`Unsupported platform type ${integration.type}`);\n }\n\n const githubComURL = 'https://github.com';\n const githubComIntegration = integrations.github.byUrl(githubComURL);\n if (is.nullOrUndefined(githubComIntegration)) {\n logger.warn(`No Github.com integration has been found`);\n } else {\n const githubComToken = await getGithubToken(integrations, githubComURL);\n if (githubComToken) {\n env.RENOVATE_GITHUB_COM = githubComToken;\n } else {\n logger.warn(\n `Could not get token for Github.com token in the defined integrations`,\n );\n }\n }\n\n return env;\n}\n\nfunction requireConfigVariable<T>(\n input: T | undefined | null,\n errMessage: string,\n): T {\n if (is.nullOrUndefined(input)) {\n throw new Error(errMessage);\n }\n return input;\n}\n","import { Config } from '@backstage/config';\nimport {\n readTaskScheduleDefinitionFromConfig,\n TaskScheduleDefinition,\n} from '@backstage/backend-tasks';\nimport { JsonValue } from '@backstage/types';\n\nexport const RENOVATE_ANNOTATION_KEEP_UPDATED =\n 'renovate.secustor.dev/keep-updated';\n\nexport function getPluginConfig(rootConfig: Config): Config {\n return rootConfig.getConfig('renovate');\n}\n\nexport function getRenovateConfig(rootConfig: Config): JsonValue {\n const value = getPluginConfig(rootConfig).getOptional('config');\n return value ?? null;\n}\n\nexport function getRuntimeConfigs(rootConfig: Config): {\n runtime: string;\n config: Config | null;\n} {\n const runtimeConfig = getPluginConfig(rootConfig).getConfig('runtime');\n const runtime = runtimeConfig.getString('type');\n return {\n runtime,\n config: runtimeConfig.getConfig(runtime),\n };\n}\n\nexport function getScheduleDefinition(\n pluginConfig: Config,\n variant: 'jobSync' | 'renovation' | 'cleanup',\n): TaskScheduleDefinition {\n try {\n const scheduleConfig = pluginConfig.getConfig(`schedules.${variant}`);\n return readTaskScheduleDefinitionFromConfig(scheduleConfig);\n } catch (e) {\n return {\n scope: 'global',\n timeout: { minutes: 60 },\n frequency: { minutes: 60 },\n };\n }\n}\n","import { RenovateReport } from '@secustor/backstage-plugin-renovate-common';\nimport { ExtractReportOptions } from './types';\nimport { Config } from '@backstage/config';\nimport is from '@sindresorhus/is';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { getPluginConfig } from '../config';\n\nexport async function extractReport(\n opts: ExtractReportOptions,\n): Promise<RenovateReport> {\n const { logStream, logger } = opts;\n return new Promise(resolve => {\n let uncompletedText = '';\n logStream.on('data', (chunk: Buffer) => {\n const text = uncompletedText.concat(chunk.toString());\n const logLines = text.split('\\n');\n\n // if the last element is an empty string, then we have a complete json line so we reset it.\n // else we save it to\n uncompletedText = logLines.pop() ?? '';\n\n for (const logLine of logLines) {\n const log = JSON.parse(logLine);\n if (log.report) {\n // TODO use schema and reject if report does not fit expectation\n const report = log.report as RenovateReport;\n // do not forward the report to logging\n resolve(report);\n }\n const msg = log.msg;\n delete log.msg;\n // delete logContext as it is the same as runID\n delete log.logContext;\n logger.debug(msg, log);\n }\n });\n });\n}\n\nexport function getCacheEnvs(\n config: Config,\n logger: LoggerService,\n): Record<string, string> {\n const cacheEnabled =\n getPluginConfig(config).getOptionalBoolean('cache.enabled') ?? true;\n if (!cacheEnabled) {\n logger.debug('Cache has been disabled in plugin configuration');\n return {};\n }\n\n const cacheConfig = config.getOptionalConfig('backend.cache');\n if (is.nullOrUndefined(cacheConfig)) {\n logger.debug('No cache configured');\n return {};\n }\n\n const store = cacheConfig.getString('store');\n if (store !== 'redis') {\n logger.debug(`Unsupported cache store '${store}' detected`);\n return {};\n }\n\n const connection = cacheConfig.getOptionalString('connection');\n if (is.nullOrUndefined(connection)) {\n logger.debug('No connection string for redis cache configured in backend');\n return {};\n }\n\n logger.debug('Injecting Redis cache into Renovate');\n return {\n RENOVATE_REDIS_PREFIX: 'renovate_',\n RENOVATE_REDIS_URL: connection,\n };\n}\n","/***/\n/**\n * Node.js library for the renovate-wrapper plugin.\n *\n * @packageDocumentation\n */\n\nimport is from '@sindresorhus/is';\nimport { getPlatformEnvs } from './platforms';\nimport { RouterOptions } from '../service/types';\nimport { extractReport, getCacheEnvs } from './utils';\nimport {\n getTargetRepo,\n getTaskID,\n RenovateReport,\n RenovateWrapper,\n TargetRepo,\n} from '@secustor/backstage-plugin-renovate-common';\nimport { Config } from '@backstage/config';\nimport { LoggerService, SchedulerService } from '@backstage/backend-plugin-api';\nimport {\n getPluginConfig,\n getRenovateConfig,\n getRuntimeConfigs,\n getScheduleDefinition,\n} from '../config';\nimport { DatabaseHandler } from '../service/databaseHandler';\nimport { RunOptions } from './types';\nimport { isError } from '@backstage/errors';\nimport { Entity } from '@backstage/catalog-model';\nimport { nanoid } from 'nanoid';\n\nexport class RenovateRunner {\n private scheduler: SchedulerService;\n private readonly rootConfig: Config;\n private databaseHandler: DatabaseHandler;\n private logger: LoggerService;\n private runtimes: Map<string, RenovateWrapper>;\n\n constructor(\n databaseHandler: DatabaseHandler,\n rootConfig: Config,\n logger: LoggerService,\n runtimes: Map<string, RenovateWrapper>,\n scheduler: SchedulerService,\n ) {\n this.databaseHandler = databaseHandler;\n this.rootConfig = rootConfig;\n this.logger = logger;\n this.runtimes = runtimes;\n this.scheduler = scheduler;\n }\n\n static async from(options: RouterOptions): Promise<RenovateRunner> {\n const { databaseHandler, rootConfig, runtimes, logger, scheduler } =\n options;\n\n return new RenovateRunner(\n databaseHandler,\n rootConfig,\n logger,\n runtimes,\n scheduler,\n );\n }\n\n private async renovate(\n runID: string,\n target: TargetRepo,\n { logger }: RunOptions,\n ): Promise<RenovateReport> {\n const { runtime, config: runtimeConfig } = getRuntimeConfigs(\n this.rootConfig,\n );\n const wrapperRuntime = this.runtimes.get(runtime);\n if (is.nullOrUndefined(wrapperRuntime)) {\n throw new Error(`Unknown runtime type '${runtime}'`);\n }\n\n const env: Record<string, string> = {\n // setup logging\n LOG_FORMAT: 'json',\n LOG_LEVEL: 'debug',\n LOG_CONTEXT: runID,\n RENOVATE_REPORT_TYPE: 'logging',\n // setup platform specifics\n ...(await getPlatformEnvs(target, {\n logger,\n rootConfig: this.rootConfig,\n })),\n ...getCacheEnvs(this.rootConfig, logger),\n };\n\n // read out renovate.config and write out to json file for consumption by Renovate\n // we are reading it at this place to allow dynamic configuration changes\n const renovateConfig = getRenovateConfig(this.rootConfig);\n\n const promise = wrapperRuntime.run({\n runID,\n env,\n renovateConfig,\n runtimeConfig,\n });\n\n return await promise.then(result => {\n return extractReport({\n logger,\n logStream: result.stdout,\n });\n });\n }\n\n async run(id: string, target: TargetRepo): Promise<void> {\n const runID = nanoid();\n const logger = this.logger.child({ runID, taskID: id, ...target });\n try {\n logger.info('Renovate run starting');\n const report = await this.renovate(id, target, { logger });\n await this.databaseHandler.addReport({\n runID,\n taskID: id,\n report,\n target,\n logger,\n });\n logger.info('Renovate run successfully finished');\n } catch (e) {\n logger.error('Renovate failed', isError(e) ? e : {});\n }\n }\n\n async trigger(target: string | Entity | TargetRepo): Promise<void> {\n const id = getTaskID(target);\n const childLogger = this.logger.child({ taskID: id });\n\n // ensure there is runner scheduled\n await this.schedule(target);\n\n childLogger.debug('Triggering task');\n try {\n await this.scheduler.triggerTask(id);\n } catch (e) {\n childLogger.debug('Triggering task has failed', isError(e) ? e : {});\n throw e;\n }\n }\n\n async schedule(target: string | Entity | TargetRepo): Promise<void> {\n const id = getTaskID(target);\n const childLogger = this.logger.child({ taskID: id });\n const targetRepo = getTargetRepo(target);\n\n // if the task is not locally scheduled do so, else only trigger it\n const schedules = await this.scheduler.getScheduledTasks();\n if (!schedules.some(task => task.id === id)) {\n childLogger.debug('Scheduling task');\n await this.scheduler.scheduleTask({\n id,\n fn: () => this.run(id, targetRepo),\n ...getScheduleDefinition(\n getPluginConfig(this.rootConfig),\n 'renovation',\n ),\n });\n }\n }\n}\n","import { resolvePackagePath } from '@backstage/backend-plugin-api';\nimport { Knex } from 'knex';\nimport type {\n AddReportParameters,\n DatabaseCreationParameters,\n DeleteOptions,\n ReportQueryParameters,\n ReportsRow,\n ReportTargetQuery,\n} from './types';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport is from '@sindresorhus/is';\nimport { RepositoryReportResponse } from '@secustor/backstage-plugin-renovate-common';\n\nconst migrationsDir = resolvePackagePath(\n '@secustor/backstage-plugin-renovate-backend',\n 'migrations',\n);\n\nexport class DatabaseHandler {\n static async create(\n options: DatabaseCreationParameters,\n ): Promise<DatabaseHandler> {\n const { database, logger } = options;\n const client = await database.getClient();\n\n if (!database.migrations?.skip) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new DatabaseHandler(client, logger);\n }\n\n private constructor(\n private client: Knex,\n private logger: LoggerService,\n ) {}\n\n async addReport(options: AddReportParameters): Promise<void> {\n const { runID, taskID, report, target } = options;\n const logger = options.logger ?? this.logger;\n\n const inserts: ReportsRow[] = [];\n for (const [repository, value] of Object.entries(report.repositories)) {\n inserts.push({\n run_id: runID,\n task_id: taskID,\n timestamp: new Date(),\n host: target.host,\n repository,\n report: value,\n });\n }\n // this.client.batchInsert<ReportsRow>('reports', inserts);\n await this.client('reports')\n .insert(inserts)\n .catch(reason => logger.error('Failed insert data', reason));\n }\n\n async getReports(\n query?: ReportQueryParameters,\n ): Promise<RepositoryReportResponse> {\n const builder = this.client.select<ReportsRow[]>();\n if (query) {\n builder.where(query);\n }\n const rows = await builder.from<ReportsRow[]>('reports');\n return rows.map(row => {\n return {\n runID: row.run_id,\n taskID: row.task_id,\n timestamp: row.timestamp.toISOString(),\n host: row.host,\n repository: row.repository,\n // if the JSON field has not been auto-parsed do it manually\n report: is.string(row.report) ? JSON.parse(row.report) : row.report,\n };\n });\n }\n\n async getTargets(): Promise<ReportTargetQuery[]> {\n return this.client\n .select()\n .distinct<ReportsRow[]>('host', 'repository')\n .from('reports');\n }\n\n async deleteReportsByTarget(\n { host, repository }: ReportTargetQuery,\n options?: DeleteOptions,\n ): Promise<number> {\n let offset = 0;\n if (\n is.nullOrUndefined(options?.keepLatest) ||\n is.boolean(options?.keepLatest)\n ) {\n offset = options?.keepLatest ? 1 : 0;\n } else {\n offset = options.keepLatest;\n }\n const toBeDeletedIDs = this.client('reports')\n .select('run_id')\n .where('host', host)\n .andWhere('repository', repository)\n .orderBy('timestamp', 'DESC')\n .offset(offset);\n\n return this.client('reports').delete().whereIn('run_id', [toBeDeletedIDs]);\n }\n\n async deleteReports(options?: DeleteOptions): Promise<number> {\n const targets = await this.getTargets();\n const modified = await Promise.all(\n targets.map(target => this.deleteReportsByTarget(target, options)),\n );\n // sum up\n return modified.reduce((a, b) => a + b, 0);\n }\n}\n","import {\n CATALOG_FILTER_EXISTS,\n CatalogClient,\n} from '@backstage/catalog-client';\nimport { ANNOTATION_SOURCE_LOCATION } from '@backstage/catalog-model';\nimport { RouterOptions } from './types';\nimport {\n getPluginConfig,\n getScheduleDefinition,\n RENOVATE_ANNOTATION_KEEP_UPDATED,\n} from '../config';\nimport { RenovateRunner } from '../wrapper';\n\nexport async function scheduleJobSync(\n renovateRunner: RenovateRunner,\n routerOptions: RouterOptions,\n): Promise<void> {\n const { scheduler, auth, rootConfig, discovery } = routerOptions;\n\n const client = new CatalogClient({ discoveryApi: discovery });\n\n const pluginConfig = getPluginConfig(rootConfig);\n const schedule = getScheduleDefinition(pluginConfig, 'jobSync');\n\n return scheduler.scheduleTask({\n id: `renovate_job_sync`,\n ...schedule,\n\n fn: async () => {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n const { items: entities } = await client.getEntities(\n {\n filter: {\n [`metadata.annotations.${RENOVATE_ANNOTATION_KEEP_UPDATED}`]:\n CATALOG_FILTER_EXISTS,\n [`metadata.annotations.${ANNOTATION_SOURCE_LOCATION}`]:\n CATALOG_FILTER_EXISTS,\n },\n fields: [\n 'kind',\n 'metadata.annotations',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n },\n { token },\n );\n\n for (const entity of entities) {\n renovateRunner.schedule(entity);\n }\n },\n });\n}\n","import { RouterOptions } from './types';\nimport { getPluginConfig, getScheduleDefinition } from '../config';\n\nexport async function scheduleCleanupTask(routerOptions: RouterOptions) {\n const { scheduler, rootConfig, databaseHandler, logger } = routerOptions;\n const pluginConfig = getPluginConfig(rootConfig);\n const schedule = getScheduleDefinition(pluginConfig, 'cleanup');\n const reportsToKeep =\n pluginConfig.getOptionalNumber('cleanup.minimumReports') ?? -1;\n\n return scheduler.scheduleTask({\n id: `renovate_report_cleanup`,\n ...schedule,\n fn: async () => {\n if (reportsToKeep >= 0) {\n logger.debug('Running report cleanup');\n const modified = await databaseHandler.deleteReports({\n keepLatest: reportsToKeep,\n });\n logger.debug(`Report cleanup completed. ${modified} reports deleted`);\n }\n },\n });\n}\n","import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { RenovateWrapper } from '@secustor/backstage-plugin-renovate-common';\nimport { RenovateRunner } from './wrapper';\nimport { RouterOptions } from './service/types';\nimport { DatabaseHandler } from './service/databaseHandler';\nimport { renovateRuntimeExtensionPoint } from '@secustor/backstage-plugin-renovate-node';\nimport { scheduleJobSync } from './service/jobSync';\nimport { scheduleCleanupTask } from './service/cleanupTask';\n\n/**\n * Renovate backend plugin\n *\n * @public\n */\nexport const renovatePlugin = createBackendPlugin({\n pluginId: 'renovate',\n register(env) {\n // allow modules provide additional runtimes\n const runtimes = new Map<string, RenovateWrapper>();\n env.registerExtensionPoint(renovateRuntimeExtensionPoint, {\n addRuntime(id: string, runtime: RenovateWrapper) {\n if (runtimes.has(id)) {\n throw new Error(\n ` ${id} has been already registered. Only one wrapper with the same ID is allowed to be registered`,\n );\n }\n runtimes.set(id, runtime);\n },\n });\n\n env.registerInit({\n deps: {\n rootConfig: coreServices.rootConfig,\n logger: coreServices.logger,\n httpRouter: coreServices.httpRouter,\n database: coreServices.database,\n scheduler: coreServices.scheduler,\n discovery: coreServices.discovery,\n auth: coreServices.auth,\n },\n async init(options) {\n const { database, httpRouter, logger } = options;\n\n const routerOptions: RouterOptions = {\n ...options,\n databaseHandler: await DatabaseHandler.create({ database, logger }),\n runtimes,\n };\n const renovateRunner = await RenovateRunner.from(routerOptions);\n\n await scheduleJobSync(renovateRunner, routerOptions);\n await scheduleCleanupTask(routerOptions);\n\n httpRouter.use(await createRouter(renovateRunner, routerOptions));\n httpRouter.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createValidatedOpenApiRouter","z","CatalogClient","express","isEntityRef","getTargetRepo","getTaskID","isError","ConflictError","errorHandler","DefaultGithubCredentialsProvider","ScmIntegrations","integration","is","DefaultGitlabCredentialsProvider","readTaskScheduleDefinitionFromConfig","nanoid","resolvePackagePath","CATALOG_FILTER_EXISTS","ANNOTATION_SOURCE_LOCATION","createBackendPlugin","renovateRuntimeExtensionPoint","coreServices"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/schema/openapi.generated.ts","../src/service/schema.ts","../src/service/router.ts","../src/wrapper/platforms/github.ts","../src/wrapper/platforms/index.ts","../src/config/index.ts","../src/wrapper/utils.ts","../src/queue/factory.ts","../src/wrapper/renovateRunner.ts","../src/service/databaseHandler.ts","../src/service/jobSync.ts","../src/service/cleanupTask.ts","../src/plugin.ts"],"sourcesContent":["//\n\n// ******************************************************************\n// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. *\n// ******************************************************************\nimport { createValidatedOpenApiRouter } from '@backstage/backend-openapi-utils';\n\nexport const spec = {\n openapi: '3.0.0',\n info: {\n title: 'renovate',\n description: 'Backstage Renovate API',\n version: '0.1.0',\n },\n servers: [\n {\n description: 'local test setup',\n url: 'http://localhost:7007',\n },\n ],\n paths: {\n '/health': {\n get: {\n summary: 'Get health status of the plugin',\n responses: {\n '200': {\n description: 'health status is green',\n content: {\n 'application/json': {\n schema: {\n type: 'string',\n example: 'ok',\n },\n },\n },\n },\n },\n },\n },\n '/reports': {\n get: {\n summary: 'Get all reports',\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/reports/{host}': {\n get: {\n summary: 'Get reports for host',\n parameters: [\n {\n name: 'host',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'github.com',\n },\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n '404': {\n description: 'unknown host',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/reports/{host}/{repository}': {\n get: {\n summary: 'Get reports for repository',\n parameters: [\n {\n name: 'host',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'github.com',\n },\n },\n {\n name: 'repository',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'myOrg/myRepository',\n },\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n '404': {\n description: 'unknown repository',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/runs': {\n post: {\n summary: 'Start or get Renovate runs',\n requestBody: {\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['target'],\n properties: {\n target: {\n $ref: '#/components/schemas/target',\n },\n },\n },\n },\n },\n },\n responses: {\n '202': {\n description: 'Run has been scheduled',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n taskID: {\n description: 'id of the scheduler task',\n type: 'string',\n example: '9-d_CO9JlaEmd-OM9QfkI',\n },\n },\n },\n },\n },\n },\n '400': {\n description: 'Unexpected incoming data',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n error: {\n $ref: '#/components/schemas/error',\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n components: {\n parameters: {\n keepLatest: {\n name: 'keepLatest',\n description: 'how many reports of all targets should be kept',\n in: 'query',\n required: false,\n example: 3,\n schema: {\n type: 'number',\n },\n },\n },\n responses: {\n 'deleted-successful': {\n description: 'Successful deleted',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n deleted: {\n type: 'number',\n example: 15,\n description: 'Numbers of reports deleted',\n },\n },\n },\n },\n },\n },\n reports: {\n description: 'Returns reports',\n content: {\n 'application/json': {\n schema: {\n type: 'array',\n items: {\n type: 'object',\n additionalProperties: false,\n required: [\n 'taskID',\n 'repository',\n 'host',\n 'timestamp',\n 'report',\n ],\n properties: {\n taskID: {\n type: 'string',\n },\n timestamp: {\n type: 'string',\n format: 'date-time',\n },\n host: {\n type: 'string',\n },\n repository: {\n type: 'string',\n },\n report: {\n $ref: '#/components/schemas/repositoryReport',\n },\n },\n },\n },\n },\n },\n },\n },\n schemas: {\n error: {\n anyOf: [\n {\n type: 'object',\n example: {\n message: \"I'm an error\",\n code: 1111,\n },\n },\n {\n type: 'string',\n example: \"I'm an error\",\n },\n ],\n },\n target: {\n anyOf: [\n {\n type: 'string',\n description: 'URL to an repository',\n example: 'https://github.com/secustor/renovate-test',\n },\n {\n type: 'string',\n description:\n 'stringified Entity with SourceLocation URL annotation',\n example: 'component:default/backstage-plugins-example',\n },\n {\n type: 'string',\n description: 'host and path',\n example: 'secustor/backstage-plugins',\n },\n ],\n },\n repositoryReportList: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/repositoryReport',\n },\n },\n repositoryReport: {\n description: 'report for a specific repository',\n type: 'object',\n additionalProperties: false,\n required: ['branches', 'packageFiles', 'problems'],\n properties: {\n branches: {\n type: 'array',\n items: {\n type: 'object',\n },\n },\n packageFiles: {\n type: 'object',\n },\n problems: {\n type: 'array',\n items: {\n type: 'object',\n },\n },\n },\n },\n },\n },\n} as const;\nexport const createOpenApiRouter = async (\n options?: Parameters<typeof createValidatedOpenApiRouter>['1'],\n) => createValidatedOpenApiRouter<typeof spec>(spec, options);\n","import { z } from 'zod';\nimport { targetRepo } from '@secustor/backstage-plugin-renovate-common';\n\nexport const target = z.string().or(targetRepo);\n\nexport const runRequestBody = z.object({\n target,\n});\n","import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport express from 'express';\nimport { createOpenApiRouter } from '../schema/openapi.generated';\nimport { runRequestBody } from './schema';\nimport type { RouterOptions } from './types';\nimport {\n getTargetRepo,\n getTaskID,\n isEntityRef,\n TargetRepo,\n} from '@secustor/backstage-plugin-renovate-common';\nimport { RenovateRunner } from '../wrapper';\nimport { CatalogClient } from '@backstage/catalog-client';\nimport type { Entity } from '@backstage/catalog-model';\nimport is from '@sindresorhus/is';\n\nexport async function createRouter(\n runner: RenovateRunner,\n options: RouterOptions,\n): Promise<express.Router> {\n const {\n auth,\n rootConfig: config,\n logger,\n databaseHandler,\n discovery,\n } = options;\n\n const middlewareFactory = MiddlewareFactory.create({ logger, config });\n\n const client = new CatalogClient({ discoveryApi: discovery });\n\n const router = await createOpenApiRouter();\n router.use(express.json());\n\n router.get('/health', (_, response) => {\n logger.debug('healthcheck request');\n response.json('ok');\n });\n\n router.get('/reports', async (_request, response) => {\n const reports = await databaseHandler.getReports();\n response.status(200).json(reports);\n });\n\n router.delete('/reports', async (request, response) => {\n const modified = await databaseHandler.deleteReports({\n keepLatest: request.query.keepLatest,\n });\n response.status(200).json({ modified });\n });\n\n router.get('/reports/:host', async (request, response) => {\n const reports = await databaseHandler.getReports({\n ...request.params,\n });\n response.status(200).json(reports);\n });\n\n router.delete('/reports/:host', async (request, response) => {\n const modified = await databaseHandler.deleteReportsByTarget(\n request.params,\n { keepLatest: request.query.keepLatest },\n );\n response.status(200).json({ modified });\n });\n\n router.get('/reports/:host/:repository', async (request, response) => {\n const reports = await databaseHandler.getReports({\n ...request.params,\n });\n response.status(200).json(reports);\n });\n\n router.delete('/reports/:host/:repository', async (request, response) => {\n const modified = await databaseHandler.deleteReportsByTarget(\n request.params,\n { keepLatest: request.query.keepLatest },\n );\n response.status(200).json({ modified });\n });\n\n router.post('/runs', async (request, response) => {\n const body = runRequestBody.safeParse(request.body);\n if (!body.success) {\n response.status(400).json({ error: body.error.toString() });\n return;\n }\n let target: string | TargetRepo | Entity = body.data.target;\n\n // check if we got an entity ref and if yes get the entity\n if (is.string(target) && isEntityRef(target)) {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n const result = await client.getEntityByRef(target, { token });\n if (result) {\n target = result;\n }\n }\n\n // trigger Renovate run\n const targetRepo = getTargetRepo(target);\n const id = getTaskID(targetRepo);\n const result = await runner.runNext(targetRepo);\n if (result.status === 'already-running') {\n logger.debug('Task already running', { taskID: id });\n response.status(423).json({ error: 'Task is already running' });\n return;\n }\n response.status(202).json({ taskID: id });\n });\n router.use(middlewareFactory.error());\n return router;\n}\n","import {\n DefaultGithubCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\n\nexport async function getGithubToken(\n integrations: ScmIntegrations,\n url: string,\n): Promise<string | undefined> {\n const cred = await DefaultGithubCredentialsProvider.fromIntegrations(\n integrations,\n ).getCredentials({ url });\n return cred.token;\n}\n","import {\n DefaultGitlabCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\nimport is from '@sindresorhus/is';\nimport { PlatformEnvsOptions } from './types';\nimport { TargetRepo } from '@secustor/backstage-plugin-renovate-common';\nimport { getGithubToken } from './github';\n\n/*\n Returns record of Renovate environment variables specific for the platform of targetUrl\n */\nexport async function getPlatformEnvs(\n target: TargetRepo,\n context: PlatformEnvsOptions,\n): Promise<Record<string, string>> {\n const { rootConfig, logger } = context;\n\n const env: Record<string, string> = {};\n // add Renovate platform and tokens\n const integrations = ScmIntegrations.fromConfig(rootConfig);\n const integration = integrations.byHost(target.host);\n if (is.nullOrUndefined(integration)) {\n throw new Error(\n `Could not identify platform for target ${target.host}/${target.repository}`,\n );\n }\n\n const errMsg = `No credentials could be found for url and '${integration.type}' type for host ${target.host}`;\n const url = `https://${target.host}/${target.repository}`;\n switch (integration.type) {\n case 'github': {\n env.RENOVATE_PLATFORM = integration.type;\n const token = await getGithubToken(integrations, url);\n env.RENOVATE_TOKEN = requireConfigVariable(token, errMsg);\n env.RENOVATE_REPOSITORIES = target.repository;\n break;\n }\n case 'gitlab':\n {\n const cred = await DefaultGitlabCredentialsProvider.fromIntegrations(\n integrations,\n ).getCredentials({ url });\n const gitLabIntegrationConfig = requireConfigVariable(\n integrations.gitlab.byHost(target.host)?.config,\n errMsg,\n );\n env.RENOVATE_PLATFORM = integration.type;\n env.RENOVATE_ENDPOINT =\n gitLabIntegrationConfig.apiBaseUrl ?? `https://${target.host}/api/v4`;\n env.RENOVATE_TOKEN = requireConfigVariable(cred.token, errMsg);\n env.RENOVATE_REPOSITORIES = target.repository;\n }\n break;\n default:\n throw new Error(`Unsupported platform type ${integration.type}`);\n }\n\n const githubComURL = 'https://github.com';\n const githubComIntegration = integrations.github.byUrl(githubComURL);\n if (is.nullOrUndefined(githubComIntegration)) {\n logger.warn(`No Github.com integration has been found`);\n } else {\n const githubComToken = await getGithubToken(integrations, githubComURL);\n if (githubComToken) {\n env.RENOVATE_GITHUB_COM = githubComToken;\n } else {\n logger.warn(\n `Could not get token for Github.com token in the defined integrations`,\n );\n }\n }\n\n return env;\n}\n\nfunction requireConfigVariable<T>(\n input: T | undefined | null,\n errMessage: string,\n): T {\n if (is.nullOrUndefined(input)) {\n throw new Error(errMessage);\n }\n return input;\n}\n","import { Config } from '@backstage/config';\nimport {\n readSchedulerServiceTaskScheduleDefinitionFromConfig,\n SchedulerServiceTaskScheduleDefinition,\n} from '@backstage/backend-plugin-api';\nimport { JsonValue } from '@backstage/types';\n\nexport const RENOVATE_ANNOTATION_KEEP_UPDATED =\n 'renovate.secustor.dev/keep-updated';\n\nexport function getPluginConfig(rootConfig: Config): Config {\n return rootConfig.getConfig('renovate');\n}\n\nexport function getRenovateConfig(rootConfig: Config): JsonValue {\n const value = getPluginConfig(rootConfig).getOptional('config');\n return value ?? null;\n}\n\nexport function getRuntimeConfigs(rootConfig: Config): {\n runtime: string;\n config: Config | null;\n} {\n const runtimeConfig = getPluginConfig(rootConfig).getConfig('runtime');\n const runtime = runtimeConfig.getString('type');\n return {\n runtime,\n config: runtimeConfig.getConfig(runtime),\n };\n}\n\nexport function getScheduleDefinition(\n pluginConfig: Config,\n variant: 'renovation' | 'cleanup',\n): SchedulerServiceTaskScheduleDefinition {\n try {\n const scheduleConfig = pluginConfig.getConfig(`schedules.${variant}`);\n return readSchedulerServiceTaskScheduleDefinitionFromConfig(scheduleConfig);\n } catch (e) {\n return {\n scope: 'global',\n timeout: { minutes: 60 },\n frequency: { minutes: 60 },\n };\n }\n}\n","import { RenovateReport } from '@secustor/backstage-plugin-renovate-common';\nimport { ExtractReportOptions } from './types';\nimport { Config } from '@backstage/config';\nimport is from '@sindresorhus/is';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { getPluginConfig } from '../config';\n\nexport async function extractReport(\n opts: ExtractReportOptions,\n): Promise<RenovateReport> {\n const { logStream, logger } = opts;\n return new Promise(resolve => {\n let uncompletedText = '';\n logStream.on('data', (chunk: Buffer) => {\n const text = uncompletedText.concat(chunk.toString());\n const logLines = text.split('\\n');\n\n // if the last element is an empty string, then we have a complete json line so we reset it.\n // else we save it to\n uncompletedText = logLines.pop() ?? '';\n\n for (const logLine of logLines) {\n const log = JSON.parse(logLine);\n if (log.report) {\n // TODO use schema and reject if report does not fit expectation\n const report = log.report as RenovateReport;\n // do not forward the report to logging\n resolve(report);\n }\n const msg = log.msg;\n delete log.msg;\n // delete logContext as it is the same as runID\n delete log.logContext;\n logger.debug(msg, log);\n }\n });\n });\n}\n\nexport function getCacheEnvs(\n config: Config,\n logger: LoggerService,\n): Record<string, string> {\n const cacheEnabled =\n getPluginConfig(config).getOptionalBoolean('cache.enabled') ?? true;\n if (!cacheEnabled) {\n logger.debug('Cache has been disabled in plugin configuration');\n return {};\n }\n\n const cacheConfig = config.getOptionalConfig('backend.cache');\n if (is.nullOrUndefined(cacheConfig)) {\n logger.debug('No cache configured');\n return {};\n }\n\n const store = cacheConfig.getString('store');\n if (store !== 'redis') {\n logger.debug(`Unsupported cache store '${store}' detected`);\n return {};\n }\n\n const connection = cacheConfig.getOptionalString('connection');\n if (is.nullOrUndefined(connection)) {\n logger.debug('No connection string for redis cache configured in backend');\n return {};\n }\n\n logger.debug('Injecting Redis cache into Renovate');\n return {\n RENOVATE_REDIS_PREFIX: 'renovate_',\n RENOVATE_REDIS_URL: connection,\n };\n}\n","import { Config } from '@backstage/config';\nimport { getPluginConfig } from '../config';\nimport {\n QueueFactory,\n RenovateQueue,\n Runnable,\n} from '@secustor/backstage-plugin-renovate-node';\n\nexport function createQueue<T extends object>(\n queues: Map<string, QueueFactory<T>>,\n rootConfig: Config,\n runnable: Runnable<T>,\n): RenovateQueue<T> {\n const type = getPluginConfig(rootConfig).getString('queue.type');\n\n const factory = queues.get(type);\n if (!factory) {\n throw new Error(`Could not find Queue implementation ${type}`);\n }\n\n return factory(runnable);\n}\n","import is from '@sindresorhus/is';\nimport { getPlatformEnvs } from './platforms';\nimport { RouterOptions } from '../service/types';\nimport { extractReport, getCacheEnvs } from './utils';\nimport {\n getTargetRepo,\n getTaskID,\n RenovateReport,\n RenovateWrapper,\n TargetRepo,\n} from '@secustor/backstage-plugin-renovate-common';\nimport { Config } from '@backstage/config';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { getRenovateConfig, getRuntimeConfigs } from '../config';\nimport { DatabaseHandler } from '../service/databaseHandler';\nimport { isError } from '@backstage/errors';\nimport { Entity } from '@backstage/catalog-model';\nimport { nanoid } from 'nanoid';\nimport { createQueue } from '../queue';\nimport {\n AddResult,\n QueueFactory,\n RenovateQueue,\n Runnable,\n RunOptions,\n} from '@secustor/backstage-plugin-renovate-node';\n\nexport class RenovateRunner implements Runnable<RunOptions> {\n private readonly queue: RenovateQueue<RunOptions>;\n\n constructor(\n queueFactories: Map<string, QueueFactory<RunOptions>>,\n private readonly databaseHandler: DatabaseHandler,\n private readonly rootConfig: Config,\n readonly logger: LoggerService,\n private readonly runtimes: Map<string, RenovateWrapper>,\n ) {\n this.queue = createQueue(queueFactories, rootConfig, this);\n }\n\n static async from(options: RouterOptions): Promise<RenovateRunner> {\n const { databaseHandler, rootConfig, runtimes, logger, queueFactories } =\n options;\n\n return new RenovateRunner(\n queueFactories,\n databaseHandler,\n rootConfig,\n logger,\n runtimes,\n );\n }\n\n async addToQueue(\n ...targets: (string | Entity | TargetRepo)[]\n ): Promise<AddResult[]> {\n const props = targets.map(target => {\n const jobId = getTaskID(target);\n const targetRepo = getTargetRepo(target);\n return {\n jobId,\n data: {\n id: jobId,\n target: targetRepo,\n },\n };\n });\n\n return await this.queue.addBulk(props);\n }\n\n async runNext(target: string | Entity | TargetRepo): Promise<AddResult> {\n const jobId = getTaskID(target);\n const targetRepo = getTargetRepo(target);\n\n return await this.queue.add(\n jobId,\n { id: jobId, target: targetRepo },\n {\n force: true,\n insertInFront: true,\n },\n );\n }\n\n async run(props: RunOptions): Promise<void> {\n const { id, target } = props;\n const runID = nanoid();\n const logger = this.logger.child({ runID, jobID: id, ...target });\n try {\n logger.info('Renovate run starting');\n const report = await this.renovate(props, logger);\n await this.databaseHandler.addReport({\n runID,\n taskID: id,\n report,\n target,\n logger,\n });\n logger.info('Renovate run successfully finished');\n } catch (e) {\n logger.error('Renovate failed', isError(e) ? e : {});\n }\n }\n\n async renovate(\n { id, target }: RunOptions,\n logger: LoggerService,\n ): Promise<RenovateReport> {\n const { runtime, config: runtimeConfig } = getRuntimeConfigs(\n this.rootConfig,\n );\n const wrapperRuntime = this.runtimes.get(runtime);\n if (is.nullOrUndefined(wrapperRuntime)) {\n throw new Error(`Unknown runtime type '${runtime}'`);\n }\n\n const env: Record<string, string> = {\n // setup logging\n LOG_FORMAT: 'json',\n LOG_LEVEL: 'debug',\n LOG_CONTEXT: id,\n RENOVATE_REPORT_TYPE: 'logging',\n // setup platform specifics\n ...(await getPlatformEnvs(target, {\n logger,\n rootConfig: this.rootConfig,\n })),\n ...getCacheEnvs(this.rootConfig, logger),\n };\n\n // read out renovate.config and write out to json file for consumption by Renovate\n // we are reading it at this place to allow dynamic configuration changes\n const renovateConfig = getRenovateConfig(this.rootConfig);\n\n const promise = wrapperRuntime.run({\n runID: id,\n env,\n renovateConfig,\n runtimeConfig,\n logger,\n });\n\n return promise.then(result => {\n return extractReport({\n logger,\n logStream: result.stdout,\n });\n });\n }\n}\n","import { resolvePackagePath } from '@backstage/backend-plugin-api';\nimport { Knex } from 'knex';\nimport type {\n AddReportParameters,\n DatabaseCreationParameters,\n DeleteOptions,\n ReportQueryParameters,\n ReportsRow,\n ReportTargetQuery,\n} from './types';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport is from '@sindresorhus/is';\nimport { RepositoryReportResponse } from '@secustor/backstage-plugin-renovate-common';\n\nconst migrationsDir = resolvePackagePath(\n '@secustor/backstage-plugin-renovate-backend',\n 'migrations',\n);\n\nexport class DatabaseHandler {\n static async create(\n options: DatabaseCreationParameters,\n ): Promise<DatabaseHandler> {\n const { database, logger } = options;\n const client = await database.getClient();\n\n if (!database.migrations?.skip) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new DatabaseHandler(client, logger);\n }\n\n private constructor(\n private client: Knex,\n private logger: LoggerService,\n ) {}\n\n async addReport(options: AddReportParameters): Promise<void> {\n const { runID, taskID, report, target } = options;\n const logger = options.logger ?? this.logger;\n\n const inserts: ReportsRow[] = [];\n for (const [repository, value] of Object.entries(report.repositories)) {\n inserts.push({\n run_id: runID,\n task_id: taskID,\n timestamp: new Date(),\n host: target.host,\n repository,\n report: value,\n });\n }\n // this.client.batchInsert<ReportsRow>('reports', inserts);\n await this.client('reports')\n .insert(inserts)\n .catch(reason => logger.error('Failed insert data', reason));\n }\n\n async getReports(\n query?: ReportQueryParameters,\n ): Promise<RepositoryReportResponse> {\n const builder = this.client.select<ReportsRow[]>();\n if (query) {\n builder.where(query);\n }\n const rows = await builder.from<ReportsRow[]>('reports');\n return rows.map(row => {\n return {\n runID: row.run_id,\n taskID: row.task_id,\n timestamp: row.timestamp.toISOString(),\n host: row.host,\n repository: row.repository,\n // if the JSON field has not been auto-parsed do it manually\n report: is.string(row.report) ? JSON.parse(row.report) : row.report,\n };\n });\n }\n\n async getTargets(): Promise<ReportTargetQuery[]> {\n return this.client\n .select()\n .distinct<ReportsRow[]>('host', 'repository')\n .from('reports');\n }\n\n async deleteReportsByTarget(\n { host, repository }: ReportTargetQuery,\n options?: DeleteOptions,\n ): Promise<number> {\n let offset = 0;\n if (\n is.nullOrUndefined(options?.keepLatest) ||\n is.boolean(options?.keepLatest)\n ) {\n offset = options?.keepLatest ? 1 : 0;\n } else {\n offset = options.keepLatest;\n }\n const toBeDeletedIDs = this.client('reports')\n .select('run_id')\n .where('host', host)\n .andWhere('repository', repository)\n .orderBy('timestamp', 'DESC')\n .offset(offset);\n\n return this.client('reports').delete().whereIn('run_id', [toBeDeletedIDs]);\n }\n\n async deleteReports(options?: DeleteOptions): Promise<number> {\n const targets = await this.getTargets();\n const modified = await Promise.all(\n targets.map(target => this.deleteReportsByTarget(target, options)),\n );\n // sum up\n return modified.reduce((a, b) => a + b, 0);\n }\n}\n","import {\n CATALOG_FILTER_EXISTS,\n CatalogClient,\n} from '@backstage/catalog-client';\nimport { ANNOTATION_SOURCE_LOCATION } from '@backstage/catalog-model';\nimport { RouterOptions } from './types';\nimport {\n getPluginConfig,\n getScheduleDefinition,\n RENOVATE_ANNOTATION_KEEP_UPDATED,\n} from '../config';\nimport { RenovateRunner } from '../wrapper';\n\nexport async function scheduleJobSync(\n renovateRunner: RenovateRunner,\n routerOptions: RouterOptions,\n): Promise<void> {\n const { scheduler, auth, rootConfig, discovery } = routerOptions;\n\n const client = new CatalogClient({ discoveryApi: discovery });\n\n const pluginConfig = getPluginConfig(rootConfig);\n const schedule = getScheduleDefinition(pluginConfig, 'renovation');\n\n return scheduler.scheduleTask({\n id: `renovate_scheduled_runs`,\n ...schedule,\n\n fn: async () => {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n const { items: entities } = await client.getEntities(\n {\n filter: {\n [`metadata.annotations.${RENOVATE_ANNOTATION_KEEP_UPDATED}`]:\n CATALOG_FILTER_EXISTS,\n [`metadata.annotations.${ANNOTATION_SOURCE_LOCATION}`]:\n CATALOG_FILTER_EXISTS,\n },\n fields: [\n 'kind',\n 'metadata.annotations',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n },\n { token },\n );\n\n await renovateRunner.addToQueue(...entities);\n },\n });\n}\n","import { RouterOptions } from './types';\nimport { getPluginConfig, getScheduleDefinition } from '../config';\n\nexport async function scheduleCleanupTask(routerOptions: RouterOptions) {\n const { scheduler, rootConfig, databaseHandler, logger } = routerOptions;\n const pluginConfig = getPluginConfig(rootConfig);\n const schedule = getScheduleDefinition(pluginConfig, 'cleanup');\n const reportsToKeep =\n pluginConfig.getOptionalNumber('cleanup.minimumReports') ?? -1;\n\n return scheduler.scheduleTask({\n id: `renovate_report_cleanup`,\n ...schedule,\n fn: async () => {\n if (reportsToKeep >= 0) {\n logger.debug('Running report cleanup');\n const modified = await databaseHandler.deleteReports({\n keepLatest: reportsToKeep,\n });\n logger.debug(`Report cleanup completed. ${modified} reports deleted`);\n }\n },\n });\n}\n","import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { RenovateWrapper } from '@secustor/backstage-plugin-renovate-common';\nimport { RenovateRunner } from './wrapper';\nimport { RouterOptions } from './service/types';\nimport { DatabaseHandler } from './service/databaseHandler';\nimport {\n QueueFactory,\n renovateQueueExtensionPoint,\n renovateRuntimeExtensionPoint,\n RunOptions,\n} from '@secustor/backstage-plugin-renovate-node';\nimport { scheduleJobSync } from './service/jobSync';\nimport { scheduleCleanupTask } from './service/cleanupTask';\n\n/**\n * Renovate backend plugin\n *\n * @public\n */\nexport const renovatePlugin = createBackendPlugin({\n pluginId: 'renovate',\n register(env) {\n // allow modules provide additional runtimes\n const runtimes = new Map<string, RenovateWrapper>();\n env.registerExtensionPoint(renovateRuntimeExtensionPoint, {\n addRuntime(id: string, runtime: RenovateWrapper) {\n if (runtimes.has(id)) {\n throw new Error(\n ` ${id} has been already registered. Only one wrapper with the same ID is allowed to be registered`,\n );\n }\n runtimes.set(id, runtime);\n },\n });\n\n const queueFactories = new Map<string, QueueFactory<RunOptions>>();\n env.registerExtensionPoint(renovateQueueExtensionPoint, {\n addQueueFactory(id: string, factory: QueueFactory<RunOptions>) {\n if (queueFactories.has(id)) {\n throw new Error(\n ` ${id} has been already registered. Only one queue with the same ID is allowed to be registered`,\n );\n }\n queueFactories.set(id, factory);\n },\n });\n\n env.registerInit({\n deps: {\n rootConfig: coreServices.rootConfig,\n logger: coreServices.logger,\n httpRouter: coreServices.httpRouter,\n database: coreServices.database,\n scheduler: coreServices.scheduler,\n discovery: coreServices.discovery,\n auth: coreServices.auth,\n },\n async init(options) {\n const { database, httpRouter, logger } = options;\n\n const routerOptions: RouterOptions = {\n ...options,\n databaseHandler: await DatabaseHandler.create({ database, logger }),\n runtimes,\n queueFactories,\n };\n const renovateRunner = await RenovateRunner.from(routerOptions);\n\n await scheduleJobSync(renovateRunner, routerOptions);\n await scheduleCleanupTask(routerOptions);\n\n httpRouter.use(await createRouter(renovateRunner, routerOptions));\n httpRouter.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createValidatedOpenApiRouter","z","targetRepo","MiddlewareFactory","CatalogClient","express","is","isEntityRef","result","getTargetRepo","getTaskID","DefaultGithubCredentialsProvider","ScmIntegrations","integration","DefaultGitlabCredentialsProvider","readSchedulerServiceTaskScheduleDefinitionFromConfig","nanoid","isError","resolvePackagePath","CATALOG_FILTER_EXISTS","ANNOTATION_SOURCE_LOCATION","createBackendPlugin","renovateRuntimeExtensionPoint","renovateQueueExtensionPoint","coreServices"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,6 +3,7 @@ import { Config } from '@backstage/config';
3
3
  import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
4
4
  import { AuthService, LoggerService, SchedulerService, DiscoveryService, DatabaseService } from '@backstage/backend-plugin-api';
5
5
  import { RepositoryReportResponse, RenovateWrapper, RenovateReport, TargetRepo } from '@secustor/backstage-plugin-renovate-common';
6
+ import { QueueFactory, RunOptions, Runnable, AddResult } from '@secustor/backstage-plugin-renovate-node';
6
7
  import { Entity } from '@backstage/catalog-model';
7
8
 
8
9
  declare class DatabaseHandler {
@@ -23,6 +24,7 @@ interface RouterOptions {
23
24
  logger: LoggerService;
24
25
  databaseHandler: DatabaseHandler;
25
26
  runtimes: Map<string, RenovateWrapper>;
27
+ queueFactories: Map<string, QueueFactory<RunOptions>>;
26
28
  scheduler: SchedulerService;
27
29
  discovery: DiscoveryService;
28
30
  }
@@ -54,25 +56,18 @@ interface AddReportParameters {
54
56
  logger?: LoggerService;
55
57
  }
56
58
 
57
- /***/
58
- /**
59
- * Node.js library for the renovate-wrapper plugin.
60
- *
61
- * @packageDocumentation
62
- */
63
-
64
- declare class RenovateRunner {
65
- private scheduler;
59
+ declare class RenovateRunner implements Runnable<RunOptions> {
60
+ private readonly databaseHandler;
66
61
  private readonly rootConfig;
67
- private databaseHandler;
68
- private logger;
69
- private runtimes;
70
- constructor(databaseHandler: DatabaseHandler, rootConfig: Config, logger: LoggerService, runtimes: Map<string, RenovateWrapper>, scheduler: SchedulerService);
62
+ readonly logger: LoggerService;
63
+ private readonly runtimes;
64
+ private readonly queue;
65
+ constructor(queueFactories: Map<string, QueueFactory<RunOptions>>, databaseHandler: DatabaseHandler, rootConfig: Config, logger: LoggerService, runtimes: Map<string, RenovateWrapper>);
71
66
  static from(options: RouterOptions): Promise<RenovateRunner>;
72
- private renovate;
73
- run(id: string, target: TargetRepo): Promise<void>;
74
- trigger(target: string | Entity | TargetRepo): Promise<void>;
75
- schedule(target: string | Entity | TargetRepo): Promise<void>;
67
+ addToQueue(...targets: (string | Entity | TargetRepo)[]): Promise<AddResult[]>;
68
+ runNext(target: string | Entity | TargetRepo): Promise<AddResult>;
69
+ run(props: RunOptions): Promise<void>;
70
+ renovate({ id, target }: RunOptions, logger: LoggerService): Promise<RenovateReport>;
76
71
  }
77
72
 
78
73
  declare function createRouter(runner: RenovateRunner, options: RouterOptions): Promise<express.Router>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@secustor/backstage-plugin-renovate-backend",
3
- "version": "0.8.1",
3
+ "version": "0.9.0",
4
4
  "main": "dist/index.cjs.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "commonjs",
@@ -46,7 +46,7 @@
46
46
  "postpack": "backstage-cli package postpack"
47
47
  },
48
48
  "dependencies": {
49
- "@backstage/backend-common": "^0.23.0",
49
+ "@backstage/backend-defaults": "^0.3.0",
50
50
  "@backstage/backend-openapi-utils": "^0.1.12",
51
51
  "@backstage/backend-plugin-api": "^0.6.19",
52
52
  "@backstage/backend-tasks": "^0.5.24",
@@ -56,8 +56,8 @@
56
56
  "@backstage/errors": "^1.2.4",
57
57
  "@backstage/integration": "^1.12.0",
58
58
  "@backstage/types": "^1.1.1",
59
- "@secustor/backstage-plugin-renovate-common": "^0.4.0",
60
- "@secustor/backstage-plugin-renovate-node": "^0.2.0",
59
+ "@secustor/backstage-plugin-renovate-common": "^0.5.0",
60
+ "@secustor/backstage-plugin-renovate-node": "^0.3.0",
61
61
  "@sindresorhus/is": "^4.6.0",
62
62
  "@types/express": "*",
63
63
  "express": "^4.17.1",