@secustor/backstage-plugin-renovate-backend 0.7.0 → 0.8.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 +24 -0
- package/README.md +7 -0
- package/dist/index.cjs.js +183 -68
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +16 -1
- package/package.json +24 -16
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# @secustor/backstage-plugin-renovate-backend
|
|
2
2
|
|
|
3
|
+
## 0.8.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#206](https://github.com/secustor/backstage-plugins/pull/206) [`7437c6d`](https://github.com/secustor/backstage-plugins/commit/7437c6d19f5ff073bdc970f2542902ee4a1bab73) Thanks [@secustor](https://github.com/secustor)! - Add cleanup job to delete outdated reports
|
|
8
|
+
|
|
9
|
+
- [`ee838a1`](https://github.com/secustor/backstage-plugins/commit/ee838a1c665a5fff27b1fe68758fb805125d9b95) Thanks [@secustor](https://github.com/secustor)! - Upgrade Backstage to 1.28.0
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Updated dependencies [[`ee838a1`](https://github.com/secustor/backstage-plugins/commit/ee838a1c665a5fff27b1fe68758fb805125d9b95)]:
|
|
14
|
+
- @secustor/backstage-plugin-renovate-common@0.4.0
|
|
15
|
+
- @secustor/backstage-plugin-renovate-node@0.2.0
|
|
16
|
+
|
|
17
|
+
## 0.7.1
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- [#140](https://github.com/secustor/backstage-plugins/pull/140) [`b3f6c2b`](https://github.com/secustor/backstage-plugins/commit/b3f6c2bff76b15371b100a5d3d71b46dd59275b1) Thanks [@secustor](https://github.com/secustor)! - Upgrade Backstage 1.26.3
|
|
22
|
+
|
|
23
|
+
- Updated dependencies [[`b3f6c2b`](https://github.com/secustor/backstage-plugins/commit/b3f6c2bff76b15371b100a5d3d71b46dd59275b1)]:
|
|
24
|
+
- @secustor/backstage-plugin-renovate-common@0.3.1
|
|
25
|
+
- @secustor/backstage-plugin-renovate-node@0.1.4
|
|
26
|
+
|
|
3
27
|
## 0.7.0
|
|
4
28
|
|
|
5
29
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -29,10 +29,17 @@ renovate:
|
|
|
29
29
|
# Allows turning off cache injection. You can still manually supply caches using the Renovate config
|
|
30
30
|
enabled: false
|
|
31
31
|
|
|
32
|
+
cleanup:
|
|
33
|
+
# -1 translates to never delete reports during maintenance tasks
|
|
34
|
+
# x > 0 number of reports to maintain
|
|
35
|
+
minimumReports: -1
|
|
32
36
|
schedules:
|
|
33
37
|
jobSync:
|
|
34
38
|
frequency: { minutes: 60 }
|
|
35
39
|
timeout: { minutes: 60 }
|
|
40
|
+
cleanup:
|
|
41
|
+
frequency: { minutes: 60 }
|
|
42
|
+
timeout: { minutes: 60 }
|
|
36
43
|
renovation:
|
|
37
44
|
frequency: { minutes: 60 }
|
|
38
45
|
timeout: { minutes: 60 }
|
package/dist/index.cjs.js
CHANGED
|
@@ -10,12 +10,12 @@ var backstagePluginRenovateCommon = require('@secustor/backstage-plugin-renovate
|
|
|
10
10
|
var errors = require('@backstage/errors');
|
|
11
11
|
var catalogClient = require('@backstage/catalog-client');
|
|
12
12
|
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
13
|
-
var catalogModel = require('@backstage/catalog-model');
|
|
14
13
|
var is = require('@sindresorhus/is');
|
|
15
14
|
var integration = require('@backstage/integration');
|
|
16
15
|
var backendTasks = require('@backstage/backend-tasks');
|
|
17
16
|
var nanoid = require('nanoid');
|
|
18
17
|
var backstagePluginRenovateNode = require('@secustor/backstage-plugin-renovate-node');
|
|
18
|
+
var catalogModel = require('@backstage/catalog-model');
|
|
19
19
|
|
|
20
20
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
21
21
|
|
|
@@ -62,6 +62,19 @@ const spec = {
|
|
|
62
62
|
$ref: "#/components/responses/reports"
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
+
},
|
|
66
|
+
delete: {
|
|
67
|
+
summary: "Delete reports based on parameters",
|
|
68
|
+
parameters: [
|
|
69
|
+
{
|
|
70
|
+
$ref: "#/components/parameters/keepLatest"
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
responses: {
|
|
74
|
+
"200": {
|
|
75
|
+
$ref: "#/components/responses/deleted-successful"
|
|
76
|
+
}
|
|
77
|
+
}
|
|
65
78
|
}
|
|
66
79
|
},
|
|
67
80
|
"/reports/{host}": {
|
|
@@ -86,6 +99,19 @@ const spec = {
|
|
|
86
99
|
description: "unknown host"
|
|
87
100
|
}
|
|
88
101
|
}
|
|
102
|
+
},
|
|
103
|
+
delete: {
|
|
104
|
+
summary: "Delete reports based on parameters",
|
|
105
|
+
parameters: [
|
|
106
|
+
{
|
|
107
|
+
$ref: "#/components/parameters/keepLatest"
|
|
108
|
+
}
|
|
109
|
+
],
|
|
110
|
+
responses: {
|
|
111
|
+
"200": {
|
|
112
|
+
$ref: "#/components/responses/deleted-successful"
|
|
113
|
+
}
|
|
114
|
+
}
|
|
89
115
|
}
|
|
90
116
|
},
|
|
91
117
|
"/reports/{host}/{repository}": {
|
|
@@ -119,6 +145,19 @@ const spec = {
|
|
|
119
145
|
description: "unknown repository"
|
|
120
146
|
}
|
|
121
147
|
}
|
|
148
|
+
},
|
|
149
|
+
delete: {
|
|
150
|
+
summary: "Delete reports based on parameters",
|
|
151
|
+
parameters: [
|
|
152
|
+
{
|
|
153
|
+
$ref: "#/components/parameters/keepLatest"
|
|
154
|
+
}
|
|
155
|
+
],
|
|
156
|
+
responses: {
|
|
157
|
+
"200": {
|
|
158
|
+
$ref: "#/components/responses/deleted-successful"
|
|
159
|
+
}
|
|
160
|
+
}
|
|
122
161
|
}
|
|
123
162
|
},
|
|
124
163
|
"/runs": {
|
|
@@ -177,7 +216,36 @@ const spec = {
|
|
|
177
216
|
}
|
|
178
217
|
},
|
|
179
218
|
components: {
|
|
219
|
+
parameters: {
|
|
220
|
+
keepLatest: {
|
|
221
|
+
name: "keepLatest",
|
|
222
|
+
description: "how many reports of all targets should be kept",
|
|
223
|
+
in: "query",
|
|
224
|
+
required: false,
|
|
225
|
+
example: 3,
|
|
226
|
+
schema: {
|
|
227
|
+
type: "number"
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
},
|
|
180
231
|
responses: {
|
|
232
|
+
"deleted-successful": {
|
|
233
|
+
description: "Successful deleted",
|
|
234
|
+
content: {
|
|
235
|
+
"application/json": {
|
|
236
|
+
schema: {
|
|
237
|
+
type: "object",
|
|
238
|
+
properties: {
|
|
239
|
+
deleted: {
|
|
240
|
+
type: "number",
|
|
241
|
+
example: 15,
|
|
242
|
+
description: "Numbers of reports deleted"
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
},
|
|
181
249
|
reports: {
|
|
182
250
|
description: "Returns reports",
|
|
183
251
|
content: {
|
|
@@ -300,18 +368,38 @@ async function createRouter(runner, options) {
|
|
|
300
368
|
const reports = await databaseHandler.getReports();
|
|
301
369
|
response.status(200).json(reports);
|
|
302
370
|
});
|
|
371
|
+
router.delete("/reports", async (request, response) => {
|
|
372
|
+
const modified = await databaseHandler.deleteReports({
|
|
373
|
+
keepLatest: request.query.keepLatest
|
|
374
|
+
});
|
|
375
|
+
response.status(200).json({ modified });
|
|
376
|
+
});
|
|
303
377
|
router.get("/reports/:host", async (request, response) => {
|
|
304
378
|
const reports = await databaseHandler.getReports({
|
|
305
379
|
...request.params
|
|
306
380
|
});
|
|
307
381
|
response.status(200).json(reports);
|
|
308
382
|
});
|
|
383
|
+
router.delete("/reports/:host", async (request, response) => {
|
|
384
|
+
const modified = await databaseHandler.deleteReportsByTarget(
|
|
385
|
+
request.params,
|
|
386
|
+
{ keepLatest: request.query.keepLatest }
|
|
387
|
+
);
|
|
388
|
+
response.status(200).json({ modified });
|
|
389
|
+
});
|
|
309
390
|
router.get("/reports/:host/:repository", async (request, response) => {
|
|
310
391
|
const reports = await databaseHandler.getReports({
|
|
311
392
|
...request.params
|
|
312
393
|
});
|
|
313
394
|
response.status(200).json(reports);
|
|
314
395
|
});
|
|
396
|
+
router.delete("/reports/:host/:repository", async (request, response) => {
|
|
397
|
+
const modified = await databaseHandler.deleteReportsByTarget(
|
|
398
|
+
request.params,
|
|
399
|
+
{ keepLatest: request.query.keepLatest }
|
|
400
|
+
);
|
|
401
|
+
response.status(200).json({ modified });
|
|
402
|
+
});
|
|
315
403
|
router.post("/runs", async (request, response) => {
|
|
316
404
|
const body = runRequestBody.safeParse(request.body);
|
|
317
405
|
if (!body.success) {
|
|
@@ -348,7 +436,6 @@ async function createRouter(runner, options) {
|
|
|
348
436
|
}
|
|
349
437
|
|
|
350
438
|
async function getPlatformEnvs(target, context) {
|
|
351
|
-
var _a, _b, _c;
|
|
352
439
|
const { rootConfig, logger } = context;
|
|
353
440
|
const env = {};
|
|
354
441
|
const integrations = integration.ScmIntegrations.fromConfig(rootConfig);
|
|
@@ -376,11 +463,11 @@ async function getPlatformEnvs(target, context) {
|
|
|
376
463
|
integrations
|
|
377
464
|
).getCredentials({ url });
|
|
378
465
|
const gitLabIntegrationConfig = requireConfigVariable(
|
|
379
|
-
|
|
466
|
+
integrations.gitlab.byHost(target.host)?.config,
|
|
380
467
|
errMsg
|
|
381
468
|
);
|
|
382
469
|
env.RENOVATE_PLATFORM = integration$1.type;
|
|
383
|
-
env.RENOVATE_ENDPOINT =
|
|
470
|
+
env.RENOVATE_ENDPOINT = gitLabIntegrationConfig.apiBaseUrl ?? `https://${target.host}/api/v4`;
|
|
384
471
|
env.RENOVATE_TOKEN = requireConfigVariable(cred.token, errMsg);
|
|
385
472
|
env.RENOVATE_REPOSITORIES = target.repository;
|
|
386
473
|
}
|
|
@@ -393,7 +480,7 @@ async function getPlatformEnvs(target, context) {
|
|
|
393
480
|
logger.warn(`No Github.com integration has been found`);
|
|
394
481
|
} else {
|
|
395
482
|
env.RENOVATE_GITHUB_COM = requireConfigVariable(
|
|
396
|
-
|
|
483
|
+
integrations.github.byHost("github.com")?.config.token,
|
|
397
484
|
"Could not get token for Github.com token in the defined integration"
|
|
398
485
|
);
|
|
399
486
|
}
|
|
@@ -406,12 +493,13 @@ function requireConfigVariable(input, errMessage) {
|
|
|
406
493
|
return input;
|
|
407
494
|
}
|
|
408
495
|
|
|
496
|
+
const RENOVATE_ANNOTATION_KEEP_UPDATED = "renovate.secustor.dev/keep-updated";
|
|
409
497
|
function getPluginConfig(rootConfig) {
|
|
410
498
|
return rootConfig.getConfig("renovate");
|
|
411
499
|
}
|
|
412
500
|
function getRenovateConfig(rootConfig) {
|
|
413
501
|
const value = getPluginConfig(rootConfig).getOptional("config");
|
|
414
|
-
return value
|
|
502
|
+
return value ?? null;
|
|
415
503
|
}
|
|
416
504
|
function getRuntimeConfigs(rootConfig) {
|
|
417
505
|
const runtimeConfig = getPluginConfig(rootConfig).getConfig("runtime");
|
|
@@ -439,10 +527,9 @@ async function extractReport(opts) {
|
|
|
439
527
|
return new Promise((resolve) => {
|
|
440
528
|
let uncompletedText = "";
|
|
441
529
|
logStream.on("data", (chunk) => {
|
|
442
|
-
var _a;
|
|
443
530
|
const text = uncompletedText.concat(chunk.toString());
|
|
444
531
|
const logLines = text.split("\n");
|
|
445
|
-
uncompletedText =
|
|
532
|
+
uncompletedText = logLines.pop() ?? "";
|
|
446
533
|
for (const logLine of logLines) {
|
|
447
534
|
const log = JSON.parse(logLine);
|
|
448
535
|
if (log.report) {
|
|
@@ -458,8 +545,7 @@ async function extractReport(opts) {
|
|
|
458
545
|
});
|
|
459
546
|
}
|
|
460
547
|
function getCacheEnvs(config, logger) {
|
|
461
|
-
|
|
462
|
-
const cacheEnabled = (_a = getPluginConfig(config).getOptionalBoolean("cache.enabled")) != null ? _a : true;
|
|
548
|
+
const cacheEnabled = getPluginConfig(config).getOptionalBoolean("cache.enabled") ?? true;
|
|
463
549
|
if (!cacheEnabled) {
|
|
464
550
|
logger.debug("Cache has been disabled in plugin configuration");
|
|
465
551
|
return {};
|
|
@@ -486,19 +572,13 @@ function getCacheEnvs(config, logger) {
|
|
|
486
572
|
};
|
|
487
573
|
}
|
|
488
574
|
|
|
489
|
-
var __defProp = Object.defineProperty;
|
|
490
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
491
|
-
var __publicField = (obj, key, value) => {
|
|
492
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
493
|
-
return value;
|
|
494
|
-
};
|
|
495
575
|
class RenovateRunner {
|
|
576
|
+
scheduler;
|
|
577
|
+
rootConfig;
|
|
578
|
+
databaseHandler;
|
|
579
|
+
logger;
|
|
580
|
+
runtimes;
|
|
496
581
|
constructor(databaseHandler, rootConfig, logger, runtimes, scheduler) {
|
|
497
|
-
__publicField(this, "scheduler");
|
|
498
|
-
__publicField(this, "rootConfig");
|
|
499
|
-
__publicField(this, "databaseHandler");
|
|
500
|
-
__publicField(this, "logger");
|
|
501
|
-
__publicField(this, "runtimes");
|
|
502
582
|
this.databaseHandler = databaseHandler;
|
|
503
583
|
this.rootConfig = rootConfig;
|
|
504
584
|
this.logger = logger;
|
|
@@ -599,7 +679,7 @@ class RenovateRunner {
|
|
|
599
679
|
}
|
|
600
680
|
}
|
|
601
681
|
|
|
602
|
-
const migrationsDir =
|
|
682
|
+
const migrationsDir = backendPluginApi.resolvePackagePath(
|
|
603
683
|
"@secustor/backstage-plugin-renovate-backend",
|
|
604
684
|
"migrations"
|
|
605
685
|
);
|
|
@@ -609,10 +689,9 @@ class DatabaseHandler {
|
|
|
609
689
|
this.logger = logger;
|
|
610
690
|
}
|
|
611
691
|
static async create(options) {
|
|
612
|
-
var _a;
|
|
613
692
|
const { database, logger } = options;
|
|
614
693
|
const client = await database.getClient();
|
|
615
|
-
if (!
|
|
694
|
+
if (!database.migrations?.skip) {
|
|
616
695
|
await client.migrate.latest({
|
|
617
696
|
directory: migrationsDir
|
|
618
697
|
});
|
|
@@ -620,9 +699,8 @@ class DatabaseHandler {
|
|
|
620
699
|
return new DatabaseHandler(client, logger);
|
|
621
700
|
}
|
|
622
701
|
async addReport(options) {
|
|
623
|
-
var _a;
|
|
624
702
|
const { runID, taskID, report, target } = options;
|
|
625
|
-
const logger =
|
|
703
|
+
const logger = options.logger ?? this.logger;
|
|
626
704
|
const inserts = [];
|
|
627
705
|
for (const [repository, value] of Object.entries(report.repositories)) {
|
|
628
706
|
inserts.push({
|
|
@@ -654,9 +732,84 @@ class DatabaseHandler {
|
|
|
654
732
|
};
|
|
655
733
|
});
|
|
656
734
|
}
|
|
735
|
+
async getTargets() {
|
|
736
|
+
return this.client.select().distinct("host", "repository").from("reports");
|
|
737
|
+
}
|
|
738
|
+
async deleteReportsByTarget({ host, repository }, options) {
|
|
739
|
+
let offset = 0;
|
|
740
|
+
if (is__default.default.nullOrUndefined(options?.keepLatest) || is__default.default.boolean(options?.keepLatest)) {
|
|
741
|
+
offset = options?.keepLatest ? 1 : 0;
|
|
742
|
+
} else {
|
|
743
|
+
offset = options.keepLatest;
|
|
744
|
+
}
|
|
745
|
+
const toBeDeletedIDs = this.client("reports").select("run_id").where("host", host).andWhere("repository", repository).orderBy("timestamp", "DESC").offset(offset);
|
|
746
|
+
return this.client("reports").delete().whereIn("run_id", [toBeDeletedIDs]);
|
|
747
|
+
}
|
|
748
|
+
async deleteReports(options) {
|
|
749
|
+
const targets = await this.getTargets();
|
|
750
|
+
const modified = await Promise.all(
|
|
751
|
+
targets.map((target) => this.deleteReportsByTarget(target, options))
|
|
752
|
+
);
|
|
753
|
+
return modified.reduce((a, b) => a + b, 0);
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
async function scheduleJobSync(renovateRunner, routerOptions) {
|
|
758
|
+
const { scheduler, auth, rootConfig, discovery } = routerOptions;
|
|
759
|
+
const client = new catalogClient.CatalogClient({ discoveryApi: discovery });
|
|
760
|
+
const pluginConfig = getPluginConfig(rootConfig);
|
|
761
|
+
const schedule = getScheduleDefinition(pluginConfig, "jobSync");
|
|
762
|
+
return scheduler.scheduleTask({
|
|
763
|
+
id: `renovate_job_sync`,
|
|
764
|
+
...schedule,
|
|
765
|
+
fn: async () => {
|
|
766
|
+
const { token } = await auth.getPluginRequestToken({
|
|
767
|
+
onBehalfOf: await auth.getOwnServiceCredentials(),
|
|
768
|
+
targetPluginId: "catalog"
|
|
769
|
+
});
|
|
770
|
+
const { items: entities } = await client.getEntities(
|
|
771
|
+
{
|
|
772
|
+
filter: {
|
|
773
|
+
[`metadata.annotations.${RENOVATE_ANNOTATION_KEEP_UPDATED}`]: catalogClient.CATALOG_FILTER_EXISTS,
|
|
774
|
+
[`metadata.annotations.${catalogModel.ANNOTATION_SOURCE_LOCATION}`]: catalogClient.CATALOG_FILTER_EXISTS
|
|
775
|
+
},
|
|
776
|
+
fields: [
|
|
777
|
+
"kind",
|
|
778
|
+
"metadata.annotations",
|
|
779
|
+
"metadata.name",
|
|
780
|
+
"metadata.namespace",
|
|
781
|
+
"metadata.title"
|
|
782
|
+
]
|
|
783
|
+
},
|
|
784
|
+
{ token }
|
|
785
|
+
);
|
|
786
|
+
for (const entity of entities) {
|
|
787
|
+
renovateRunner.schedule(entity);
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
});
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
async function scheduleCleanupTask(routerOptions) {
|
|
794
|
+
const { scheduler, rootConfig, databaseHandler, logger } = routerOptions;
|
|
795
|
+
const pluginConfig = getPluginConfig(rootConfig);
|
|
796
|
+
const schedule = getScheduleDefinition(pluginConfig, "cleanup");
|
|
797
|
+
const reportsToKeep = pluginConfig.getOptionalNumber("cleanup.minimumReports") ?? -1;
|
|
798
|
+
return scheduler.scheduleTask({
|
|
799
|
+
id: `renovate_report_cleanup`,
|
|
800
|
+
...schedule,
|
|
801
|
+
fn: async () => {
|
|
802
|
+
if (reportsToKeep >= 0) {
|
|
803
|
+
logger.debug("Running report cleanup");
|
|
804
|
+
const modified = await databaseHandler.deleteReports({
|
|
805
|
+
keepLatest: reportsToKeep
|
|
806
|
+
});
|
|
807
|
+
logger.debug(`Report cleanup completed. ${modified} reports deleted`);
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
});
|
|
657
811
|
}
|
|
658
812
|
|
|
659
|
-
const RENOVATE_ANNOTATION_KEEP_UPDATED = "renovate.secustor.dev/keep-updated";
|
|
660
813
|
const renovatePlugin = backendPluginApi.createBackendPlugin({
|
|
661
814
|
pluginId: "renovate",
|
|
662
815
|
register(env) {
|
|
@@ -682,53 +835,15 @@ const renovatePlugin = backendPluginApi.createBackendPlugin({
|
|
|
682
835
|
auth: backendPluginApi.coreServices.auth
|
|
683
836
|
},
|
|
684
837
|
async init(options) {
|
|
685
|
-
const {
|
|
686
|
-
auth,
|
|
687
|
-
database,
|
|
688
|
-
discovery,
|
|
689
|
-
httpRouter,
|
|
690
|
-
rootConfig,
|
|
691
|
-
scheduler,
|
|
692
|
-
logger
|
|
693
|
-
} = options;
|
|
838
|
+
const { database, httpRouter, logger } = options;
|
|
694
839
|
const routerOptions = {
|
|
695
840
|
...options,
|
|
696
841
|
databaseHandler: await DatabaseHandler.create({ database, logger }),
|
|
697
842
|
runtimes
|
|
698
843
|
};
|
|
699
844
|
const renovateRunner = await RenovateRunner.from(routerOptions);
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
const schedule = getScheduleDefinition(pluginConfig, "jobSync");
|
|
703
|
-
await scheduler.scheduleTask({
|
|
704
|
-
id: `renovate_job_sync`,
|
|
705
|
-
...schedule,
|
|
706
|
-
fn: async () => {
|
|
707
|
-
const { token } = await auth.getPluginRequestToken({
|
|
708
|
-
onBehalfOf: await auth.getOwnServiceCredentials(),
|
|
709
|
-
targetPluginId: "catalog"
|
|
710
|
-
});
|
|
711
|
-
const { items: entities } = await client.getEntities(
|
|
712
|
-
{
|
|
713
|
-
filter: {
|
|
714
|
-
[`metadata.annotations.${RENOVATE_ANNOTATION_KEEP_UPDATED}`]: catalogClient.CATALOG_FILTER_EXISTS,
|
|
715
|
-
[`metadata.annotations.${catalogModel.ANNOTATION_SOURCE_LOCATION}`]: catalogClient.CATALOG_FILTER_EXISTS
|
|
716
|
-
},
|
|
717
|
-
fields: [
|
|
718
|
-
"kind",
|
|
719
|
-
"metadata.annotations",
|
|
720
|
-
"metadata.name",
|
|
721
|
-
"metadata.namespace",
|
|
722
|
-
"metadata.title"
|
|
723
|
-
]
|
|
724
|
-
},
|
|
725
|
-
{ token }
|
|
726
|
-
);
|
|
727
|
-
for (const entity of entities) {
|
|
728
|
-
renovateRunner.schedule(entity);
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
});
|
|
845
|
+
await scheduleJobSync(renovateRunner, routerOptions);
|
|
846
|
+
await scheduleCleanupTask(routerOptions);
|
|
732
847
|
httpRouter.use(await createRouter(renovateRunner, routerOptions));
|
|
733
848
|
httpRouter.addAuthPolicy({
|
|
734
849
|
path: "/health",
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -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/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 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 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 '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.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 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 DefaultGitlabCredentialsProvider,\n ScmIntegrations,\n} 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 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 cred = await DefaultGithubCredentialsProvider.fromIntegrations(\n integrations,\n ).getCredentials({ url });\n env.RENOVATE_TOKEN = requireConfigVariable(cred.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 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 { 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-common';\nimport { Knex } from 'knex';\nimport type {\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 { 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","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 {\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);\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","CatalogClient","express","isEntityRef","getTargetRepo","getTaskID","isError","ConflictError","errorHandler","ScmIntegrations","integration","is","DefaultGithubCredentialsProvider","DefaultGitlabCredentialsProvider","readTaskScheduleDefinitionFromConfig","nanoid","resolvePackagePath","createBackendPlugin","renovateRuntimeExtensionPoint","coreServices","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/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 DefaultGitlabCredentialsProvider,\n ScmIntegrations,\n} 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 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 cred = await DefaultGithubCredentialsProvider.fromIntegrations(\n integrations,\n ).getCredentials({ url });\n env.RENOVATE_TOKEN = requireConfigVariable(cred.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 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 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","ScmIntegrations","integration","is","DefaultGithubCredentialsProvider","DefaultGitlabCredentialsProvider","readTaskScheduleDefinitionFromConfig","nanoid","resolvePackagePath","CATALOG_FILTER_EXISTS","ANNOTATION_SOURCE_LOCATION","createBackendPlugin","renovateRuntimeExtensionPoint","coreServices"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,6 +12,9 @@ declare class DatabaseHandler {
|
|
|
12
12
|
private constructor();
|
|
13
13
|
addReport(options: AddReportParameters): Promise<void>;
|
|
14
14
|
getReports(query?: ReportQueryParameters): Promise<RepositoryReportResponse>;
|
|
15
|
+
getTargets(): Promise<ReportTargetQuery[]>;
|
|
16
|
+
deleteReportsByTarget({ host, repository }: ReportTargetQuery, options?: DeleteOptions): Promise<number>;
|
|
17
|
+
deleteReports(options?: DeleteOptions): Promise<number>;
|
|
15
18
|
}
|
|
16
19
|
|
|
17
20
|
interface RouterOptions {
|
|
@@ -23,6 +26,18 @@ interface RouterOptions {
|
|
|
23
26
|
scheduler: SchedulerService;
|
|
24
27
|
discovery: DiscoveryService;
|
|
25
28
|
}
|
|
29
|
+
interface ReportTargetQuery {
|
|
30
|
+
host?: string;
|
|
31
|
+
repository?: string;
|
|
32
|
+
}
|
|
33
|
+
interface DeleteOptions {
|
|
34
|
+
/**
|
|
35
|
+
* If falsely (0, false or undefined) delete all reports
|
|
36
|
+
* If keepLatest is a number keep this number of records.
|
|
37
|
+
* In case it is boolean true, the behaviour is identical to 1
|
|
38
|
+
*/
|
|
39
|
+
keepLatest?: boolean | number;
|
|
40
|
+
}
|
|
26
41
|
interface DatabaseCreationParameters {
|
|
27
42
|
database: DatabaseService;
|
|
28
43
|
logger: LoggerService;
|
|
@@ -67,6 +82,6 @@ declare function createRouter(runner: RenovateRunner, options: RouterOptions): P
|
|
|
67
82
|
*
|
|
68
83
|
* @public
|
|
69
84
|
*/
|
|
70
|
-
declare const renovatePlugin:
|
|
85
|
+
declare const renovatePlugin: _backstage_backend_plugin_api.BackendFeatureCompat;
|
|
71
86
|
|
|
72
87
|
export { createRouter, renovatePlugin as default };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@secustor/backstage-plugin-renovate-backend",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"main": "dist/index.cjs.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -11,7 +11,14 @@
|
|
|
11
11
|
"types": "dist/index.d.ts"
|
|
12
12
|
},
|
|
13
13
|
"backstage": {
|
|
14
|
-
"role": "backend-plugin"
|
|
14
|
+
"role": "backend-plugin",
|
|
15
|
+
"pluginId": "renovate",
|
|
16
|
+
"pluginPackages": [
|
|
17
|
+
"@secustor/backstage-plugin-renovate",
|
|
18
|
+
"@secustor/backstage-plugin-renovate-backend",
|
|
19
|
+
"@secustor/backstage-plugin-renovate-common",
|
|
20
|
+
"@secustor/backstage-plugin-renovate-node"
|
|
21
|
+
]
|
|
15
22
|
},
|
|
16
23
|
"repository": {
|
|
17
24
|
"type": "git",
|
|
@@ -34,22 +41,23 @@
|
|
|
34
41
|
"lint": "backstage-cli package lint",
|
|
35
42
|
"test": "backstage-cli package test",
|
|
36
43
|
"clean": "backstage-cli package clean",
|
|
44
|
+
"fuzz": "backstage-repo-tools package schema openapi fuzz",
|
|
37
45
|
"prepack": "backstage-cli package prepack",
|
|
38
46
|
"postpack": "backstage-cli package postpack"
|
|
39
47
|
},
|
|
40
48
|
"dependencies": {
|
|
41
|
-
"@backstage/backend-common": "^0.
|
|
42
|
-
"@backstage/backend-openapi-utils": "^0.1.
|
|
43
|
-
"@backstage/backend-plugin-api": "^0.6.
|
|
44
|
-
"@backstage/backend-tasks": "^0.5.
|
|
45
|
-
"@backstage/catalog-client": "^1.6.
|
|
46
|
-
"@backstage/catalog-model": "^1.
|
|
49
|
+
"@backstage/backend-common": "^0.23.0",
|
|
50
|
+
"@backstage/backend-openapi-utils": "^0.1.12",
|
|
51
|
+
"@backstage/backend-plugin-api": "^0.6.19",
|
|
52
|
+
"@backstage/backend-tasks": "^0.5.24",
|
|
53
|
+
"@backstage/catalog-client": "^1.6.5",
|
|
54
|
+
"@backstage/catalog-model": "^1.5.0",
|
|
47
55
|
"@backstage/config": "^1.2.0",
|
|
48
56
|
"@backstage/errors": "^1.2.4",
|
|
49
|
-
"@backstage/integration": "^1.
|
|
57
|
+
"@backstage/integration": "^1.12.0",
|
|
50
58
|
"@backstage/types": "^1.1.1",
|
|
51
|
-
"@secustor/backstage-plugin-renovate-common": "^0.
|
|
52
|
-
"@secustor/backstage-plugin-renovate-node": "^0.
|
|
59
|
+
"@secustor/backstage-plugin-renovate-common": "^0.4.0",
|
|
60
|
+
"@secustor/backstage-plugin-renovate-node": "^0.2.0",
|
|
53
61
|
"@sindresorhus/is": "^4.6.0",
|
|
54
62
|
"@types/express": "*",
|
|
55
63
|
"express": "^4.17.1",
|
|
@@ -63,13 +71,13 @@
|
|
|
63
71
|
"zod": "^3.22.4"
|
|
64
72
|
},
|
|
65
73
|
"devDependencies": {
|
|
66
|
-
"@backstage/backend-test-utils": "^0.
|
|
67
|
-
"@backstage/cli": "^0.26.
|
|
68
|
-
"@backstage/repo-tools": "^0.
|
|
69
|
-
"@backstage/test-utils": "1.5.
|
|
74
|
+
"@backstage/backend-test-utils": "^0.4.0",
|
|
75
|
+
"@backstage/cli": "^0.26.7",
|
|
76
|
+
"@backstage/repo-tools": "^0.9.1",
|
|
77
|
+
"@backstage/test-utils": "^1.5.6",
|
|
70
78
|
"@types/supertest": "^6.0.0",
|
|
71
79
|
"msw": "^2.0.0",
|
|
72
|
-
"supertest": "^
|
|
80
|
+
"supertest": "^7.0.0"
|
|
73
81
|
},
|
|
74
82
|
"files": [
|
|
75
83
|
"dist",
|