@secustor/backstage-plugin-renovate-backend 0.2.0 → 0.3.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,21 @@
1
1
  # @secustor/backstage-plugin-renovate-backend
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - c9c5ab2: Remove call back feature as will no longer possible if the Backstage task runner system is used
8
+ - b196ddc: Allow opting out of Redis cache injection
9
+
10
+ ### Patch Changes
11
+
12
+ - 5a12bc4: Use underscores instead for slashes for task ids
13
+ - b6541b4: Fix database column for last_updated to timestamp rather time
14
+ - ed52293: Fix task scheduling in case there is no runner yet scheduled
15
+ - Updated dependencies [5a12bc4]
16
+ - @secustor/backstage-plugin-renovate-common@0.1.2
17
+ - @secustor/backstage-plugin-renovate-node@0.1.1
18
+
3
19
  ## 0.2.0
4
20
 
5
21
  ### Minor Changes
package/README.md CHANGED
@@ -37,13 +37,7 @@ renovate:
37
37
  # ID of the runtime provided via extension point. This option is required as the backend comes with no runtime by default.
38
38
  type: docker
39
39
 
40
- # defines a list of allowed hosts to which the report is sent to if a callBackURL is provided with the run request.
41
- # If the list is not set, localhost is allowed.
42
- # In case you want to forbid all callbacks, set it to an empty array '[]'
43
- callBacks:
44
- allowedHosts:
45
- - my.endpoint.local
46
40
  config:
47
- # unset this value if you want to opt out of the cache injection
41
+ # set this value to null if you want to opt out of the cache injection
48
42
  redisUrl:
49
43
  ```
package/dist/index.cjs.js CHANGED
@@ -7,20 +7,18 @@ var express = require('express');
7
7
  var backendOpenapiUtils = require('@backstage/backend-openapi-utils');
8
8
  var backstagePluginRenovateCommon = require('@secustor/backstage-plugin-renovate-common');
9
9
  var zod = require('zod');
10
- var fetch = require('node-fetch');
10
+ var errors = require('@backstage/errors');
11
11
  var backendPluginApi = require('@backstage/backend-plugin-api');
12
12
  var catalogClient = require('@backstage/catalog-client');
13
13
  var catalogModel = require('@backstage/catalog-model');
14
14
  var is = require('@sindresorhus/is');
15
15
  var integration = require('@backstage/integration');
16
16
  var backendTasks = require('@backstage/backend-tasks');
17
- var errors = require('@backstage/errors');
18
17
  var backstagePluginRenovateNode = require('@secustor/backstage-plugin-renovate-node');
19
18
 
20
19
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
21
20
 
22
21
  var express__default = /*#__PURE__*/_interopDefaultCompat(express);
23
- var fetch__default = /*#__PURE__*/_interopDefaultCompat(fetch);
24
22
  var is__default = /*#__PURE__*/_interopDefaultCompat(is);
25
23
 
26
24
  const spec = {
@@ -134,10 +132,6 @@ const spec = {
134
132
  properties: {
135
133
  target: {
136
134
  $ref: "#/components/schemas/target"
137
- },
138
- callBackURL: {
139
- type: "string",
140
- example: "https://localhost:8080/my-webhook-endpoint"
141
135
  }
142
136
  }
143
137
  }
@@ -308,12 +302,11 @@ const createOpenApiRouter = async (options) => backendOpenapiUtils.createValidat
308
302
 
309
303
  const target = zod.z.union([zod.z.string(), backstagePluginRenovateCommon.entityWithAnnotations]);
310
304
  const runRequestBody = zod.z.object({
311
- target,
312
- callBackURL: zod.z.string().url().optional()
305
+ target
313
306
  });
314
307
 
315
308
  async function createRouter(runner, options) {
316
- const { logger, pluginConfig, databaseHandler } = options;
309
+ const { logger, databaseHandler } = options;
317
310
  const router = await createOpenApiRouter();
318
311
  router.use(express__default.default.json());
319
312
  router.get("/health", (_, response) => {
@@ -344,36 +337,18 @@ async function createRouter(runner, options) {
344
337
  }
345
338
  const data = body.data;
346
339
  const targetRepo = backstagePluginRenovateCommon.getTargetRepo(data.target);
347
- const promise = runner.schedule(targetRepo);
348
- const parsedUrl = backstagePluginRenovateCommon.parseUrl(data.callBackURL);
349
- if (parsedUrl) {
350
- const allowedHosts = pluginConfig.getOptionalStringArray(
351
- "callBacks.allowedHosts"
352
- );
353
- if (
354
- // by default, allow only localhost
355
- !allowedHosts && parsedUrl.host !== "localhost" || // else check if host is in the allowed list
356
- allowedHosts && !allowedHosts.includes(parsedUrl.host)
357
- ) {
358
- response.status(400).json({
359
- error: `callBackUrl '${parsedUrl.host}' is not allowed`
360
- });
361
- return;
340
+ const id = backstagePluginRenovateCommon.getTaskID(targetRepo);
341
+ try {
342
+ await runner.trigger(targetRepo);
343
+ response.status(202).json({ runID: id });
344
+ } catch (e) {
345
+ if (errors.isError(e) && errors.ConflictError.name === e.name) {
346
+ logger.debug("Task already running", { taskID: id });
347
+ response.status(423).json({ error: e });
348
+ } else {
349
+ response.status(400).json({ error: e });
362
350
  }
363
- promise.then((report) => {
364
- fetch__default.default(data.callBackURL, {
365
- method: "POST",
366
- body: JSON.stringify(report)
367
- });
368
- });
369
- promise.catch((reason) => {
370
- fetch__default.default(data.callBackURL, {
371
- method: "POST",
372
- body: JSON.stringify(reason)
373
- });
374
- });
375
351
  }
376
- response.status(202).json({ runID: backstagePluginRenovateCommon.getTaskID(targetRepo) });
377
352
  });
378
353
  router.use(backendCommon.errorHandler());
379
354
  return router;
@@ -436,6 +411,34 @@ function requireConfigVariable(input, errMessage) {
436
411
  return input;
437
412
  }
438
413
 
414
+ function getPluginConfig(rootConfig) {
415
+ return rootConfig.getConfig("renovate");
416
+ }
417
+ function getRenovateConfig(rootConfig) {
418
+ const value = getPluginConfig(rootConfig).getOptional("config");
419
+ return value != null ? value : null;
420
+ }
421
+ function getRuntimeConfigs(rootConfig) {
422
+ const runtimeConfig = getPluginConfig(rootConfig).getConfig("runtime");
423
+ const runtime = runtimeConfig.getString("type");
424
+ return {
425
+ runtime,
426
+ config: runtimeConfig.getConfig(runtime)
427
+ };
428
+ }
429
+ function getScheduleDefinition(pluginConfig, variant) {
430
+ try {
431
+ const scheduleConfig = pluginConfig.getConfig(`schedules.${variant}`);
432
+ return backendTasks.readTaskScheduleDefinitionFromConfig(scheduleConfig);
433
+ } catch (e) {
434
+ return {
435
+ scope: "global",
436
+ timeout: { minutes: 60 },
437
+ frequency: { minutes: 60 }
438
+ };
439
+ }
440
+ }
441
+
439
442
  async function extractReport(opts) {
440
443
  const { logStream, logger } = opts;
441
444
  return new Promise((resolve) => {
@@ -460,7 +463,7 @@ async function extractReport(opts) {
460
463
  });
461
464
  }
462
465
  function getCacheEnvs(config, logger) {
463
- const cacheConfig = config.getOptionalConfig("backend.redis");
466
+ const cacheConfig = config.getOptionalConfig("backend.cache");
464
467
  if (is__default.default.nullOrUndefined(cacheConfig)) {
465
468
  logger.debug("No cache configured");
466
469
  return {};
@@ -475,29 +478,18 @@ function getCacheEnvs(config, logger) {
475
478
  logger.debug("No connection string for redis cache configured in backend");
476
479
  return {};
477
480
  }
481
+ const redisUrl = getRenovateConfig(config);
482
+ if (is__default.default.emptyObject(redisUrl)) {
483
+ logger.debug("Renovate redis config set to null, skipping integration");
484
+ return {};
485
+ }
478
486
  logger.debug("Injecting Redis cache into Renovate");
479
487
  return {
480
- RENOVATE_REDIS_PREFIX: "renovate",
488
+ RENOVATE_REDIS_PREFIX: "renovate_",
481
489
  RENOVATE_REDIS_URL: connection
482
490
  };
483
491
  }
484
492
 
485
- function getRuntime(pluginConfig) {
486
- return pluginConfig.getString("runtime.type");
487
- }
488
- function getScheduleDefinition(pluginConfig, variant) {
489
- try {
490
- const scheduleConfig = pluginConfig.getConfig(`schedules.${variant}`);
491
- return backendTasks.readTaskScheduleDefinitionFromConfig(scheduleConfig);
492
- } catch (e) {
493
- return {
494
- scope: "global",
495
- timeout: { minutes: 60 },
496
- frequency: { minutes: 60 }
497
- };
498
- }
499
- }
500
-
501
493
  var __defProp = Object.defineProperty;
502
494
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
503
495
  var __publicField = (obj, key, value) => {
@@ -505,41 +497,32 @@ var __publicField = (obj, key, value) => {
505
497
  return value;
506
498
  };
507
499
  class RenovateRunner {
508
- constructor(databaseHandler, rootConfig, pluginConfig, logger, runtimes, scheduler) {
500
+ constructor(databaseHandler, rootConfig, logger, runtimes, scheduler) {
509
501
  __publicField(this, "scheduler");
510
502
  __publicField(this, "rootConfig");
511
503
  __publicField(this, "databaseHandler");
512
- __publicField(this, "pluginConfig");
513
504
  __publicField(this, "logger");
514
505
  __publicField(this, "runtimes");
515
506
  this.databaseHandler = databaseHandler;
516
507
  this.rootConfig = rootConfig;
517
- this.pluginConfig = pluginConfig;
518
508
  this.logger = logger;
519
509
  this.runtimes = runtimes;
520
510
  this.scheduler = scheduler;
521
511
  }
522
512
  static async from(options) {
523
- const {
524
- databaseHandler,
525
- rootConfig,
526
- pluginConfig,
527
- runtimes,
528
- logger,
529
- scheduler
530
- } = options;
513
+ const { databaseHandler, rootConfig, runtimes, logger, scheduler } = options;
531
514
  return new RenovateRunner(
532
515
  databaseHandler,
533
516
  rootConfig,
534
- pluginConfig,
535
517
  logger,
536
518
  runtimes,
537
519
  scheduler
538
520
  );
539
521
  }
540
522
  async renovate(id, target, { logger }) {
541
- var _a, _b;
542
- const runtime = getRuntime(this.pluginConfig);
523
+ const { runtime, config: runtimeConfig } = getRuntimeConfigs(
524
+ this.rootConfig
525
+ );
543
526
  const wrapperRuntime = this.runtimes.get(runtime);
544
527
  if (is__default.default.nullOrUndefined(wrapperRuntime)) {
545
528
  throw new Error(`Unknown runtime type '${runtime}'`);
@@ -557,8 +540,7 @@ class RenovateRunner {
557
540
  }),
558
541
  ...getCacheEnvs(this.rootConfig, logger)
559
542
  };
560
- const renovateConfig = (_a = this.pluginConfig.getOptional("config")) != null ? _a : {};
561
- const runtimeConfig = (_b = this.pluginConfig.getOptionalConfig(`runtime.${runtime}`)) != null ? _b : null;
543
+ const renovateConfig = getRenovateConfig(this.rootConfig);
562
544
  const promise = wrapperRuntime.run({
563
545
  env,
564
546
  renovateConfig,
@@ -587,27 +569,35 @@ class RenovateRunner {
587
569
  logger.error("Renovate failed", errors.isError(e) ? e : {});
588
570
  }
589
571
  }
590
- async schedule(target) {
572
+ async trigger(target) {
591
573
  const id = backstagePluginRenovateCommon.getTaskID(target);
592
574
  const childLogger = this.logger.child({ taskID: id });
593
- const targetRepo = backstagePluginRenovateCommon.getTargetRepo(target);
575
+ await this.schedule(target);
576
+ childLogger.debug("Triggering task");
594
577
  try {
595
- childLogger.debug("Triggering task");
596
578
  await this.scheduler.triggerTask(id);
597
- return;
598
579
  } catch (e) {
599
- childLogger.debug("Scheduling new task");
600
- if (errors.isError(e) && e.name === errors.NotFoundError.name) {
601
- this.scheduler.scheduleTask({
602
- id,
603
- fn: () => this.run(id, targetRepo),
604
- ...getScheduleDefinition(this.pluginConfig, "renovation")
605
- });
606
- return;
607
- }
580
+ childLogger.debug("Triggering task has failed", errors.isError(e) ? e : {});
608
581
  throw e;
609
582
  }
610
583
  }
584
+ async schedule(target) {
585
+ const id = backstagePluginRenovateCommon.getTaskID(target);
586
+ const childLogger = this.logger.child({ taskID: id });
587
+ const targetRepo = backstagePluginRenovateCommon.getTargetRepo(target);
588
+ const schedules = await this.scheduler.getScheduledTasks();
589
+ if (!schedules.some((task) => task.id === id)) {
590
+ childLogger.debug("Scheduling task");
591
+ await this.scheduler.scheduleTask({
592
+ id,
593
+ fn: () => this.run(id, targetRepo),
594
+ ...getScheduleDefinition(
595
+ getPluginConfig(this.rootConfig),
596
+ "renovation"
597
+ )
598
+ });
599
+ }
600
+ }
611
601
  }
612
602
 
613
603
  const migrationsDir = backendCommon.resolvePackagePath(
@@ -638,7 +628,7 @@ class DatabaseHandler {
638
628
  for (const [repository, value] of Object.entries(report.repositories)) {
639
629
  inserts.push({
640
630
  task_id: taskID,
641
- last_updated: Date.now(),
631
+ last_updated: /* @__PURE__ */ new Date(),
642
632
  host: target.host,
643
633
  repository,
644
634
  report: value
@@ -655,7 +645,7 @@ class DatabaseHandler {
655
645
  return rows.map((row) => {
656
646
  return {
657
647
  taskID: row.task_id,
658
- lastUpdated: new Date(row.last_updated).toISOString(),
648
+ lastUpdated: row.last_updated.toISOString(),
659
649
  host: row.host,
660
650
  repository: row.repository,
661
651
  // if the JSON field has not been auto-parsed do it manually
@@ -703,17 +693,14 @@ const renovatePlugin = backendPluginApi.createBackendPlugin({
703
693
  const routerOptions = {
704
694
  ...options,
705
695
  databaseHandler: await DatabaseHandler.create({ database, logger }),
706
- pluginConfig: rootConfig.getConfig("renovate"),
707
696
  runtimes
708
697
  };
709
698
  const renovateRunner = await RenovateRunner.from(routerOptions);
710
699
  const client = new catalogClient.CatalogClient({ discoveryApi: discovery });
711
- const schedule = getScheduleDefinition(
712
- routerOptions.pluginConfig,
713
- "jobSync"
714
- );
700
+ const pluginConfig = getPluginConfig(rootConfig);
701
+ const schedule = getScheduleDefinition(pluginConfig, "jobSync");
715
702
  await scheduler.scheduleTask({
716
- id: `renovate/job-sync`,
703
+ id: `renovate_job_sync`,
717
704
  ...schedule,
718
705
  fn: async () => {
719
706
  const { token } = await auth.getPluginRequestToken({
@@ -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/index.ts","../src/wrapper/utils.ts","../src/config/index.ts","../src/wrapper/index.ts","../src/service/databaseHandler.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 },\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 },\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 },\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 callBackURL: {\n type: 'string',\n example: 'https://localhost:8080/my-webhook-endpoint',\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 runID: {\n description: 'unique ID for the run',\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 responses: {\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 'lastUpdated',\n 'report',\n ],\n properties: {\n taskID: {\n type: 'string',\n },\n lastUpdated: {\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 oneOf: [\n {\n type: 'string',\n description: 'URL to an repository',\n example: 'https://github.com/secustor/renovate-test',\n },\n {\n type: 'object',\n description: 'Entity with SourceLocation URL annotation',\n required: ['metadata'],\n properties: {\n metadata: {\n type: 'object',\n required: ['annotations'],\n properties: {\n annotations: {\n type: 'object',\n additionalProperties: false,\n required: ['backstage.io/source-location'],\n properties: {\n 'backstage.io/source-location': {\n type: 'string',\n example:\n 'https://github.com/secustor/renovate-meetup/blob/master/renovate.json',\n },\n },\n },\n },\n },\n },\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 { entityWithAnnotations } from '@secustor/backstage-plugin-renovate-common';\nimport { z } from 'zod';\n\nexport const target = z.union([z.string(), entityWithAnnotations]);\n\nexport const runRequestBody = z.object({\n target,\n callBackURL: z.string().url().optional(),\n});\n","import { errorHandler } from '@backstage/backend-common';\nimport express from 'express';\nimport { createOpenApiRouter } from '../schema/openapi.generated';\nimport { runRequestBody } from './schema';\nimport fetch from 'node-fetch';\nimport type { RouterOptions } from './types';\nimport {\n getTargetRepo,\n getTaskID,\n parseUrl,\n} from '@secustor/backstage-plugin-renovate-common';\nimport { RenovateRunner } from '../wrapper';\n\nexport async function createRouter(\n runner: RenovateRunner,\n options: RouterOptions,\n): Promise<express.Router> {\n const { logger, pluginConfig, databaseHandler } = options;\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.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.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.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 const data = body.data;\n\n // trigger Renovate run\n const targetRepo = getTargetRepo(data.target);\n const promise = runner.schedule(targetRepo);\n\n // in case of a callBackURL, set up a completion message\n const parsedUrl = parseUrl(data.callBackURL);\n if (parsedUrl) {\n // if allowedHosts are defined, check if callBackUrl is in the list\n const allowedHosts = pluginConfig.getOptionalStringArray(\n 'callBacks.allowedHosts',\n );\n if (\n // by default, allow only localhost\n (!allowedHosts && parsedUrl.host !== 'localhost') ||\n // else check if host is in the allowed list\n (allowedHosts && !allowedHosts.includes(parsedUrl.host))\n ) {\n response.status(400).json({\n error: `callBackUrl '${parsedUrl.host}' is not allowed`,\n });\n return;\n }\n\n promise.then(report => {\n fetch(data.callBackURL!, {\n method: 'POST',\n body: JSON.stringify(report),\n });\n });\n\n promise.catch(reason => {\n fetch(data.callBackURL!, {\n method: 'POST',\n body: JSON.stringify(reason),\n });\n });\n }\n\n response.status(202).json({ runID: getTaskID(targetRepo) });\n });\n router.use(errorHandler());\n return router;\n}\n","import { ScmIntegrations } from '@backstage/integration';\nimport is from '@sindresorhus/is';\nimport { PlatformEnvsOptions } from './types';\nimport { TargetRepo } from '@secustor/backstage-plugin-renovate-common';\n\n/*\n Returns record of Renovate environment variables specific for the platform of targetUrl\n */\nexport function getPlatformEnvs(\n target: TargetRepo,\n context: PlatformEnvsOptions,\n): 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 = `Could no integration found for url and '${integration.type}' type for host ${target.host}`;\n switch (integration.type) {\n case 'github':\n env.RENOVATE_PLATFORM = integration.type;\n env.RENOVATE_TOKEN = requireConfigVariable(\n integrations.github.byHost(target.host)?.config.token,\n errMsg,\n );\n env.RENOVATE_REPOSITORIES = target.repository;\n\n break;\n case 'gitlab':\n {\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(\n gitLabIntegrationConfig.token,\n 'Could not get Gitlab token',\n );\n env.RENOVATE_REPOSITORIES = target.repository;\n }\n break;\n default:\n throw new Error(`Unsupported platform type ${integration.type}`);\n }\n\n const githubComIntegration = integrations.github.byHost('github.com');\n if (is.nullOrUndefined(githubComIntegration)) {\n logger.warn(`No Github.com integration has been found`);\n } else {\n env.RENOVATE_GITHUB_COM = requireConfigVariable(\n integrations.github.byHost('github.com')?.config.token,\n 'Could not get token for Github.com token in the defined integration',\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 { 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';\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 cacheConfig = config.getOptionalConfig('backend.redis');\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 {\n readTaskScheduleDefinitionFromConfig,\n TaskScheduleDefinition,\n} from '@backstage/backend-tasks';\n\nexport function getRuntime(pluginConfig: Config): string {\n return pluginConfig.getString('runtime.type');\n}\n\nexport function getScheduleDefinition(\n pluginConfig: Config,\n variant: 'jobSync' | 'renovation',\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","/***/\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 EntityWithAnnotations,\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 { getRuntime, getScheduleDefinition } from '../config';\nimport { DatabaseHandler } from '../service/databaseHandler';\nimport { RunOptions } from './types';\nimport { isError, NotFoundError } from '@backstage/errors';\n\nexport class RenovateRunner {\n private scheduler: SchedulerService;\n private rootConfig: Config;\n private databaseHandler: DatabaseHandler;\n private pluginConfig: Config;\n private logger: LoggerService;\n private runtimes: Map<string, RenovateWrapper>;\n\n constructor(\n databaseHandler: DatabaseHandler,\n rootConfig: Config,\n pluginConfig: Config,\n logger: LoggerService,\n runtimes: Map<string, RenovateWrapper>,\n scheduler: SchedulerService,\n ) {\n this.databaseHandler = databaseHandler;\n this.rootConfig = rootConfig;\n this.pluginConfig = pluginConfig;\n this.logger = logger;\n this.runtimes = runtimes;\n this.scheduler = scheduler;\n }\n\n static async from(options: RouterOptions): Promise<RenovateRunner> {\n const {\n databaseHandler,\n rootConfig,\n pluginConfig,\n runtimes,\n logger,\n scheduler,\n } = options;\n\n return new RenovateRunner(\n databaseHandler,\n rootConfig,\n pluginConfig,\n logger,\n runtimes,\n scheduler,\n );\n }\n\n private async renovate(\n id: string,\n target: TargetRepo,\n { logger }: RunOptions,\n ): Promise<RenovateReport> {\n const runtime = getRuntime(this.pluginConfig);\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 ...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 = this.pluginConfig.getOptional('config') ?? {};\n const runtimeConfig =\n this.pluginConfig.getOptionalConfig(`runtime.${runtime}`) ?? null;\n\n const promise = wrapperRuntime.run({\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 logger = this.logger.child({ 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 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 schedule(\n target: string | EntityWithAnnotations | TargetRepo,\n ): Promise<void> {\n const id = getTaskID(target);\n const childLogger = this.logger.child({ taskID: id });\n const targetRepo = getTargetRepo(target);\n\n // try to trigger existing schedule and if this fails, start a run.\n try {\n childLogger.debug('Triggering task');\n await this.scheduler.triggerTask(id);\n return;\n } catch (e) {\n childLogger.debug('Scheduling new task');\n // expected error handle else rethrow\n if (isError(e) && e.name === NotFoundError.name) {\n this.scheduler.scheduleTask({\n id,\n fn: () => this.run(id, targetRepo),\n ...getScheduleDefinition(this.pluginConfig, 'renovation'),\n });\n return;\n }\n throw e;\n }\n }\n}\n","import { resolvePackagePath } from '@backstage/backend-common';\nimport { Knex } from 'knex';\nimport {\n AddReportParameters,\n DatabaseCreationParameters,\n ReportQueryParameters,\n ReportsRow,\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 { 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 task_id: taskID,\n last_updated: Date.now(),\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 .onConflict('task_id')\n .merge()\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 taskID: row.task_id,\n lastUpdated: new Date(row.last_updated).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","import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport {\n EntityWithAnnotations,\n RenovateWrapper,\n} from '@secustor/backstage-plugin-renovate-common';\nimport {\n CatalogClient,\n CATALOG_FILTER_EXISTS,\n} from '@backstage/catalog-client';\nimport { ANNOTATION_SOURCE_LOCATION } from '@backstage/catalog-model';\nimport { RenovateRunner } from './wrapper';\nimport { RouterOptions } from './service/types';\nimport { DatabaseHandler } from './service/databaseHandler';\nimport { getScheduleDefinition } from './config';\nimport { renovateRuntimeExtensionPoint } from '@secustor/backstage-plugin-renovate-node';\n\nconst RENOVATE_ANNOTATION_KEEP_UPDATED = 'renovate.secustor.dev/keep-updated';\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 {\n auth,\n database,\n discovery,\n httpRouter,\n rootConfig,\n scheduler,\n logger,\n } = options;\n\n const routerOptions: RouterOptions = {\n ...options,\n databaseHandler: await DatabaseHandler.create({ database, logger }),\n pluginConfig: rootConfig.getConfig('renovate'),\n runtimes,\n };\n const renovateRunner = await RenovateRunner.from(routerOptions);\n const client = new CatalogClient({ discoveryApi: discovery });\n\n const schedule = getScheduleDefinition(\n routerOptions.pluginConfig,\n 'jobSync',\n );\n\n await scheduler.scheduleTask({\n id: `renovate/job-sync`,\n ...schedule,\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 as EntityWithAnnotations);\n }\n },\n });\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","entityWithAnnotations","express","getTargetRepo","parseUrl","fetch","getTaskID","errorHandler","ScmIntegrations","integration","is","readTaskScheduleDefinitionFromConfig","isError","NotFoundError","resolvePackagePath","createBackendPlugin","renovateRuntimeExtensionPoint","coreServices","CatalogClient","CATALOG_FILTER_EXISTS","ANNOTATION_SOURCE_LOCATION"],"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/index.ts","../src/config/index.ts","../src/wrapper/utils.ts","../src/wrapper/index.ts","../src/service/databaseHandler.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 },\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 },\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 },\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 runID: {\n description: 'unique ID for the run',\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 responses: {\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 'lastUpdated',\n 'report',\n ],\n properties: {\n taskID: {\n type: 'string',\n },\n lastUpdated: {\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 oneOf: [\n {\n type: 'string',\n description: 'URL to an repository',\n example: 'https://github.com/secustor/renovate-test',\n },\n {\n type: 'object',\n description: 'Entity with SourceLocation URL annotation',\n required: ['metadata'],\n properties: {\n metadata: {\n type: 'object',\n required: ['annotations'],\n properties: {\n annotations: {\n type: 'object',\n additionalProperties: false,\n required: ['backstage.io/source-location'],\n properties: {\n 'backstage.io/source-location': {\n type: 'string',\n example:\n 'https://github.com/secustor/renovate-meetup/blob/master/renovate.json',\n },\n },\n },\n },\n },\n },\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 { entityWithAnnotations } from '@secustor/backstage-plugin-renovate-common';\nimport { z } from 'zod';\n\nexport const target = z.union([z.string(), entityWithAnnotations]);\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} from '@secustor/backstage-plugin-renovate-common';\nimport { RenovateRunner } from '../wrapper';\nimport { ConflictError, isError } from '@backstage/errors';\n\nexport async function createRouter(\n runner: RenovateRunner,\n options: RouterOptions,\n): Promise<express.Router> {\n const { logger, databaseHandler } = options;\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.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.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.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 const data = body.data;\n\n // trigger Renovate run\n const targetRepo = getTargetRepo(data.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 { ScmIntegrations } from '@backstage/integration';\nimport is from '@sindresorhus/is';\nimport { PlatformEnvsOptions } from './types';\nimport { TargetRepo } from '@secustor/backstage-plugin-renovate-common';\n\n/*\n Returns record of Renovate environment variables specific for the platform of targetUrl\n */\nexport function getPlatformEnvs(\n target: TargetRepo,\n context: PlatformEnvsOptions,\n): 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 = `Could no integration found for url and '${integration.type}' type for host ${target.host}`;\n switch (integration.type) {\n case 'github':\n env.RENOVATE_PLATFORM = integration.type;\n env.RENOVATE_TOKEN = requireConfigVariable(\n integrations.github.byHost(target.host)?.config.token,\n errMsg,\n );\n env.RENOVATE_REPOSITORIES = target.repository;\n\n break;\n case 'gitlab':\n {\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(\n gitLabIntegrationConfig.token,\n 'Could not get Gitlab token',\n );\n env.RENOVATE_REPOSITORIES = target.repository;\n }\n break;\n default:\n throw new Error(`Unsupported platform type ${integration.type}`);\n }\n\n const githubComIntegration = integrations.github.byHost('github.com');\n if (is.nullOrUndefined(githubComIntegration)) {\n logger.warn(`No Github.com integration has been found`);\n } else {\n env.RENOVATE_GITHUB_COM = requireConfigVariable(\n integrations.github.byHost('github.com')?.config.token,\n 'Could not get token for Github.com token in the defined integration',\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 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',\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 { getRenovateConfig } 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 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 const redisUrl = getRenovateConfig(config);\n if (is.emptyObject(redisUrl)) {\n logger.debug('Renovate redis config set to null, skipping integration');\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 EntityWithAnnotations,\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';\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 id: 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: id,\n RENOVATE_REPORT_TYPE: 'logging',\n // setup platform specifics\n ...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 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 logger = this.logger.child({ 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 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(\n target: string | EntityWithAnnotations | TargetRepo,\n ): 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(\n target: string | EntityWithAnnotations | TargetRepo,\n ): 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-common';\nimport { Knex } from 'knex';\nimport {\n AddReportParameters,\n DatabaseCreationParameters,\n ReportQueryParameters,\n ReportsRow,\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 { 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 task_id: taskID,\n last_updated: 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 .onConflict('task_id')\n .merge()\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 taskID: row.task_id,\n lastUpdated: row.last_updated.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","import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport {\n EntityWithAnnotations,\n RenovateWrapper,\n} from '@secustor/backstage-plugin-renovate-common';\nimport {\n CatalogClient,\n CATALOG_FILTER_EXISTS,\n} from '@backstage/catalog-client';\nimport { ANNOTATION_SOURCE_LOCATION } from '@backstage/catalog-model';\nimport { RenovateRunner } from './wrapper';\nimport { RouterOptions } from './service/types';\nimport { DatabaseHandler } from './service/databaseHandler';\nimport { getPluginConfig, getScheduleDefinition } from './config';\nimport { renovateRuntimeExtensionPoint } from '@secustor/backstage-plugin-renovate-node';\n\nconst RENOVATE_ANNOTATION_KEEP_UPDATED = 'renovate.secustor.dev/keep-updated';\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 {\n auth,\n database,\n discovery,\n httpRouter,\n rootConfig,\n scheduler,\n logger,\n } = 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 const client = new CatalogClient({ discoveryApi: discovery });\n\n const pluginConfig = getPluginConfig(rootConfig);\n const schedule = getScheduleDefinition(pluginConfig, 'jobSync');\n\n await 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 as EntityWithAnnotations);\n }\n },\n });\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","entityWithAnnotations","express","getTargetRepo","getTaskID","isError","ConflictError","errorHandler","ScmIntegrations","integration","is","readTaskScheduleDefinitionFromConfig","resolvePackagePath","createBackendPlugin","renovateRuntimeExtensionPoint","coreServices","CatalogClient","CATALOG_FILTER_EXISTS","ANNOTATION_SOURCE_LOCATION"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -15,14 +15,11 @@ declare class DatabaseHandler {
15
15
 
16
16
  interface RouterOptions {
17
17
  rootConfig: Config;
18
- pluginConfig: Config;
19
18
  logger: LoggerService;
20
19
  databaseHandler: DatabaseHandler;
21
20
  runtimes: Map<string, RenovateWrapper>;
22
21
  scheduler: SchedulerService;
23
22
  }
24
- interface Context extends RouterOptions {
25
- }
26
23
  interface DatabaseCreationParameters {
27
24
  database: DatabaseService;
28
25
  logger: LoggerService;
@@ -47,15 +44,15 @@ interface AddReportParameters {
47
44
 
48
45
  declare class RenovateRunner {
49
46
  private scheduler;
50
- private rootConfig;
47
+ private readonly rootConfig;
51
48
  private databaseHandler;
52
- private pluginConfig;
53
49
  private logger;
54
50
  private runtimes;
55
- constructor(databaseHandler: DatabaseHandler, rootConfig: Config, pluginConfig: Config, logger: LoggerService, runtimes: Map<string, RenovateWrapper>, scheduler: SchedulerService);
51
+ constructor(databaseHandler: DatabaseHandler, rootConfig: Config, logger: LoggerService, runtimes: Map<string, RenovateWrapper>, scheduler: SchedulerService);
56
52
  static from(options: RouterOptions): Promise<RenovateRunner>;
57
53
  private renovate;
58
54
  run(id: string, target: TargetRepo): Promise<void>;
55
+ trigger(target: string | EntityWithAnnotations | TargetRepo): Promise<void>;
59
56
  schedule(target: string | EntityWithAnnotations | TargetRepo): Promise<void>;
60
57
  }
61
58
 
@@ -68,4 +65,4 @@ declare function createRouter(runner: RenovateRunner, options: RouterOptions): P
68
65
  */
69
66
  declare const renovatePlugin: () => _backstage_backend_plugin_api.BackendFeature;
70
67
 
71
- export { type Context, createRouter, renovatePlugin as default };
68
+ export { createRouter, renovatePlugin as default };
@@ -12,7 +12,7 @@ exports.up = async function up(knex) {
12
12
  .unique()
13
13
  .comment('unique id of the Repository reoccurring task');
14
14
  table
15
- .time('last_updated')
15
+ .timestamp('last_updated')
16
16
  .notNullable()
17
17
  .comment('Time when the last report has been pushed');
18
18
  table
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@secustor/backstage-plugin-renovate-backend",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "main": "dist/index.cjs.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "commonjs",
@@ -36,8 +36,8 @@
36
36
  "@backstage/errors": "^1.2.4",
37
37
  "@backstage/integration": "^1.9.1",
38
38
  "@backstage/types": "^1.1.1",
39
- "@secustor/backstage-plugin-renovate-common": "^0.1.1",
40
- "@secustor/backstage-plugin-renovate-node": "^0.1.0",
39
+ "@secustor/backstage-plugin-renovate-common": "^0.1.2",
40
+ "@secustor/backstage-plugin-renovate-node": "^0.1.1",
41
41
  "@sindresorhus/is": "^4.6.0",
42
42
  "@types/express": "*",
43
43
  "express": "^4.17.1",