@secustor/backstage-plugin-renovate-backend 0.7.1 → 0.8.1
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 +20 -0
- package/README.md +7 -0
- package/dist/index.cjs.js +201 -76
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +16 -1
- package/package.json +21 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @secustor/backstage-plugin-renovate-backend
|
|
2
2
|
|
|
3
|
+
## 0.8.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#215](https://github.com/secustor/backstage-plugins/pull/215) [`730a4bd`](https://github.com/secustor/backstage-plugins/commit/730a4bd433dcd8ce40db5b718c4627be24b93c4b) Thanks [@secustor](https://github.com/secustor)! - Fix token retrieval when using a GithubApp
|
|
8
|
+
|
|
9
|
+
## 0.8.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [#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
|
|
14
|
+
|
|
15
|
+
- [`ee838a1`](https://github.com/secustor/backstage-plugins/commit/ee838a1c665a5fff27b1fe68758fb805125d9b95) Thanks [@secustor](https://github.com/secustor)! - Upgrade Backstage to 1.28.0
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- Updated dependencies [[`ee838a1`](https://github.com/secustor/backstage-plugins/commit/ee838a1c665a5fff27b1fe68758fb805125d9b95)]:
|
|
20
|
+
- @secustor/backstage-plugin-renovate-common@0.4.0
|
|
21
|
+
- @secustor/backstage-plugin-renovate-node@0.2.0
|
|
22
|
+
|
|
3
23
|
## 0.7.1
|
|
4
24
|
|
|
5
25
|
### Patch 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) {
|
|
@@ -347,8 +435,14 @@ async function createRouter(runner, options) {
|
|
|
347
435
|
return router;
|
|
348
436
|
}
|
|
349
437
|
|
|
438
|
+
async function getGithubToken(integrations, url) {
|
|
439
|
+
const cred = await integration.DefaultGithubCredentialsProvider.fromIntegrations(
|
|
440
|
+
integrations
|
|
441
|
+
).getCredentials({ url });
|
|
442
|
+
return cred.token;
|
|
443
|
+
}
|
|
444
|
+
|
|
350
445
|
async function getPlatformEnvs(target, context) {
|
|
351
|
-
var _a, _b, _c;
|
|
352
446
|
const { rootConfig, logger } = context;
|
|
353
447
|
const env = {};
|
|
354
448
|
const integrations = integration.ScmIntegrations.fromConfig(rootConfig);
|
|
@@ -363,10 +457,8 @@ async function getPlatformEnvs(target, context) {
|
|
|
363
457
|
switch (integration$1.type) {
|
|
364
458
|
case "github": {
|
|
365
459
|
env.RENOVATE_PLATFORM = integration$1.type;
|
|
366
|
-
const
|
|
367
|
-
|
|
368
|
-
).getCredentials({ url });
|
|
369
|
-
env.RENOVATE_TOKEN = requireConfigVariable(cred.token, errMsg);
|
|
460
|
+
const token = await getGithubToken(integrations, url);
|
|
461
|
+
env.RENOVATE_TOKEN = requireConfigVariable(token, errMsg);
|
|
370
462
|
env.RENOVATE_REPOSITORIES = target.repository;
|
|
371
463
|
break;
|
|
372
464
|
}
|
|
@@ -376,11 +468,11 @@ async function getPlatformEnvs(target, context) {
|
|
|
376
468
|
integrations
|
|
377
469
|
).getCredentials({ url });
|
|
378
470
|
const gitLabIntegrationConfig = requireConfigVariable(
|
|
379
|
-
|
|
471
|
+
integrations.gitlab.byHost(target.host)?.config,
|
|
380
472
|
errMsg
|
|
381
473
|
);
|
|
382
474
|
env.RENOVATE_PLATFORM = integration$1.type;
|
|
383
|
-
env.RENOVATE_ENDPOINT =
|
|
475
|
+
env.RENOVATE_ENDPOINT = gitLabIntegrationConfig.apiBaseUrl ?? `https://${target.host}/api/v4`;
|
|
384
476
|
env.RENOVATE_TOKEN = requireConfigVariable(cred.token, errMsg);
|
|
385
477
|
env.RENOVATE_REPOSITORIES = target.repository;
|
|
386
478
|
}
|
|
@@ -388,14 +480,19 @@ async function getPlatformEnvs(target, context) {
|
|
|
388
480
|
default:
|
|
389
481
|
throw new Error(`Unsupported platform type ${integration$1.type}`);
|
|
390
482
|
}
|
|
391
|
-
const
|
|
483
|
+
const githubComURL = "https://github.com";
|
|
484
|
+
const githubComIntegration = integrations.github.byUrl(githubComURL);
|
|
392
485
|
if (is__default.default.nullOrUndefined(githubComIntegration)) {
|
|
393
486
|
logger.warn(`No Github.com integration has been found`);
|
|
394
487
|
} else {
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
488
|
+
const githubComToken = await getGithubToken(integrations, githubComURL);
|
|
489
|
+
if (githubComToken) {
|
|
490
|
+
env.RENOVATE_GITHUB_COM = githubComToken;
|
|
491
|
+
} else {
|
|
492
|
+
logger.warn(
|
|
493
|
+
`Could not get token for Github.com token in the defined integrations`
|
|
494
|
+
);
|
|
495
|
+
}
|
|
399
496
|
}
|
|
400
497
|
return env;
|
|
401
498
|
}
|
|
@@ -406,12 +503,13 @@ function requireConfigVariable(input, errMessage) {
|
|
|
406
503
|
return input;
|
|
407
504
|
}
|
|
408
505
|
|
|
506
|
+
const RENOVATE_ANNOTATION_KEEP_UPDATED = "renovate.secustor.dev/keep-updated";
|
|
409
507
|
function getPluginConfig(rootConfig) {
|
|
410
508
|
return rootConfig.getConfig("renovate");
|
|
411
509
|
}
|
|
412
510
|
function getRenovateConfig(rootConfig) {
|
|
413
511
|
const value = getPluginConfig(rootConfig).getOptional("config");
|
|
414
|
-
return value
|
|
512
|
+
return value ?? null;
|
|
415
513
|
}
|
|
416
514
|
function getRuntimeConfigs(rootConfig) {
|
|
417
515
|
const runtimeConfig = getPluginConfig(rootConfig).getConfig("runtime");
|
|
@@ -439,10 +537,9 @@ async function extractReport(opts) {
|
|
|
439
537
|
return new Promise((resolve) => {
|
|
440
538
|
let uncompletedText = "";
|
|
441
539
|
logStream.on("data", (chunk) => {
|
|
442
|
-
var _a;
|
|
443
540
|
const text = uncompletedText.concat(chunk.toString());
|
|
444
541
|
const logLines = text.split("\n");
|
|
445
|
-
uncompletedText =
|
|
542
|
+
uncompletedText = logLines.pop() ?? "";
|
|
446
543
|
for (const logLine of logLines) {
|
|
447
544
|
const log = JSON.parse(logLine);
|
|
448
545
|
if (log.report) {
|
|
@@ -458,8 +555,7 @@ async function extractReport(opts) {
|
|
|
458
555
|
});
|
|
459
556
|
}
|
|
460
557
|
function getCacheEnvs(config, logger) {
|
|
461
|
-
|
|
462
|
-
const cacheEnabled = (_a = getPluginConfig(config).getOptionalBoolean("cache.enabled")) != null ? _a : true;
|
|
558
|
+
const cacheEnabled = getPluginConfig(config).getOptionalBoolean("cache.enabled") ?? true;
|
|
463
559
|
if (!cacheEnabled) {
|
|
464
560
|
logger.debug("Cache has been disabled in plugin configuration");
|
|
465
561
|
return {};
|
|
@@ -486,19 +582,13 @@ function getCacheEnvs(config, logger) {
|
|
|
486
582
|
};
|
|
487
583
|
}
|
|
488
584
|
|
|
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
585
|
class RenovateRunner {
|
|
586
|
+
scheduler;
|
|
587
|
+
rootConfig;
|
|
588
|
+
databaseHandler;
|
|
589
|
+
logger;
|
|
590
|
+
runtimes;
|
|
496
591
|
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
592
|
this.databaseHandler = databaseHandler;
|
|
503
593
|
this.rootConfig = rootConfig;
|
|
504
594
|
this.logger = logger;
|
|
@@ -599,7 +689,7 @@ class RenovateRunner {
|
|
|
599
689
|
}
|
|
600
690
|
}
|
|
601
691
|
|
|
602
|
-
const migrationsDir =
|
|
692
|
+
const migrationsDir = backendPluginApi.resolvePackagePath(
|
|
603
693
|
"@secustor/backstage-plugin-renovate-backend",
|
|
604
694
|
"migrations"
|
|
605
695
|
);
|
|
@@ -609,10 +699,9 @@ class DatabaseHandler {
|
|
|
609
699
|
this.logger = logger;
|
|
610
700
|
}
|
|
611
701
|
static async create(options) {
|
|
612
|
-
var _a;
|
|
613
702
|
const { database, logger } = options;
|
|
614
703
|
const client = await database.getClient();
|
|
615
|
-
if (!
|
|
704
|
+
if (!database.migrations?.skip) {
|
|
616
705
|
await client.migrate.latest({
|
|
617
706
|
directory: migrationsDir
|
|
618
707
|
});
|
|
@@ -620,9 +709,8 @@ class DatabaseHandler {
|
|
|
620
709
|
return new DatabaseHandler(client, logger);
|
|
621
710
|
}
|
|
622
711
|
async addReport(options) {
|
|
623
|
-
var _a;
|
|
624
712
|
const { runID, taskID, report, target } = options;
|
|
625
|
-
const logger =
|
|
713
|
+
const logger = options.logger ?? this.logger;
|
|
626
714
|
const inserts = [];
|
|
627
715
|
for (const [repository, value] of Object.entries(report.repositories)) {
|
|
628
716
|
inserts.push({
|
|
@@ -654,9 +742,84 @@ class DatabaseHandler {
|
|
|
654
742
|
};
|
|
655
743
|
});
|
|
656
744
|
}
|
|
745
|
+
async getTargets() {
|
|
746
|
+
return this.client.select().distinct("host", "repository").from("reports");
|
|
747
|
+
}
|
|
748
|
+
async deleteReportsByTarget({ host, repository }, options) {
|
|
749
|
+
let offset = 0;
|
|
750
|
+
if (is__default.default.nullOrUndefined(options?.keepLatest) || is__default.default.boolean(options?.keepLatest)) {
|
|
751
|
+
offset = options?.keepLatest ? 1 : 0;
|
|
752
|
+
} else {
|
|
753
|
+
offset = options.keepLatest;
|
|
754
|
+
}
|
|
755
|
+
const toBeDeletedIDs = this.client("reports").select("run_id").where("host", host).andWhere("repository", repository).orderBy("timestamp", "DESC").offset(offset);
|
|
756
|
+
return this.client("reports").delete().whereIn("run_id", [toBeDeletedIDs]);
|
|
757
|
+
}
|
|
758
|
+
async deleteReports(options) {
|
|
759
|
+
const targets = await this.getTargets();
|
|
760
|
+
const modified = await Promise.all(
|
|
761
|
+
targets.map((target) => this.deleteReportsByTarget(target, options))
|
|
762
|
+
);
|
|
763
|
+
return modified.reduce((a, b) => a + b, 0);
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
async function scheduleJobSync(renovateRunner, routerOptions) {
|
|
768
|
+
const { scheduler, auth, rootConfig, discovery } = routerOptions;
|
|
769
|
+
const client = new catalogClient.CatalogClient({ discoveryApi: discovery });
|
|
770
|
+
const pluginConfig = getPluginConfig(rootConfig);
|
|
771
|
+
const schedule = getScheduleDefinition(pluginConfig, "jobSync");
|
|
772
|
+
return scheduler.scheduleTask({
|
|
773
|
+
id: `renovate_job_sync`,
|
|
774
|
+
...schedule,
|
|
775
|
+
fn: async () => {
|
|
776
|
+
const { token } = await auth.getPluginRequestToken({
|
|
777
|
+
onBehalfOf: await auth.getOwnServiceCredentials(),
|
|
778
|
+
targetPluginId: "catalog"
|
|
779
|
+
});
|
|
780
|
+
const { items: entities } = await client.getEntities(
|
|
781
|
+
{
|
|
782
|
+
filter: {
|
|
783
|
+
[`metadata.annotations.${RENOVATE_ANNOTATION_KEEP_UPDATED}`]: catalogClient.CATALOG_FILTER_EXISTS,
|
|
784
|
+
[`metadata.annotations.${catalogModel.ANNOTATION_SOURCE_LOCATION}`]: catalogClient.CATALOG_FILTER_EXISTS
|
|
785
|
+
},
|
|
786
|
+
fields: [
|
|
787
|
+
"kind",
|
|
788
|
+
"metadata.annotations",
|
|
789
|
+
"metadata.name",
|
|
790
|
+
"metadata.namespace",
|
|
791
|
+
"metadata.title"
|
|
792
|
+
]
|
|
793
|
+
},
|
|
794
|
+
{ token }
|
|
795
|
+
);
|
|
796
|
+
for (const entity of entities) {
|
|
797
|
+
renovateRunner.schedule(entity);
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
});
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
async function scheduleCleanupTask(routerOptions) {
|
|
804
|
+
const { scheduler, rootConfig, databaseHandler, logger } = routerOptions;
|
|
805
|
+
const pluginConfig = getPluginConfig(rootConfig);
|
|
806
|
+
const schedule = getScheduleDefinition(pluginConfig, "cleanup");
|
|
807
|
+
const reportsToKeep = pluginConfig.getOptionalNumber("cleanup.minimumReports") ?? -1;
|
|
808
|
+
return scheduler.scheduleTask({
|
|
809
|
+
id: `renovate_report_cleanup`,
|
|
810
|
+
...schedule,
|
|
811
|
+
fn: async () => {
|
|
812
|
+
if (reportsToKeep >= 0) {
|
|
813
|
+
logger.debug("Running report cleanup");
|
|
814
|
+
const modified = await databaseHandler.deleteReports({
|
|
815
|
+
keepLatest: reportsToKeep
|
|
816
|
+
});
|
|
817
|
+
logger.debug(`Report cleanup completed. ${modified} reports deleted`);
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
});
|
|
657
821
|
}
|
|
658
822
|
|
|
659
|
-
const RENOVATE_ANNOTATION_KEEP_UPDATED = "renovate.secustor.dev/keep-updated";
|
|
660
823
|
const renovatePlugin = backendPluginApi.createBackendPlugin({
|
|
661
824
|
pluginId: "renovate",
|
|
662
825
|
register(env) {
|
|
@@ -682,53 +845,15 @@ const renovatePlugin = backendPluginApi.createBackendPlugin({
|
|
|
682
845
|
auth: backendPluginApi.coreServices.auth
|
|
683
846
|
},
|
|
684
847
|
async init(options) {
|
|
685
|
-
const {
|
|
686
|
-
auth,
|
|
687
|
-
database,
|
|
688
|
-
discovery,
|
|
689
|
-
httpRouter,
|
|
690
|
-
rootConfig,
|
|
691
|
-
scheduler,
|
|
692
|
-
logger
|
|
693
|
-
} = options;
|
|
848
|
+
const { database, httpRouter, logger } = options;
|
|
694
849
|
const routerOptions = {
|
|
695
850
|
...options,
|
|
696
851
|
databaseHandler: await DatabaseHandler.create({ database, logger }),
|
|
697
852
|
runtimes
|
|
698
853
|
};
|
|
699
854
|
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
|
-
});
|
|
855
|
+
await scheduleJobSync(renovateRunner, routerOptions);
|
|
856
|
+
await scheduleCleanupTask(routerOptions);
|
|
732
857
|
httpRouter.use(await createRouter(renovateRunner, routerOptions));
|
|
733
858
|
httpRouter.addAuthPolicy({
|
|
734
859
|
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/github.ts","../src/wrapper/platforms/index.ts","../src/config/index.ts","../src/wrapper/utils.ts","../src/wrapper/index.ts","../src/service/databaseHandler.ts","../src/service/jobSync.ts","../src/service/cleanupTask.ts","../src/plugin.ts"],"sourcesContent":["//\n\n// ******************************************************************\n// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. *\n// ******************************************************************\nimport { createValidatedOpenApiRouter } from '@backstage/backend-openapi-utils';\n\nexport const spec = {\n openapi: '3.0.0',\n info: {\n title: 'renovate',\n description: 'Backstage Renovate API',\n version: '0.1.0',\n },\n servers: [\n {\n description: 'local test setup',\n url: 'http://localhost:7007',\n },\n ],\n paths: {\n '/health': {\n get: {\n summary: 'Get health status of the plugin',\n responses: {\n '200': {\n description: 'health status is green',\n content: {\n 'application/json': {\n schema: {\n type: 'string',\n example: 'ok',\n },\n },\n },\n },\n },\n },\n },\n '/reports': {\n get: {\n summary: 'Get all reports',\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/reports/{host}': {\n get: {\n summary: 'Get reports for host',\n parameters: [\n {\n name: 'host',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'github.com',\n },\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n '404': {\n description: 'unknown host',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/reports/{host}/{repository}': {\n get: {\n summary: 'Get reports for repository',\n parameters: [\n {\n name: 'host',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'github.com',\n },\n },\n {\n name: 'repository',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'myOrg/myRepository',\n },\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n '404': {\n description: 'unknown repository',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/runs': {\n post: {\n summary: 'Start or get Renovate runs',\n requestBody: {\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['target'],\n properties: {\n target: {\n $ref: '#/components/schemas/target',\n },\n },\n },\n },\n },\n },\n responses: {\n '202': {\n description: 'Run has been scheduled',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n taskID: {\n description: 'id of the scheduler task',\n type: 'string',\n example: '9-d_CO9JlaEmd-OM9QfkI',\n },\n },\n },\n },\n },\n },\n '400': {\n description: 'Unexpected incoming data',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n error: {\n $ref: '#/components/schemas/error',\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n components: {\n parameters: {\n keepLatest: {\n name: 'keepLatest',\n description: 'how many reports of all targets should be kept',\n in: 'query',\n required: false,\n example: 3,\n schema: {\n type: 'number',\n },\n },\n },\n responses: {\n 'deleted-successful': {\n description: 'Successful deleted',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n deleted: {\n type: 'number',\n example: 15,\n description: 'Numbers of reports deleted',\n },\n },\n },\n },\n },\n },\n reports: {\n description: 'Returns reports',\n content: {\n 'application/json': {\n schema: {\n type: 'array',\n items: {\n type: 'object',\n additionalProperties: false,\n required: [\n 'taskID',\n 'repository',\n 'host',\n 'timestamp',\n 'report',\n ],\n properties: {\n taskID: {\n type: 'string',\n },\n timestamp: {\n type: 'string',\n format: 'date-time',\n },\n host: {\n type: 'string',\n },\n repository: {\n type: 'string',\n },\n report: {\n $ref: '#/components/schemas/repositoryReport',\n },\n },\n },\n },\n },\n },\n },\n },\n schemas: {\n error: {\n anyOf: [\n {\n type: 'object',\n example: {\n message: \"I'm an error\",\n code: 1111,\n },\n },\n {\n type: 'string',\n example: \"I'm an error\",\n },\n ],\n },\n target: {\n anyOf: [\n {\n type: 'string',\n description: 'URL to an repository',\n example: 'https://github.com/secustor/renovate-test',\n },\n {\n type: 'string',\n description:\n 'stringified Entity with SourceLocation URL annotation',\n example: 'component:default/backstage-plugins-example',\n },\n ],\n },\n repositoryReportList: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/repositoryReport',\n },\n },\n repositoryReport: {\n description: 'report for a specific repository',\n type: 'object',\n additionalProperties: false,\n required: ['branches', 'packageFiles', 'problems'],\n properties: {\n branches: {\n type: 'array',\n items: {\n type: 'object',\n },\n },\n packageFiles: {\n type: 'object',\n },\n problems: {\n type: 'array',\n items: {\n type: 'object',\n },\n },\n },\n },\n },\n },\n} as const;\nexport const createOpenApiRouter = async (\n options?: Parameters<typeof createValidatedOpenApiRouter>['1'],\n) => createValidatedOpenApiRouter<typeof spec>(spec, options);\n","import { z } from 'zod';\n\nexport const target = z.string();\n\nexport const runRequestBody = z.object({\n target,\n});\n","import { errorHandler } from '@backstage/backend-common';\nimport express from 'express';\nimport { createOpenApiRouter } from '../schema/openapi.generated';\nimport { runRequestBody } from './schema';\nimport type { RouterOptions } from './types';\nimport {\n getTargetRepo,\n getTaskID,\n isEntityRef,\n} from '@secustor/backstage-plugin-renovate-common';\nimport { RenovateRunner } from '../wrapper';\nimport { ConflictError, isError } from '@backstage/errors';\nimport { CatalogClient } from '@backstage/catalog-client';\nimport type { Entity } from '@backstage/catalog-model';\n\nexport async function createRouter(\n runner: RenovateRunner,\n options: RouterOptions,\n): Promise<express.Router> {\n const { auth, logger, databaseHandler, discovery } = options;\n\n const client = new CatalogClient({ discoveryApi: discovery });\n\n const router = await createOpenApiRouter();\n router.use(express.json());\n\n router.get('/health', (_, response) => {\n logger.debug('healthcheck request');\n response.json('ok');\n });\n\n router.get('/reports', async (_request, response) => {\n const reports = await databaseHandler.getReports();\n response.status(200).json(reports);\n });\n\n router.delete('/reports', async (request, response) => {\n const modified = await databaseHandler.deleteReports({\n keepLatest: request.query.keepLatest,\n });\n response.status(200).json({ modified });\n });\n\n router.get('/reports/:host', async (request, response) => {\n const reports = await databaseHandler.getReports({\n ...request.params,\n });\n response.status(200).json(reports);\n });\n\n router.delete('/reports/:host', async (request, response) => {\n const modified = await databaseHandler.deleteReportsByTarget(\n request.params,\n { keepLatest: request.query.keepLatest },\n );\n response.status(200).json({ modified });\n });\n\n router.get('/reports/:host/:repository', async (request, response) => {\n const reports = await databaseHandler.getReports({\n ...request.params,\n });\n response.status(200).json(reports);\n });\n\n router.delete('/reports/:host/:repository', async (request, response) => {\n const modified = await databaseHandler.deleteReportsByTarget(\n request.params,\n { keepLatest: request.query.keepLatest },\n );\n response.status(200).json({ modified });\n });\n\n router.post('/runs', async (request, response) => {\n const body = runRequestBody.safeParse(request.body);\n if (!body.success) {\n response.status(400).json({ error: body.error });\n return;\n }\n let target: string | Entity = body.data.target;\n\n // check if we got an entity ref and if yes get the entity\n if (isEntityRef(target)) {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n const result = await client.getEntityByRef(target, { token });\n if (result) {\n target = result;\n }\n }\n\n // trigger Renovate run\n const targetRepo = getTargetRepo(target);\n const id = getTaskID(targetRepo);\n try {\n await runner.trigger(targetRepo);\n response.status(202).json({ runID: id });\n } catch (e) {\n if (isError(e) && ConflictError.name === e.name) {\n logger.debug('Task already running', { taskID: id });\n response.status(423).json({ error: e });\n } else {\n response.status(400).json({ error: e });\n }\n }\n });\n router.use(errorHandler());\n return router;\n}\n","import {\n DefaultGithubCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\n\nexport async function getGithubToken(\n integrations: ScmIntegrations,\n url: string,\n): Promise<string | undefined> {\n const cred = await DefaultGithubCredentialsProvider.fromIntegrations(\n integrations,\n ).getCredentials({ url });\n return cred.token;\n}\n","import {\n DefaultGitlabCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\nimport is from '@sindresorhus/is';\nimport { PlatformEnvsOptions } from './types';\nimport { TargetRepo } from '@secustor/backstage-plugin-renovate-common';\nimport { getGithubToken } from './github';\n\n/*\n Returns record of Renovate environment variables specific for the platform of targetUrl\n */\nexport async function getPlatformEnvs(\n target: TargetRepo,\n context: PlatformEnvsOptions,\n): Promise<Record<string, string>> {\n const { rootConfig, logger } = context;\n\n const env: Record<string, string> = {};\n // add Renovate platform and tokens\n const integrations = ScmIntegrations.fromConfig(rootConfig);\n const integration = integrations.byHost(target.host);\n if (is.nullOrUndefined(integration)) {\n throw new Error(\n `Could not identify platform for target ${target.host}/${target.repository}`,\n );\n }\n\n const errMsg = `No credentials could be found for url and '${integration.type}' type for host ${target.host}`;\n const url = `https://${target.host}/${target.repository}`;\n switch (integration.type) {\n case 'github': {\n env.RENOVATE_PLATFORM = integration.type;\n const token = await getGithubToken(integrations, url);\n env.RENOVATE_TOKEN = requireConfigVariable(token, errMsg);\n env.RENOVATE_REPOSITORIES = target.repository;\n break;\n }\n case 'gitlab':\n {\n const cred = await DefaultGitlabCredentialsProvider.fromIntegrations(\n integrations,\n ).getCredentials({ url });\n const gitLabIntegrationConfig = requireConfigVariable(\n integrations.gitlab.byHost(target.host)?.config,\n errMsg,\n );\n env.RENOVATE_PLATFORM = integration.type;\n env.RENOVATE_ENDPOINT =\n gitLabIntegrationConfig.apiBaseUrl ?? `https://${target.host}/api/v4`;\n env.RENOVATE_TOKEN = requireConfigVariable(cred.token, errMsg);\n env.RENOVATE_REPOSITORIES = target.repository;\n }\n break;\n default:\n throw new Error(`Unsupported platform type ${integration.type}`);\n }\n\n const githubComURL = 'https://github.com';\n const githubComIntegration = integrations.github.byUrl(githubComURL);\n if (is.nullOrUndefined(githubComIntegration)) {\n logger.warn(`No Github.com integration has been found`);\n } else {\n const githubComToken = await getGithubToken(integrations, githubComURL);\n if (githubComToken) {\n env.RENOVATE_GITHUB_COM = githubComToken;\n } else {\n logger.warn(\n `Could not get token for Github.com token in the defined integrations`,\n );\n }\n }\n\n return env;\n}\n\nfunction requireConfigVariable<T>(\n input: T | undefined | null,\n errMessage: string,\n): T {\n if (is.nullOrUndefined(input)) {\n throw new Error(errMessage);\n }\n return input;\n}\n","import { Config } from '@backstage/config';\nimport {\n readTaskScheduleDefinitionFromConfig,\n TaskScheduleDefinition,\n} from '@backstage/backend-tasks';\nimport { JsonValue } from '@backstage/types';\n\nexport const RENOVATE_ANNOTATION_KEEP_UPDATED =\n 'renovate.secustor.dev/keep-updated';\n\nexport function getPluginConfig(rootConfig: Config): Config {\n return rootConfig.getConfig('renovate');\n}\n\nexport function getRenovateConfig(rootConfig: Config): JsonValue {\n const value = getPluginConfig(rootConfig).getOptional('config');\n return value ?? null;\n}\n\nexport function getRuntimeConfigs(rootConfig: Config): {\n runtime: string;\n config: Config | null;\n} {\n const runtimeConfig = getPluginConfig(rootConfig).getConfig('runtime');\n const runtime = runtimeConfig.getString('type');\n return {\n runtime,\n config: runtimeConfig.getConfig(runtime),\n };\n}\n\nexport function getScheduleDefinition(\n pluginConfig: Config,\n variant: 'jobSync' | 'renovation' | 'cleanup',\n): TaskScheduleDefinition {\n try {\n const scheduleConfig = pluginConfig.getConfig(`schedules.${variant}`);\n return readTaskScheduleDefinitionFromConfig(scheduleConfig);\n } catch (e) {\n return {\n scope: 'global',\n timeout: { minutes: 60 },\n frequency: { minutes: 60 },\n };\n }\n}\n","import { RenovateReport } from '@secustor/backstage-plugin-renovate-common';\nimport { ExtractReportOptions } from './types';\nimport { Config } from '@backstage/config';\nimport is from '@sindresorhus/is';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { getPluginConfig } from '../config';\n\nexport async function extractReport(\n opts: ExtractReportOptions,\n): Promise<RenovateReport> {\n const { logStream, logger } = opts;\n return new Promise(resolve => {\n let uncompletedText = '';\n logStream.on('data', (chunk: Buffer) => {\n const text = uncompletedText.concat(chunk.toString());\n const logLines = text.split('\\n');\n\n // if the last element is an empty string, then we have a complete json line so we reset it.\n // else we save it to\n uncompletedText = logLines.pop() ?? '';\n\n for (const logLine of logLines) {\n const log = JSON.parse(logLine);\n if (log.report) {\n // TODO use schema and reject if report does not fit expectation\n const report = log.report as RenovateReport;\n // do not forward the report to logging\n resolve(report);\n }\n const msg = log.msg;\n delete log.msg;\n // delete logContext as it is the same as runID\n delete log.logContext;\n logger.debug(msg, log);\n }\n });\n });\n}\n\nexport function getCacheEnvs(\n config: Config,\n logger: LoggerService,\n): Record<string, string> {\n const cacheEnabled =\n getPluginConfig(config).getOptionalBoolean('cache.enabled') ?? true;\n if (!cacheEnabled) {\n logger.debug('Cache has been disabled in plugin configuration');\n return {};\n }\n\n const cacheConfig = config.getOptionalConfig('backend.cache');\n if (is.nullOrUndefined(cacheConfig)) {\n logger.debug('No cache configured');\n return {};\n }\n\n const store = cacheConfig.getString('store');\n if (store !== 'redis') {\n logger.debug(`Unsupported cache store '${store}' detected`);\n return {};\n }\n\n const connection = cacheConfig.getOptionalString('connection');\n if (is.nullOrUndefined(connection)) {\n logger.debug('No connection string for redis cache configured in backend');\n return {};\n }\n\n logger.debug('Injecting Redis cache into Renovate');\n return {\n RENOVATE_REDIS_PREFIX: 'renovate_',\n RENOVATE_REDIS_URL: connection,\n };\n}\n","/***/\n/**\n * Node.js library for the renovate-wrapper plugin.\n *\n * @packageDocumentation\n */\n\nimport is from '@sindresorhus/is';\nimport { getPlatformEnvs } from './platforms';\nimport { RouterOptions } from '../service/types';\nimport { extractReport, getCacheEnvs } from './utils';\nimport {\n getTargetRepo,\n getTaskID,\n RenovateReport,\n RenovateWrapper,\n TargetRepo,\n} from '@secustor/backstage-plugin-renovate-common';\nimport { Config } from '@backstage/config';\nimport { LoggerService, SchedulerService } from '@backstage/backend-plugin-api';\nimport {\n getPluginConfig,\n getRenovateConfig,\n getRuntimeConfigs,\n getScheduleDefinition,\n} from '../config';\nimport { DatabaseHandler } from '../service/databaseHandler';\nimport { RunOptions } from './types';\nimport { isError } from '@backstage/errors';\nimport { Entity } from '@backstage/catalog-model';\nimport { nanoid } from 'nanoid';\n\nexport class RenovateRunner {\n private scheduler: SchedulerService;\n private readonly rootConfig: Config;\n private databaseHandler: DatabaseHandler;\n private logger: LoggerService;\n private runtimes: Map<string, RenovateWrapper>;\n\n constructor(\n databaseHandler: DatabaseHandler,\n rootConfig: Config,\n logger: LoggerService,\n runtimes: Map<string, RenovateWrapper>,\n scheduler: SchedulerService,\n ) {\n this.databaseHandler = databaseHandler;\n this.rootConfig = rootConfig;\n this.logger = logger;\n this.runtimes = runtimes;\n this.scheduler = scheduler;\n }\n\n static async from(options: RouterOptions): Promise<RenovateRunner> {\n const { databaseHandler, rootConfig, runtimes, logger, scheduler } =\n options;\n\n return new RenovateRunner(\n databaseHandler,\n rootConfig,\n logger,\n runtimes,\n scheduler,\n );\n }\n\n private async renovate(\n runID: string,\n target: TargetRepo,\n { logger }: RunOptions,\n ): Promise<RenovateReport> {\n const { runtime, config: runtimeConfig } = getRuntimeConfigs(\n this.rootConfig,\n );\n const wrapperRuntime = this.runtimes.get(runtime);\n if (is.nullOrUndefined(wrapperRuntime)) {\n throw new Error(`Unknown runtime type '${runtime}'`);\n }\n\n const env: Record<string, string> = {\n // setup logging\n LOG_FORMAT: 'json',\n LOG_LEVEL: 'debug',\n LOG_CONTEXT: runID,\n RENOVATE_REPORT_TYPE: 'logging',\n // setup platform specifics\n ...(await getPlatformEnvs(target, {\n logger,\n rootConfig: this.rootConfig,\n })),\n ...getCacheEnvs(this.rootConfig, logger),\n };\n\n // read out renovate.config and write out to json file for consumption by Renovate\n // we are reading it at this place to allow dynamic configuration changes\n const renovateConfig = getRenovateConfig(this.rootConfig);\n\n const promise = wrapperRuntime.run({\n runID,\n env,\n renovateConfig,\n runtimeConfig,\n });\n\n return await promise.then(result => {\n return extractReport({\n logger,\n logStream: result.stdout,\n });\n });\n }\n\n async run(id: string, target: TargetRepo): Promise<void> {\n const runID = nanoid();\n const logger = this.logger.child({ runID, taskID: id, ...target });\n try {\n logger.info('Renovate run starting');\n const report = await this.renovate(id, target, { logger });\n await this.databaseHandler.addReport({\n runID,\n taskID: id,\n report,\n target,\n logger,\n });\n logger.info('Renovate run successfully finished');\n } catch (e) {\n logger.error('Renovate failed', isError(e) ? e : {});\n }\n }\n\n async trigger(target: string | Entity | TargetRepo): Promise<void> {\n const id = getTaskID(target);\n const childLogger = this.logger.child({ taskID: id });\n\n // ensure there is runner scheduled\n await this.schedule(target);\n\n childLogger.debug('Triggering task');\n try {\n await this.scheduler.triggerTask(id);\n } catch (e) {\n childLogger.debug('Triggering task has failed', isError(e) ? e : {});\n throw e;\n }\n }\n\n async schedule(target: string | Entity | TargetRepo): Promise<void> {\n const id = getTaskID(target);\n const childLogger = this.logger.child({ taskID: id });\n const targetRepo = getTargetRepo(target);\n\n // if the task is not locally scheduled do so, else only trigger it\n const schedules = await this.scheduler.getScheduledTasks();\n if (!schedules.some(task => task.id === id)) {\n childLogger.debug('Scheduling task');\n await this.scheduler.scheduleTask({\n id,\n fn: () => this.run(id, targetRepo),\n ...getScheduleDefinition(\n getPluginConfig(this.rootConfig),\n 'renovation',\n ),\n });\n }\n }\n}\n","import { resolvePackagePath } from '@backstage/backend-plugin-api';\nimport { Knex } from 'knex';\nimport type {\n AddReportParameters,\n DatabaseCreationParameters,\n DeleteOptions,\n ReportQueryParameters,\n ReportsRow,\n ReportTargetQuery,\n} from './types';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport is from '@sindresorhus/is';\nimport { RepositoryReportResponse } from '@secustor/backstage-plugin-renovate-common';\n\nconst migrationsDir = resolvePackagePath(\n '@secustor/backstage-plugin-renovate-backend',\n 'migrations',\n);\n\nexport class DatabaseHandler {\n static async create(\n options: DatabaseCreationParameters,\n ): Promise<DatabaseHandler> {\n const { database, logger } = options;\n const client = await database.getClient();\n\n if (!database.migrations?.skip) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new DatabaseHandler(client, logger);\n }\n\n private constructor(\n private client: Knex,\n private logger: LoggerService,\n ) {}\n\n async addReport(options: AddReportParameters): Promise<void> {\n const { runID, taskID, report, target } = options;\n const logger = options.logger ?? this.logger;\n\n const inserts: ReportsRow[] = [];\n for (const [repository, value] of Object.entries(report.repositories)) {\n inserts.push({\n run_id: runID,\n task_id: taskID,\n timestamp: new Date(),\n host: target.host,\n repository,\n report: value,\n });\n }\n // this.client.batchInsert<ReportsRow>('reports', inserts);\n await this.client('reports')\n .insert(inserts)\n .catch(reason => logger.error('Failed insert data', reason));\n }\n\n async getReports(\n query?: ReportQueryParameters,\n ): Promise<RepositoryReportResponse> {\n const builder = this.client.select<ReportsRow[]>();\n if (query) {\n builder.where(query);\n }\n const rows = await builder.from<ReportsRow[]>('reports');\n return rows.map(row => {\n return {\n runID: row.run_id,\n taskID: row.task_id,\n timestamp: row.timestamp.toISOString(),\n host: row.host,\n repository: row.repository,\n // if the JSON field has not been auto-parsed do it manually\n report: is.string(row.report) ? JSON.parse(row.report) : row.report,\n };\n });\n }\n\n async getTargets(): Promise<ReportTargetQuery[]> {\n return this.client\n .select()\n .distinct<ReportsRow[]>('host', 'repository')\n .from('reports');\n }\n\n async deleteReportsByTarget(\n { host, repository }: ReportTargetQuery,\n options?: DeleteOptions,\n ): Promise<number> {\n let offset = 0;\n if (\n is.nullOrUndefined(options?.keepLatest) ||\n is.boolean(options?.keepLatest)\n ) {\n offset = options?.keepLatest ? 1 : 0;\n } else {\n offset = options.keepLatest;\n }\n const toBeDeletedIDs = this.client('reports')\n .select('run_id')\n .where('host', host)\n .andWhere('repository', repository)\n .orderBy('timestamp', 'DESC')\n .offset(offset);\n\n return this.client('reports').delete().whereIn('run_id', [toBeDeletedIDs]);\n }\n\n async deleteReports(options?: DeleteOptions): Promise<number> {\n const targets = await this.getTargets();\n const modified = await Promise.all(\n targets.map(target => this.deleteReportsByTarget(target, options)),\n );\n // sum up\n return modified.reduce((a, b) => a + b, 0);\n }\n}\n","import {\n CATALOG_FILTER_EXISTS,\n CatalogClient,\n} from '@backstage/catalog-client';\nimport { ANNOTATION_SOURCE_LOCATION } from '@backstage/catalog-model';\nimport { RouterOptions } from './types';\nimport {\n getPluginConfig,\n getScheduleDefinition,\n RENOVATE_ANNOTATION_KEEP_UPDATED,\n} from '../config';\nimport { RenovateRunner } from '../wrapper';\n\nexport async function scheduleJobSync(\n renovateRunner: RenovateRunner,\n routerOptions: RouterOptions,\n): Promise<void> {\n const { scheduler, auth, rootConfig, discovery } = routerOptions;\n\n const client = new CatalogClient({ discoveryApi: discovery });\n\n const pluginConfig = getPluginConfig(rootConfig);\n const schedule = getScheduleDefinition(pluginConfig, 'jobSync');\n\n return scheduler.scheduleTask({\n id: `renovate_job_sync`,\n ...schedule,\n\n fn: async () => {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n const { items: entities } = await client.getEntities(\n {\n filter: {\n [`metadata.annotations.${RENOVATE_ANNOTATION_KEEP_UPDATED}`]:\n CATALOG_FILTER_EXISTS,\n [`metadata.annotations.${ANNOTATION_SOURCE_LOCATION}`]:\n CATALOG_FILTER_EXISTS,\n },\n fields: [\n 'kind',\n 'metadata.annotations',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n },\n { token },\n );\n\n for (const entity of entities) {\n renovateRunner.schedule(entity);\n }\n },\n });\n}\n","import { RouterOptions } from './types';\nimport { getPluginConfig, getScheduleDefinition } from '../config';\n\nexport async function scheduleCleanupTask(routerOptions: RouterOptions) {\n const { scheduler, rootConfig, databaseHandler, logger } = routerOptions;\n const pluginConfig = getPluginConfig(rootConfig);\n const schedule = getScheduleDefinition(pluginConfig, 'cleanup');\n const reportsToKeep =\n pluginConfig.getOptionalNumber('cleanup.minimumReports') ?? -1;\n\n return scheduler.scheduleTask({\n id: `renovate_report_cleanup`,\n ...schedule,\n fn: async () => {\n if (reportsToKeep >= 0) {\n logger.debug('Running report cleanup');\n const modified = await databaseHandler.deleteReports({\n keepLatest: reportsToKeep,\n });\n logger.debug(`Report cleanup completed. ${modified} reports deleted`);\n }\n },\n });\n}\n","import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { RenovateWrapper } from '@secustor/backstage-plugin-renovate-common';\nimport { RenovateRunner } from './wrapper';\nimport { RouterOptions } from './service/types';\nimport { DatabaseHandler } from './service/databaseHandler';\nimport { renovateRuntimeExtensionPoint } from '@secustor/backstage-plugin-renovate-node';\nimport { scheduleJobSync } from './service/jobSync';\nimport { scheduleCleanupTask } from './service/cleanupTask';\n\n/**\n * Renovate backend plugin\n *\n * @public\n */\nexport const renovatePlugin = createBackendPlugin({\n pluginId: 'renovate',\n register(env) {\n // allow modules provide additional runtimes\n const runtimes = new Map<string, RenovateWrapper>();\n env.registerExtensionPoint(renovateRuntimeExtensionPoint, {\n addRuntime(id: string, runtime: RenovateWrapper) {\n if (runtimes.has(id)) {\n throw new Error(\n ` ${id} has been already registered. Only one wrapper with the same ID is allowed to be registered`,\n );\n }\n runtimes.set(id, runtime);\n },\n });\n\n env.registerInit({\n deps: {\n rootConfig: coreServices.rootConfig,\n logger: coreServices.logger,\n httpRouter: coreServices.httpRouter,\n database: coreServices.database,\n scheduler: coreServices.scheduler,\n discovery: coreServices.discovery,\n auth: coreServices.auth,\n },\n async init(options) {\n const { database, httpRouter, logger } = options;\n\n const routerOptions: RouterOptions = {\n ...options,\n databaseHandler: await DatabaseHandler.create({ database, logger }),\n runtimes,\n };\n const renovateRunner = await RenovateRunner.from(routerOptions);\n\n await scheduleJobSync(renovateRunner, routerOptions);\n await scheduleCleanupTask(routerOptions);\n\n httpRouter.use(await createRouter(renovateRunner, routerOptions));\n httpRouter.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createValidatedOpenApiRouter","z","CatalogClient","express","isEntityRef","getTargetRepo","getTaskID","isError","ConflictError","errorHandler","DefaultGithubCredentialsProvider","ScmIntegrations","integration","is","DefaultGitlabCredentialsProvider","readTaskScheduleDefinitionFromConfig","nanoid","resolvePackagePath","CATALOG_FILTER_EXISTS","ANNOTATION_SOURCE_LOCATION","createBackendPlugin","renovateRuntimeExtensionPoint","coreServices"],"mappings":"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"}
|
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.1",
|
|
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.
|
|
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",
|
|
45
53
|
"@backstage/catalog-client": "^1.6.5",
|
|
46
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,10 +71,10 @@
|
|
|
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.9.
|
|
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
80
|
"supertest": "^7.0.0"
|