@cloudsnorkel/cdk-github-runners 0.8.1 → 0.8.2
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/.gitattributes +9 -0
- package/.jsii +368 -184
- package/API.md +1718 -512
- package/README.md +2 -2
- package/{lib/providers → assets}/docker-images/lambda/linux-arm64/runner.sh +1 -1
- package/{lib/providers → assets}/docker-images/lambda/linux-x64/runner.sh +1 -1
- package/{lib/lambdas/aws-image-builder-versioner → assets/lambdas/aws-image-builder-versioner.lambda}/index.js +5 -5
- package/{lib/lambdas/build-image → assets/lambdas/build-image.lambda}/index.js +5 -5
- package/{lib/lambdas/delete-ami → assets/lambdas/delete-ami.lambda}/index.js +2 -2
- package/{lib/lambdas/delete-runner → assets/lambdas/delete-runner.lambda}/index.js +1 -1
- package/{lib/lambdas/setup → assets/lambdas/setup.lambda}/index.js +2 -2
- package/{lib/lambdas/status → assets/lambdas/status.lambda}/index.js +2 -2
- package/{lib/lambdas/token-retriever → assets/lambdas/token-retriever.lambda}/index.js +1 -1
- package/{lib/lambdas/update-lambda → assets/lambdas/update-lambda.lambda}/index.js +4 -4
- package/{lib/lambdas/webhook-handler → assets/lambdas/webhook-handler.lambda}/index.js +2 -2
- package/lib/lambdas/aws-image-builder-versioner-function.d.ts +13 -0
- package/lib/lambdas/aws-image-builder-versioner-function.js +23 -0
- package/lib/lambdas/aws-image-builder-versioner.lambda.d.ts +2 -0
- package/lib/lambdas/aws-image-builder-versioner.lambda.js +80 -0
- package/lib/lambdas/build-image-function.d.ts +13 -0
- package/lib/lambdas/build-image-function.js +23 -0
- package/lib/lambdas/build-image.lambda.d.ts +2 -0
- package/lib/lambdas/build-image.lambda.js +92 -0
- package/lib/lambdas/delete-ami-function.d.ts +13 -0
- package/lib/lambdas/delete-ami-function.js +23 -0
- package/lib/lambdas/delete-ami.lambda.d.ts +1 -0
- package/lib/lambdas/delete-ami.lambda.js +87 -0
- package/lib/lambdas/delete-runner-function.d.ts +13 -0
- package/lib/lambdas/delete-runner-function.js +23 -0
- package/lib/lambdas/delete-runner.lambda.d.ts +1 -0
- package/lib/lambdas/delete-runner.lambda.js +69 -0
- package/lib/lambdas/github.d.ts +7 -0
- package/lib/lambdas/github.js +50 -0
- package/lib/lambdas/helpers.d.ts +12 -0
- package/lib/lambdas/helpers.js +66 -0
- package/lib/lambdas/setup-function.d.ts +13 -0
- package/lib/lambdas/setup-function.js +23 -0
- package/lib/lambdas/setup.lambda.d.ts +1 -0
- package/lib/lambdas/setup.lambda.js +148 -0
- package/lib/lambdas/status-function.d.ts +13 -0
- package/lib/lambdas/status-function.js +23 -0
- package/lib/lambdas/status.lambda.d.ts +1 -0
- package/lib/lambdas/status.lambda.js +285 -0
- package/lib/lambdas/token-retriever-function.d.ts +13 -0
- package/lib/lambdas/token-retriever-function.js +23 -0
- package/lib/lambdas/token-retriever.lambda.d.ts +1 -0
- package/lib/lambdas/token-retriever.lambda.js +15 -0
- package/lib/lambdas/update-lambda-function.d.ts +13 -0
- package/lib/lambdas/update-lambda-function.js +23 -0
- package/lib/lambdas/update-lambda.lambda.d.ts +7 -0
- package/lib/lambdas/update-lambda.lambda.js +34 -0
- package/lib/lambdas/webhook-handler-function.d.ts +13 -0
- package/lib/lambdas/webhook-handler-function.js +23 -0
- package/lib/lambdas/webhook-handler.lambda.d.ts +1 -0
- package/lib/lambdas/webhook-handler.lambda.js +107 -0
- package/lib/providers/codebuild.d.ts +8 -3
- package/lib/providers/codebuild.js +17 -9
- package/lib/providers/common.js +3 -3
- package/lib/providers/ec2.d.ts +9 -4
- package/lib/providers/ec2.js +14 -6
- package/lib/providers/fargate.d.ts +8 -3
- package/lib/providers/fargate.js +17 -9
- package/lib/providers/image-builders/ami.js +6 -3
- package/lib/providers/image-builders/codebuild.js +5 -3
- package/lib/providers/image-builders/common.js +5 -3
- package/lib/providers/image-builders/container.js +5 -3
- package/lib/providers/image-builders/linux-components.js +1 -1
- package/lib/providers/image-builders/static.js +3 -3
- package/lib/providers/image-builders/windows-components.js +1 -1
- package/lib/providers/lambda.d.ts +8 -3
- package/lib/providers/lambda.js +20 -10
- package/lib/runner.js +17 -10
- package/lib/secrets.js +1 -1
- package/lib/utils.d.ts +2 -6
- package/lib/utils.js +11 -26
- package/lib/webhook.d.ts +2 -2
- package/lib/webhook.js +5 -3
- package/package.json +28 -12
- package/setup/index.html +0 -12
- package/setup/src/App.svelte +0 -291
- package/setup/src/app.scss +0 -15
- package/setup/src/main.ts +0 -8
- package/setup/src/vite-env.d.ts +0 -2
- package/setup/svelte.config.mjs +0 -7
- package/setup/tsconfig.json +0 -21
- package/setup/tsconfig.node.json +0 -8
- package/setup/vite.config.ts +0 -15
- /package/{lib/providers → assets}/docker-images/codebuild/linux-arm64/Dockerfile +0 -0
- /package/{lib/providers → assets}/docker-images/codebuild/linux-x64/Dockerfile +0 -0
- /package/{lib/providers → assets}/docker-images/fargate/linux-arm64/Dockerfile +0 -0
- /package/{lib/providers → assets}/docker-images/fargate/linux-x64/Dockerfile +0 -0
- /package/{lib/providers → assets}/docker-images/lambda/linux-arm64/Dockerfile +0 -0
- /package/{lib/providers → assets}/docker-images/lambda/linux-arm64/runner.js +0 -0
- /package/{lib/providers → assets}/docker-images/lambda/linux-x64/Dockerfile +0 -0
- /package/{lib/providers → assets}/docker-images/lambda/linux-x64/runner.js +0 -0
- /package/{lib/lambdas/setup → assets/lambdas/setup.lambda}/index.html +0 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable-next-line import/no-extraneous-dependencies */
|
|
4
|
+
const AWS = require("aws-sdk");
|
|
5
|
+
const helpers_1 = require("./helpers");
|
|
6
|
+
const ec2 = new AWS.EC2();
|
|
7
|
+
async function deleteAmis(launchTemplateId, stackName, builderName, deleteAll) {
|
|
8
|
+
// this runs daily and images are built once a week, so there shouldn't be a need for pagination
|
|
9
|
+
const images = await ec2.describeImages({
|
|
10
|
+
Owners: ['self'],
|
|
11
|
+
Filters: [
|
|
12
|
+
{
|
|
13
|
+
Name: 'tag:GitHubRunners:Stack',
|
|
14
|
+
Values: [stackName],
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
Name: 'tag:GitHubRunners:Builder',
|
|
18
|
+
Values: [builderName],
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
}).promise();
|
|
22
|
+
let imagesToDelete = images.Images ?? [];
|
|
23
|
+
console.log(`Found ${imagesToDelete.length} AMIs`);
|
|
24
|
+
console.log(JSON.stringify(imagesToDelete.map(i => i.ImageId)));
|
|
25
|
+
if (!deleteAll) {
|
|
26
|
+
// get launch template information to filter out the active image
|
|
27
|
+
const launchTemplates = await ec2.describeLaunchTemplateVersions({
|
|
28
|
+
LaunchTemplateId: launchTemplateId,
|
|
29
|
+
Versions: ['$Default'],
|
|
30
|
+
}).promise();
|
|
31
|
+
if (!launchTemplates.LaunchTemplateVersions) {
|
|
32
|
+
console.error(`Unable to describe launch template ${launchTemplateId}`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const launchTemplate = launchTemplates.LaunchTemplateVersions[0];
|
|
36
|
+
// non-active images
|
|
37
|
+
imagesToDelete = imagesToDelete.filter(i => i.ImageId != launchTemplate.LaunchTemplateData?.ImageId);
|
|
38
|
+
// images older than two days to avoid race conditions where an image is created while we're cleaning up
|
|
39
|
+
imagesToDelete = imagesToDelete.filter(i => i.CreationDate && Date.parse(i.CreationDate) < (Date.now() - 1000 * 60 * 60 * 48));
|
|
40
|
+
console.log(`${imagesToDelete.length} AMIs left after filtering by date and excluding AMI used by launch template`);
|
|
41
|
+
}
|
|
42
|
+
// delete all that we found
|
|
43
|
+
for (const image of imagesToDelete) {
|
|
44
|
+
if (!image.ImageId) {
|
|
45
|
+
console.warn(`No image id? ${JSON.stringify(image)}`);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
console.log(`Deregistering ${image.ImageId}`);
|
|
49
|
+
await ec2.deregisterImage({
|
|
50
|
+
ImageId: image.ImageId,
|
|
51
|
+
}).promise();
|
|
52
|
+
for (const blockMapping of image.BlockDeviceMappings ?? []) {
|
|
53
|
+
if (blockMapping.Ebs?.SnapshotId) {
|
|
54
|
+
console.log(`Deleting ${blockMapping.Ebs.SnapshotId}`);
|
|
55
|
+
await ec2.deleteSnapshot({
|
|
56
|
+
SnapshotId: blockMapping.Ebs.SnapshotId,
|
|
57
|
+
}).promise();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/* eslint-disable @typescript-eslint/no-require-imports, import/no-extraneous-dependencies */
|
|
63
|
+
exports.handler = async function (event, context) {
|
|
64
|
+
try {
|
|
65
|
+
console.log(JSON.stringify({ ...event, ResponseURL: '...' }));
|
|
66
|
+
switch (event.RequestType) {
|
|
67
|
+
case 'Scheduled':
|
|
68
|
+
await deleteAmis(event.LaunchTemplateId, event.StackName, event.BuilderName, false);
|
|
69
|
+
return;
|
|
70
|
+
case 'Create':
|
|
71
|
+
case 'Update':
|
|
72
|
+
await helpers_1.customResourceRespond(event, 'SUCCESS', 'OK', 'DeleteAmis', {});
|
|
73
|
+
break;
|
|
74
|
+
case 'Delete':
|
|
75
|
+
await deleteAmis('', event.ResourceProperties.StackName, event.ResourceProperties.BuilderName, true);
|
|
76
|
+
await helpers_1.customResourceRespond(event, 'SUCCESS', 'OK', event.PhysicalResourceId, {});
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
console.error(e);
|
|
82
|
+
if (event.RequestType != 'Scheduled') {
|
|
83
|
+
await helpers_1.customResourceRespond(event, 'FAILED', e.message || 'Internal Error', context.logStreamName, {});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLWFtaS5sYW1iZGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFtYmRhcy9kZWxldGUtYW1pLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLGdFQUFnRTtBQUNoRSwrQkFBK0I7QUFDL0IsdUNBQWtEO0FBRWxELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBUzFCLEtBQUssVUFBVSxVQUFVLENBQUMsZ0JBQXdCLEVBQUUsU0FBaUIsRUFBRSxXQUFtQixFQUFFLFNBQWtCO0lBQzVHLGdHQUFnRztJQUNoRyxNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxjQUFjLENBQUM7UUFDdEMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2hCLE9BQU8sRUFBRTtZQUNQO2dCQUNFLElBQUksRUFBRSx5QkFBeUI7Z0JBQy9CLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQzthQUNwQjtZQUNEO2dCQUNFLElBQUksRUFBRSwyQkFBMkI7Z0JBQ2pDLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQzthQUN0QjtTQUNGO0tBQ0YsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRWIsSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFFekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoRSxJQUFJLENBQUMsU0FBUyxFQUFFO1FBQ2QsaUVBQWlFO1FBQ2pFLE1BQU0sZUFBZSxHQUFHLE1BQU0sR0FBRyxDQUFDLDhCQUE4QixDQUFDO1lBQy9ELGdCQUFnQixFQUFFLGdCQUFnQjtZQUNsQyxRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUM7U0FDdkIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsRUFBRTtZQUMzQyxPQUFPLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDeEUsT0FBTztTQUNSO1FBQ0QsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpFLG9CQUFvQjtRQUNwQixjQUFjLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksY0FBYyxDQUFDLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JHLHdHQUF3RztRQUN4RyxjQUFjLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUvSCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sOEVBQThFLENBQUMsQ0FBQztLQUNySDtJQUVELDJCQUEyQjtJQUMzQixLQUFLLE1BQU0sS0FBSyxJQUFJLGNBQWMsRUFBRTtRQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNsQixPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0RCxTQUFTO1NBQ1Y7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUU5QyxNQUFNLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDeEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1NBQ3ZCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUViLEtBQUssTUFBTSxZQUFZLElBQUksS0FBSyxDQUFDLG1CQUFtQixJQUFJLEVBQUUsRUFBRTtZQUMxRCxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFO2dCQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUV2RCxNQUFNLEdBQUcsQ0FBQyxjQUFjLENBQUM7b0JBQ3ZCLFVBQVUsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVU7aUJBQ3hDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNkO1NBQ0Y7S0FDRjtBQUNILENBQUM7QUFFRCw2RkFBNkY7QUFDN0YsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLFdBQVcsS0FBbUUsRUFBRSxPQUEwQjtJQUMvSCxJQUFJO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU5RCxRQUFRLEtBQUssQ0FBQyxXQUFXLEVBQUU7WUFDekIsS0FBSyxXQUFXO2dCQUNkLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3BGLE9BQU87WUFDVCxLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssUUFBUTtnQkFDWCxNQUFNLCtCQUFxQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdEUsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxNQUFNLFVBQVUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNyRyxNQUFNLCtCQUFxQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbEYsTUFBTTtTQUNUO0tBQ0Y7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLFdBQVcsRUFBRTtZQUNwQyxNQUFNLCtCQUFxQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUcsQ0FBVyxDQUFDLE9BQU8sSUFBSSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ25IO0tBQ0Y7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzLGltcG9ydC9uby11bnJlc29sdmVkICovXG5pbXBvcnQgKiBhcyBBV1NMYW1iZGEgZnJvbSAnYXdzLWxhbWJkYSc7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgKiBhcyBBV1MgZnJvbSAnYXdzLXNkayc7XG5pbXBvcnQgeyBjdXN0b21SZXNvdXJjZVJlc3BvbmQgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5jb25zdCBlYzIgPSBuZXcgQVdTLkVDMigpO1xuXG50eXBlIERlbGV0ZUFtaUlucHV0ID0ge1xuICBSZXF1ZXN0VHlwZTogJ1NjaGVkdWxlZCc7XG4gIFN0YWNrTmFtZTogc3RyaW5nO1xuICBCdWlsZGVyTmFtZTogc3RyaW5nO1xuICBMYXVuY2hUZW1wbGF0ZUlkOiBzdHJpbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFtaXMobGF1bmNoVGVtcGxhdGVJZDogc3RyaW5nLCBzdGFja05hbWU6IHN0cmluZywgYnVpbGRlck5hbWU6IHN0cmluZywgZGVsZXRlQWxsOiBib29sZWFuKSB7XG4gIC8vIHRoaXMgcnVucyBkYWlseSBhbmQgaW1hZ2VzIGFyZSBidWlsdCBvbmNlIGEgd2Vlaywgc28gdGhlcmUgc2hvdWxkbid0IGJlIGEgbmVlZCBmb3IgcGFnaW5hdGlvblxuICBjb25zdCBpbWFnZXMgPSBhd2FpdCBlYzIuZGVzY3JpYmVJbWFnZXMoe1xuICAgIE93bmVyczogWydzZWxmJ10sXG4gICAgRmlsdGVyczogW1xuICAgICAge1xuICAgICAgICBOYW1lOiAndGFnOkdpdEh1YlJ1bm5lcnM6U3RhY2snLFxuICAgICAgICBWYWx1ZXM6IFtzdGFja05hbWVdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgTmFtZTogJ3RhZzpHaXRIdWJSdW5uZXJzOkJ1aWxkZXInLFxuICAgICAgICBWYWx1ZXM6IFtidWlsZGVyTmFtZV0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0pLnByb21pc2UoKTtcblxuICBsZXQgaW1hZ2VzVG9EZWxldGUgPSBpbWFnZXMuSW1hZ2VzID8/IFtdO1xuXG4gIGNvbnNvbGUubG9nKGBGb3VuZCAke2ltYWdlc1RvRGVsZXRlLmxlbmd0aH0gQU1Jc2ApO1xuICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShpbWFnZXNUb0RlbGV0ZS5tYXAoaSA9PiBpLkltYWdlSWQpKSk7XG5cbiAgaWYgKCFkZWxldGVBbGwpIHtcbiAgICAvLyBnZXQgbGF1bmNoIHRlbXBsYXRlIGluZm9ybWF0aW9uIHRvIGZpbHRlciBvdXQgdGhlIGFjdGl2ZSBpbWFnZVxuICAgIGNvbnN0IGxhdW5jaFRlbXBsYXRlcyA9IGF3YWl0IGVjMi5kZXNjcmliZUxhdW5jaFRlbXBsYXRlVmVyc2lvbnMoe1xuICAgICAgTGF1bmNoVGVtcGxhdGVJZDogbGF1bmNoVGVtcGxhdGVJZCxcbiAgICAgIFZlcnNpb25zOiBbJyREZWZhdWx0J10sXG4gICAgfSkucHJvbWlzZSgpO1xuICAgIGlmICghbGF1bmNoVGVtcGxhdGVzLkxhdW5jaFRlbXBsYXRlVmVyc2lvbnMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byBkZXNjcmliZSBsYXVuY2ggdGVtcGxhdGUgJHtsYXVuY2hUZW1wbGF0ZUlkfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXVuY2hUZW1wbGF0ZSA9IGxhdW5jaFRlbXBsYXRlcy5MYXVuY2hUZW1wbGF0ZVZlcnNpb25zWzBdO1xuXG4gICAgLy8gbm9uLWFjdGl2ZSBpbWFnZXNcbiAgICBpbWFnZXNUb0RlbGV0ZSA9IGltYWdlc1RvRGVsZXRlLmZpbHRlcihpID0+IGkuSW1hZ2VJZCAhPSBsYXVuY2hUZW1wbGF0ZS5MYXVuY2hUZW1wbGF0ZURhdGE/LkltYWdlSWQpO1xuICAgIC8vIGltYWdlcyBvbGRlciB0aGFuIHR3byBkYXlzIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aGVyZSBhbiBpbWFnZSBpcyBjcmVhdGVkIHdoaWxlIHdlJ3JlIGNsZWFuaW5nIHVwXG4gICAgaW1hZ2VzVG9EZWxldGUgPSBpbWFnZXNUb0RlbGV0ZS5maWx0ZXIoaSA9PiBpLkNyZWF0aW9uRGF0ZSAmJiBEYXRlLnBhcnNlKGkuQ3JlYXRpb25EYXRlKSA8IChEYXRlLm5vdygpIC0gMTAwMCAqIDYwICogNjAgKiA0OCkpO1xuXG4gICAgY29uc29sZS5sb2coYCR7aW1hZ2VzVG9EZWxldGUubGVuZ3RofSBBTUlzIGxlZnQgYWZ0ZXIgZmlsdGVyaW5nIGJ5IGRhdGUgYW5kIGV4Y2x1ZGluZyBBTUkgdXNlZCBieSBsYXVuY2ggdGVtcGxhdGVgKTtcbiAgfVxuXG4gIC8vIGRlbGV0ZSBhbGwgdGhhdCB3ZSBmb3VuZFxuICBmb3IgKGNvbnN0IGltYWdlIG9mIGltYWdlc1RvRGVsZXRlKSB7XG4gICAgaWYgKCFpbWFnZS5JbWFnZUlkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYE5vIGltYWdlIGlkPyAke0pTT04uc3RyaW5naWZ5KGltYWdlKX1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBEZXJlZ2lzdGVyaW5nICR7aW1hZ2UuSW1hZ2VJZH1gKTtcblxuICAgIGF3YWl0IGVjMi5kZXJlZ2lzdGVySW1hZ2Uoe1xuICAgICAgSW1hZ2VJZDogaW1hZ2UuSW1hZ2VJZCxcbiAgICB9KS5wcm9taXNlKCk7XG5cbiAgICBmb3IgKGNvbnN0IGJsb2NrTWFwcGluZyBvZiBpbWFnZS5CbG9ja0RldmljZU1hcHBpbmdzID8/IFtdKSB7XG4gICAgICBpZiAoYmxvY2tNYXBwaW5nLkVicz8uU25hcHNob3RJZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgJHtibG9ja01hcHBpbmcuRWJzLlNuYXBzaG90SWR9YCk7XG5cbiAgICAgICAgYXdhaXQgZWMyLmRlbGV0ZVNuYXBzaG90KHtcbiAgICAgICAgICBTbmFwc2hvdElkOiBibG9ja01hcHBpbmcuRWJzLlNuYXBzaG90SWQsXG4gICAgICAgIH0pLnByb21pc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cywgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5leHBvcnRzLmhhbmRsZXIgPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQ6IERlbGV0ZUFtaUlucHV0IHwgQVdTTGFtYmRhLkNsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCwgY29udGV4dDogQVdTTGFtYmRhLkNvbnRleHQpIHtcbiAgdHJ5IHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IC4uLmV2ZW50LCBSZXNwb25zZVVSTDogJy4uLicgfSkpO1xuXG4gICAgc3dpdGNoIChldmVudC5SZXF1ZXN0VHlwZSkge1xuICAgICAgY2FzZSAnU2NoZWR1bGVkJzpcbiAgICAgICAgYXdhaXQgZGVsZXRlQW1pcyhldmVudC5MYXVuY2hUZW1wbGF0ZUlkLCBldmVudC5TdGFja05hbWUsIGV2ZW50LkJ1aWxkZXJOYW1lLCBmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgJ0NyZWF0ZSc6XG4gICAgICBjYXNlICdVcGRhdGUnOlxuICAgICAgICBhd2FpdCBjdXN0b21SZXNvdXJjZVJlc3BvbmQoZXZlbnQsICdTVUNDRVNTJywgJ09LJywgJ0RlbGV0ZUFtaXMnLCB7fSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRGVsZXRlJzpcbiAgICAgICAgYXdhaXQgZGVsZXRlQW1pcygnJywgZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLlN0YWNrTmFtZSwgZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkJ1aWxkZXJOYW1lLCB0cnVlKTtcbiAgICAgICAgYXdhaXQgY3VzdG9tUmVzb3VyY2VSZXNwb25kKGV2ZW50LCAnU1VDQ0VTUycsICdPSycsIGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCwge30pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIGlmIChldmVudC5SZXF1ZXN0VHlwZSAhPSAnU2NoZWR1bGVkJykge1xuICAgICAgYXdhaXQgY3VzdG9tUmVzb3VyY2VSZXNwb25kKGV2ZW50LCAnRkFJTEVEJywgKGUgYXMgRXJyb3IpLm1lc3NhZ2UgfHwgJ0ludGVybmFsIEVycm9yJywgY29udGV4dC5sb2dTdHJlYW1OYW1lLCB7fSk7XG4gICAgfVxuICB9XG59O1xuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
/**
|
|
4
|
+
* Props for DeleteRunnerFunction
|
|
5
|
+
*/
|
|
6
|
+
export interface DeleteRunnerFunctionProps extends lambda.FunctionOptions {
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* An AWS Lambda function which executes src/lambdas/delete-runner.
|
|
10
|
+
*/
|
|
11
|
+
export declare class DeleteRunnerFunction extends lambda.Function {
|
|
12
|
+
constructor(scope: Construct, id: string, props?: DeleteRunnerFunctionProps);
|
|
13
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeleteRunnerFunction = void 0;
|
|
4
|
+
// ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const lambda = require("aws-cdk-lib/aws-lambda");
|
|
7
|
+
/**
|
|
8
|
+
* An AWS Lambda function which executes src/lambdas/delete-runner.
|
|
9
|
+
*/
|
|
10
|
+
class DeleteRunnerFunction extends lambda.Function {
|
|
11
|
+
constructor(scope, id, props) {
|
|
12
|
+
super(scope, id, {
|
|
13
|
+
description: 'src/lambdas/delete-runner.lambda.ts',
|
|
14
|
+
...props,
|
|
15
|
+
runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),
|
|
16
|
+
handler: 'index.handler',
|
|
17
|
+
code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/lambdas/delete-runner.lambda')),
|
|
18
|
+
});
|
|
19
|
+
this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.DeleteRunnerFunction = DeleteRunnerFunction;
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLXJ1bm5lci1mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGFzL2RlbGV0ZS1ydW5uZXItZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkVBQTZFO0FBQzdFLDZCQUE2QjtBQUM3QixpREFBaUQ7QUFTakQ7O0dBRUc7QUFDSCxNQUFhLG9CQUFxQixTQUFRLE1BQU0sQ0FBQyxRQUFRO0lBQ3ZELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUM7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUscUNBQXFDO1lBQ2xELEdBQUcsS0FBSztZQUNSLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ3RFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSwyQ0FBMkMsQ0FBQyxDQUFDO1NBQy9GLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMscUNBQXFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUYsQ0FBQztDQUNGO0FBWEQsb0RBV0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLmpzIGFuZCBydW4gXCJucHggcHJvamVuXCIuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIERlbGV0ZVJ1bm5lckZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlUnVubmVyRnVuY3Rpb25Qcm9wcyBleHRlbmRzIGxhbWJkYS5GdW5jdGlvbk9wdGlvbnMge1xufVxuXG4vKipcbiAqIEFuIEFXUyBMYW1iZGEgZnVuY3Rpb24gd2hpY2ggZXhlY3V0ZXMgc3JjL2xhbWJkYXMvZGVsZXRlLXJ1bm5lci5cbiAqL1xuZXhwb3J0IGNsYXNzIERlbGV0ZVJ1bm5lckZ1bmN0aW9uIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBEZWxldGVSdW5uZXJGdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3NyYy9sYW1iZGFzL2RlbGV0ZS1ydW5uZXIubGFtYmRhLnRzJyxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcnVudGltZTogbmV3IGxhbWJkYS5SdW50aW1lKCdub2RlanMxNC54JywgbGFtYmRhLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vYXNzZXRzL2xhbWJkYXMvZGVsZXRlLXJ1bm5lci5sYW1iZGEnKSksXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudCgnQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQnLCAnMScsIHsgcmVtb3ZlSW5FZGdlOiB0cnVlIH0pO1xuICB9XG59Il19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const github_1 = require("./github");
|
|
4
|
+
async function getRunnerId(octokit, owner, repo, name, idleOnly) {
|
|
5
|
+
let page = 1;
|
|
6
|
+
while (true) {
|
|
7
|
+
const runners = await octokit.request('GET /repos/{owner}/{repo}/actions/runners?per_page=100&page={page}', {
|
|
8
|
+
page: page,
|
|
9
|
+
owner: owner,
|
|
10
|
+
repo: repo,
|
|
11
|
+
});
|
|
12
|
+
if (runners.data.runners.length == 0) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
for (const runner of runners.data.runners) {
|
|
16
|
+
if (runner.name == name) {
|
|
17
|
+
if (idleOnly) {
|
|
18
|
+
if (!runner.busy) {
|
|
19
|
+
return runner.id;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.log('Runner is busy, no need to delete.');
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return runner.id;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
page++;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
class RunnerBusy extends Error {
|
|
33
|
+
constructor(msg) {
|
|
34
|
+
super(msg);
|
|
35
|
+
this.name = 'RunnerBusy';
|
|
36
|
+
Object.setPrototypeOf(this, RunnerBusy.prototype);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.handler = async function (event) {
|
|
40
|
+
const { octokit } = await github_1.getOctokit(event.installationId);
|
|
41
|
+
// find runner id
|
|
42
|
+
const runnerId = await getRunnerId(octokit, event.owner, event.repo, event.runnerName, event.idleOnly);
|
|
43
|
+
if (!runnerId) {
|
|
44
|
+
console.error(`Unable to find runner id for ${event.owner}/${event.repo}:${event.runnerName}`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
console.log(`Runner ${event.runnerName} has id #${runnerId}`);
|
|
48
|
+
// delete runner (it usually gets deleted by ./run.sh, but it stopped prematurely if we're here).
|
|
49
|
+
// it seems like runners are automatically removed after a timeout, if they first accepted a job.
|
|
50
|
+
// we try removing it anyway for cases where a job wasn't accepted, and just in case it wasn't removed.
|
|
51
|
+
// repos have a limited number of self-hosted runners, so we can't leave dead ones behind.
|
|
52
|
+
try {
|
|
53
|
+
await octokit.rest.actions.deleteSelfHostedRunnerFromRepo({
|
|
54
|
+
owner: event.owner,
|
|
55
|
+
repo: event.repo,
|
|
56
|
+
runner_id: runnerId,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
const reqError = e;
|
|
61
|
+
if (reqError.message.includes('is still running a job')) {
|
|
62
|
+
throw new RunnerBusy(reqError.message);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
throw e;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLXJ1bm5lci5sYW1iZGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFtYmRhcy9kZWxldGUtcnVubmVyLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLHFDQUFzQztBQU90QyxLQUFLLFVBQVUsV0FBVyxDQUFDLE9BQVksRUFBRSxLQUFhLEVBQUUsSUFBWSxFQUFFLElBQVksRUFBRSxRQUFpQjtJQUNuRyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixPQUFPLElBQUksRUFBRTtRQUNYLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxvRUFBb0UsRUFBRTtZQUMxRyxJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxLQUFLO1lBQ1osSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7UUFFSCxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDcEMsT0FBTztTQUNSO1FBRUQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUN6QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFO2dCQUN2QixJQUFJLFFBQVEsRUFBRTtvQkFDWixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTt3QkFDaEIsT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDO3FCQUNsQjt5QkFBTTt3QkFDTCxPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7d0JBQ2xELE9BQU87cUJBQ1I7aUJBQ0Y7Z0JBQ0QsT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDO2FBQ2xCO1NBQ0Y7UUFFRCxJQUFJLEVBQUUsQ0FBQztLQUNSO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVyxTQUFRLEtBQUs7SUFDNUIsWUFBWSxHQUFXO1FBQ3JCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRCxDQUFDO0NBQ0Y7QUFFRCxPQUFPLENBQUMsT0FBTyxHQUFHLEtBQUssV0FBVyxLQUF3QjtJQUN4RCxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxtQkFBVSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUUzRCxpQkFBaUI7SUFDakIsTUFBTSxRQUFRLEdBQUcsTUFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RyxJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLE9BQU87S0FDUjtJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLENBQUMsVUFBVSxZQUFZLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFFOUQsaUdBQWlHO0lBQ2pHLGlHQUFpRztJQUNqRyx1R0FBdUc7SUFDdkcsMEZBQTBGO0lBQzFGLElBQUk7UUFDRixNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLDhCQUE4QixDQUFDO1lBQ3hELEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztZQUNsQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsU0FBUyxFQUFFLFFBQVE7U0FDcEIsQ0FBQyxDQUFDO0tBQ0o7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE1BQU0sUUFBUSxHQUFpQixDQUFDLENBQUM7UUFDakMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFO1lBQ3ZELE1BQU0sSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3hDO2FBQU07WUFDTCxNQUFNLENBQUMsQ0FBQztTQUNUO0tBQ0Y7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBSZXF1ZXN0RXJyb3IgfSBmcm9tICdAb2N0b2tpdC9yZXF1ZXN0LWVycm9yJztcbmltcG9ydCB7IGdldE9jdG9raXQgfSBmcm9tICcuL2dpdGh1Yic7XG5pbXBvcnQgeyBTdGVwRnVuY3Rpb25MYW1iZGFJbnB1dCB9IGZyb20gJy4vaGVscGVycyc7XG5cbmludGVyZmFjZSBEZWxldGVSdW5uZXJJbnB1dCBleHRlbmRzIFN0ZXBGdW5jdGlvbkxhbWJkYUlucHV0IHtcbiAgcmVhZG9ubHkgaWRsZU9ubHk6IGJvb2xlYW47XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFJ1bm5lcklkKG9jdG9raXQ6IGFueSwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGlkbGVPbmx5OiBib29sZWFuKSB7XG4gIGxldCBwYWdlID0gMTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBydW5uZXJzID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycz9wZXJfcGFnZT0xMDAmcGFnZT17cGFnZX0nLCB7XG4gICAgICBwYWdlOiBwYWdlLFxuICAgICAgb3duZXI6IG93bmVyLFxuICAgICAgcmVwbzogcmVwbyxcbiAgICB9KTtcblxuICAgIGlmIChydW5uZXJzLmRhdGEucnVubmVycy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcnVubmVyIG9mIHJ1bm5lcnMuZGF0YS5ydW5uZXJzKSB7XG4gICAgICBpZiAocnVubmVyLm5hbWUgPT0gbmFtZSkge1xuICAgICAgICBpZiAoaWRsZU9ubHkpIHtcbiAgICAgICAgICBpZiAoIXJ1bm5lci5idXN5KSB7XG4gICAgICAgICAgICByZXR1cm4gcnVubmVyLmlkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnUnVubmVyIGlzIGJ1c3ksIG5vIG5lZWQgdG8gZGVsZXRlLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnVubmVyLmlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhZ2UrKztcbiAgfVxufVxuXG5jbGFzcyBSdW5uZXJCdXN5IGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xuICAgIHN1cGVyKG1zZyk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bm5lckJ1c3knO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSdW5uZXJCdXN5LnByb3RvdHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgZnVuY3Rpb24gKGV2ZW50OiBEZWxldGVSdW5uZXJJbnB1dCkge1xuICBjb25zdCB7IG9jdG9raXQgfSA9IGF3YWl0IGdldE9jdG9raXQoZXZlbnQuaW5zdGFsbGF0aW9uSWQpO1xuXG4gIC8vIGZpbmQgcnVubmVyIGlkXG4gIGNvbnN0IHJ1bm5lcklkID0gYXdhaXQgZ2V0UnVubmVySWQob2N0b2tpdCwgZXZlbnQub3duZXIsIGV2ZW50LnJlcG8sIGV2ZW50LnJ1bm5lck5hbWUsIGV2ZW50LmlkbGVPbmx5KTtcbiAgaWYgKCFydW5uZXJJZCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byBmaW5kIHJ1bm5lciBpZCBmb3IgJHtldmVudC5vd25lcn0vJHtldmVudC5yZXBvfToke2V2ZW50LnJ1bm5lck5hbWV9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc29sZS5sb2coYFJ1bm5lciAke2V2ZW50LnJ1bm5lck5hbWV9IGhhcyBpZCAjJHtydW5uZXJJZH1gKTtcblxuICAvLyBkZWxldGUgcnVubmVyIChpdCB1c3VhbGx5IGdldHMgZGVsZXRlZCBieSAuL3J1bi5zaCwgYnV0IGl0IHN0b3BwZWQgcHJlbWF0dXJlbHkgaWYgd2UncmUgaGVyZSkuXG4gIC8vIGl0IHNlZW1zIGxpa2UgcnVubmVycyBhcmUgYXV0b21hdGljYWxseSByZW1vdmVkIGFmdGVyIGEgdGltZW91dCwgaWYgdGhleSBmaXJzdCBhY2NlcHRlZCBhIGpvYi5cbiAgLy8gd2UgdHJ5IHJlbW92aW5nIGl0IGFueXdheSBmb3IgY2FzZXMgd2hlcmUgYSBqb2Igd2Fzbid0IGFjY2VwdGVkLCBhbmQganVzdCBpbiBjYXNlIGl0IHdhc24ndCByZW1vdmVkLlxuICAvLyByZXBvcyBoYXZlIGEgbGltaXRlZCBudW1iZXIgb2Ygc2VsZi1ob3N0ZWQgcnVubmVycywgc28gd2UgY2FuJ3QgbGVhdmUgZGVhZCBvbmVzIGJlaGluZC5cbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlc3QuYWN0aW9ucy5kZWxldGVTZWxmSG9zdGVkUnVubmVyRnJvbVJlcG8oe1xuICAgICAgb3duZXI6IGV2ZW50Lm93bmVyLFxuICAgICAgcmVwbzogZXZlbnQucmVwbyxcbiAgICAgIHJ1bm5lcl9pZDogcnVubmVySWQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zdCByZXFFcnJvciA9IDxSZXF1ZXN0RXJyb3I+ZTtcbiAgICBpZiAocmVxRXJyb3IubWVzc2FnZS5pbmNsdWRlcygnaXMgc3RpbGwgcnVubmluZyBhIGpvYicpKSB7XG4gICAgICB0aHJvdyBuZXcgUnVubmVyQnVzeShyZXFFcnJvci5tZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function baseUrlFromDomain(domain: string): string;
|
|
2
|
+
export declare function getOctokit(installationId?: string): Promise<{
|
|
3
|
+
githubSecrets: any;
|
|
4
|
+
octokit: import("@octokit/core").Octokit & {
|
|
5
|
+
paginate: import("@octokit/plugin-paginate-rest").PaginateInterface;
|
|
6
|
+
} & import("@octokit/plugin-rest-endpoint-methods/dist-types/generated/method-types").RestEndpointMethods & import("@octokit/plugin-rest-endpoint-methods/dist-types/types").Api;
|
|
7
|
+
}>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getOctokit = exports.baseUrlFromDomain = void 0;
|
|
4
|
+
/* eslint-disable import/no-extraneous-dependencies */
|
|
5
|
+
const auth_app_1 = require("@octokit/auth-app");
|
|
6
|
+
const rest_1 = require("@octokit/rest");
|
|
7
|
+
const helpers_1 = require("./helpers");
|
|
8
|
+
function baseUrlFromDomain(domain) {
|
|
9
|
+
if (domain == 'github.com') {
|
|
10
|
+
return 'https://api.github.com';
|
|
11
|
+
}
|
|
12
|
+
return `https://${domain}/api/v3`;
|
|
13
|
+
}
|
|
14
|
+
exports.baseUrlFromDomain = baseUrlFromDomain;
|
|
15
|
+
async function getOctokit(installationId) {
|
|
16
|
+
if (!process.env.GITHUB_SECRET_ARN || !process.env.GITHUB_PRIVATE_KEY_SECRET_ARN) {
|
|
17
|
+
throw new Error('Missing environment variables');
|
|
18
|
+
}
|
|
19
|
+
const githubSecrets = await helpers_1.getSecretJsonValue(process.env.GITHUB_SECRET_ARN);
|
|
20
|
+
let baseUrl = baseUrlFromDomain(githubSecrets.domain);
|
|
21
|
+
let token;
|
|
22
|
+
if (githubSecrets.personalAuthToken) {
|
|
23
|
+
token = githubSecrets.personalAuthToken;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const privateKey = await helpers_1.getSecretValue(process.env.GITHUB_PRIVATE_KEY_SECRET_ARN);
|
|
27
|
+
const appOctokit = new rest_1.Octokit({
|
|
28
|
+
baseUrl,
|
|
29
|
+
authStrategy: auth_app_1.createAppAuth,
|
|
30
|
+
auth: {
|
|
31
|
+
appId: githubSecrets.appId,
|
|
32
|
+
privateKey: privateKey,
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
token = (await appOctokit.auth({
|
|
36
|
+
type: 'installation',
|
|
37
|
+
installationId: installationId,
|
|
38
|
+
})).token;
|
|
39
|
+
}
|
|
40
|
+
const octokit = new rest_1.Octokit({
|
|
41
|
+
baseUrl,
|
|
42
|
+
auth: token,
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
githubSecrets,
|
|
46
|
+
octokit,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
exports.getOctokit = getOctokit;
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xhbWJkYXMvZ2l0aHViLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNEQUFzRDtBQUN0RCxnREFBa0Q7QUFDbEQsd0NBQXdDO0FBQ3hDLHVDQUErRDtBQUUvRCxTQUFnQixpQkFBaUIsQ0FBQyxNQUFjO0lBQzlDLElBQUksTUFBTSxJQUFJLFlBQVksRUFBRTtRQUMxQixPQUFPLHdCQUF3QixDQUFDO0tBQ2pDO0lBQ0QsT0FBTyxXQUFXLE1BQU0sU0FBUyxDQUFDO0FBQ3BDLENBQUM7QUFMRCw4Q0FLQztBQUVNLEtBQUssVUFBVSxVQUFVLENBQUMsY0FBdUI7SUFDdEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFO1FBQ2hGLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztLQUNsRDtJQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sNEJBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRTlFLElBQUksT0FBTyxHQUFHLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV0RCxJQUFJLEtBQUssQ0FBQztJQUNWLElBQUksYUFBYSxDQUFDLGlCQUFpQixFQUFFO1FBQ25DLEtBQUssR0FBRyxhQUFhLENBQUMsaUJBQWlCLENBQUM7S0FDekM7U0FBTTtRQUNMLE1BQU0sVUFBVSxHQUFHLE1BQU0sd0JBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFFbkYsTUFBTSxVQUFVLEdBQUcsSUFBSSxjQUFPLENBQUM7WUFDN0IsT0FBTztZQUNQLFlBQVksRUFBRSx3QkFBYTtZQUMzQixJQUFJLEVBQUU7Z0JBQ0osS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLO2dCQUMxQixVQUFVLEVBQUUsVUFBVTthQUN2QjtTQUNGLENBQUMsQ0FBQztRQUVILEtBQUssR0FBRyxDQUFDLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQztZQUM3QixJQUFJLEVBQUUsY0FBYztZQUNwQixjQUFjLEVBQUUsY0FBYztTQUMvQixDQUFTLENBQUEsQ0FBQyxLQUFLLENBQUM7S0FDbEI7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLGNBQU8sQ0FBQztRQUMxQixPQUFPO1FBQ1AsSUFBSSxFQUFFLEtBQUs7S0FDWixDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsYUFBYTtRQUNiLE9BQU87S0FDUixDQUFDO0FBQ0osQ0FBQztBQXZDRCxnQ0F1Q0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IGNyZWF0ZUFwcEF1dGggfSBmcm9tICdAb2N0b2tpdC9hdXRoLWFwcCc7XG5pbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvcmVzdCc7XG5pbXBvcnQgeyBnZXRTZWNyZXRWYWx1ZSwgZ2V0U2VjcmV0SnNvblZhbHVlIH0gZnJvbSAnLi9oZWxwZXJzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2VVcmxGcm9tRG9tYWluKGRvbWFpbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGRvbWFpbiA9PSAnZ2l0aHViLmNvbScpIHtcbiAgICByZXR1cm4gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20nO1xuICB9XG4gIHJldHVybiBgaHR0cHM6Ly8ke2RvbWFpbn0vYXBpL3YzYDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9jdG9raXQoaW5zdGFsbGF0aW9uSWQ/OiBzdHJpbmcpIHtcbiAgaWYgKCFwcm9jZXNzLmVudi5HSVRIVUJfU0VDUkVUX0FSTiB8fCAhcHJvY2Vzcy5lbnYuR0lUSFVCX1BSSVZBVEVfS0VZX1NFQ1JFVF9BUk4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzJyk7XG4gIH1cblxuICBjb25zdCBnaXRodWJTZWNyZXRzID0gYXdhaXQgZ2V0U2VjcmV0SnNvblZhbHVlKHByb2Nlc3MuZW52LkdJVEhVQl9TRUNSRVRfQVJOKTtcblxuICBsZXQgYmFzZVVybCA9IGJhc2VVcmxGcm9tRG9tYWluKGdpdGh1YlNlY3JldHMuZG9tYWluKTtcblxuICBsZXQgdG9rZW47XG4gIGlmIChnaXRodWJTZWNyZXRzLnBlcnNvbmFsQXV0aFRva2VuKSB7XG4gICAgdG9rZW4gPSBnaXRodWJTZWNyZXRzLnBlcnNvbmFsQXV0aFRva2VuO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhd2FpdCBnZXRTZWNyZXRWYWx1ZShwcm9jZXNzLmVudi5HSVRIVUJfUFJJVkFURV9LRVlfU0VDUkVUX0FSTik7XG5cbiAgICBjb25zdCBhcHBPY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgICAgYmFzZVVybCxcbiAgICAgIGF1dGhTdHJhdGVneTogY3JlYXRlQXBwQXV0aCxcbiAgICAgIGF1dGg6IHtcbiAgICAgICAgYXBwSWQ6IGdpdGh1YlNlY3JldHMuYXBwSWQsXG4gICAgICAgIHByaXZhdGVLZXk6IHByaXZhdGVLZXksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdG9rZW4gPSAoYXdhaXQgYXBwT2N0b2tpdC5hdXRoKHtcbiAgICAgIHR5cGU6ICdpbnN0YWxsYXRpb24nLFxuICAgICAgaW5zdGFsbGF0aW9uSWQ6IGluc3RhbGxhdGlvbklkLFxuICAgIH0pIGFzIGFueSkudG9rZW47XG4gIH1cblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGJhc2VVcmwsXG4gICAgYXV0aDogdG9rZW4sXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZ2l0aHViU2VjcmV0cyxcbiAgICBvY3Rva2l0LFxuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface StepFunctionLambdaInput {
|
|
2
|
+
readonly owner: string;
|
|
3
|
+
readonly repo: string;
|
|
4
|
+
readonly runId: string;
|
|
5
|
+
readonly runnerName: string;
|
|
6
|
+
readonly installationId: string;
|
|
7
|
+
readonly labels: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare function getSecretValue(arn: string | undefined): Promise<string>;
|
|
10
|
+
export declare function getSecretJsonValue(arn: string | undefined): Promise<any>;
|
|
11
|
+
export declare function updateSecretValue(arn: string | undefined, value: string): Promise<void>;
|
|
12
|
+
export declare function customResourceRespond(event: AWSLambda.CloudFormationCustomResourceEvent, responseStatus: string, reason: string, physicalResourceId: string, data: any): Promise<unknown>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.customResourceRespond = exports.updateSecretValue = exports.getSecretJsonValue = exports.getSecretValue = void 0;
|
|
4
|
+
/* eslint-disable import/no-extraneous-dependencies */
|
|
5
|
+
const AWS = require("aws-sdk");
|
|
6
|
+
const sm = new AWS.SecretsManager();
|
|
7
|
+
async function getSecretValue(arn) {
|
|
8
|
+
if (!arn) {
|
|
9
|
+
throw new Error('Missing secret ARN');
|
|
10
|
+
}
|
|
11
|
+
const secret = await sm.getSecretValue({ SecretId: arn }).promise();
|
|
12
|
+
if (!secret.SecretString) {
|
|
13
|
+
throw new Error(`No SecretString in ${arn}`);
|
|
14
|
+
}
|
|
15
|
+
return secret.SecretString;
|
|
16
|
+
}
|
|
17
|
+
exports.getSecretValue = getSecretValue;
|
|
18
|
+
async function getSecretJsonValue(arn) {
|
|
19
|
+
return JSON.parse(await getSecretValue(arn));
|
|
20
|
+
}
|
|
21
|
+
exports.getSecretJsonValue = getSecretJsonValue;
|
|
22
|
+
async function updateSecretValue(arn, value) {
|
|
23
|
+
if (!arn) {
|
|
24
|
+
throw new Error('Missing secret ARN');
|
|
25
|
+
}
|
|
26
|
+
await sm.updateSecret({ SecretId: arn, SecretString: value }).promise();
|
|
27
|
+
}
|
|
28
|
+
exports.updateSecretValue = updateSecretValue;
|
|
29
|
+
async function customResourceRespond(event, responseStatus, reason, physicalResourceId, data) {
|
|
30
|
+
const responseBody = JSON.stringify({
|
|
31
|
+
Status: responseStatus,
|
|
32
|
+
Reason: reason,
|
|
33
|
+
PhysicalResourceId: physicalResourceId,
|
|
34
|
+
StackId: event.StackId,
|
|
35
|
+
RequestId: event.RequestId,
|
|
36
|
+
LogicalResourceId: event.LogicalResourceId,
|
|
37
|
+
NoEcho: false,
|
|
38
|
+
Data: data,
|
|
39
|
+
});
|
|
40
|
+
console.log('Responding', responseBody);
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
42
|
+
const parsedUrl = require('url').parse(event.ResponseURL);
|
|
43
|
+
const requestOptions = {
|
|
44
|
+
hostname: parsedUrl.hostname,
|
|
45
|
+
path: parsedUrl.path,
|
|
46
|
+
method: 'PUT',
|
|
47
|
+
headers: {
|
|
48
|
+
'content-type': '',
|
|
49
|
+
'content-length': responseBody.length,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
try {
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
55
|
+
const request = require('https').request(requestOptions, resolve);
|
|
56
|
+
request.on('error', reject);
|
|
57
|
+
request.write(responseBody);
|
|
58
|
+
request.end();
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
reject(e);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
exports.customResourceRespond = customResourceRespond;
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGFzL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQXNEO0FBQ3RELCtCQUErQjtBQVcvQixNQUFNLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztBQUU3QixLQUFLLFVBQVUsY0FBYyxDQUFDLEdBQXVCO0lBQzFELElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDUixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7S0FDdkM7SUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUVwRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRTtRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQzlDO0lBRUQsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQzdCLENBQUM7QUFaRCx3Q0FZQztBQUVNLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxHQUF1QjtJQUM5RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRkQsZ0RBRUM7QUFFTSxLQUFLLFVBQVUsaUJBQWlCLENBQUMsR0FBdUIsRUFBRSxLQUFhO0lBQzVFLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDUixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7S0FDdkM7SUFFRCxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQzFFLENBQUM7QUFORCw4Q0FNQztBQUVNLEtBQUssVUFBVSxxQkFBcUIsQ0FBQyxLQUFrRCxFQUFFLGNBQXNCLEVBQ3BILE1BQWMsRUFBRSxrQkFBMEIsRUFBRSxJQUFTO0lBQ3JELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDbEMsTUFBTSxFQUFFLGNBQWM7UUFDdEIsTUFBTSxFQUFFLE1BQU07UUFDZCxrQkFBa0IsRUFBRSxrQkFBa0I7UUFDdEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1FBQ3RCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztRQUMxQixpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCO1FBQzFDLE1BQU0sRUFBRSxLQUFLO1FBQ2IsSUFBSSxFQUFFLElBQUk7S0FDWCxDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUV4QyxpRUFBaUU7SUFDakUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUQsTUFBTSxjQUFjLEdBQUc7UUFDckIsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO1FBQzVCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSTtRQUNwQixNQUFNLEVBQUUsS0FBSztRQUNiLE9BQU8sRUFBRTtZQUNQLGNBQWMsRUFBRSxFQUFFO1lBQ2xCLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxNQUFNO1NBQ3RDO0tBQ0YsQ0FBQztJQUVGLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsSUFBSTtZQUNGLGlFQUFpRTtZQUNqRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNsRSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNmO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDWDtJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQXRDRCxzREFzQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCAqIGFzIEFXUyBmcm9tICdhd3Mtc2RrJztcblxuZXhwb3J0IGludGVyZmFjZSBTdGVwRnVuY3Rpb25MYW1iZGFJbnB1dCB7XG4gIHJlYWRvbmx5IG93bmVyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVubmVyTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBpbnN0YWxsYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBsYWJlbHM6IHN0cmluZ1tdO1xufVxuXG5jb25zdCBzbSA9IG5ldyBBV1MuU2VjcmV0c01hbmFnZXIoKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNlY3JldFZhbHVlKGFybjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gIGlmICghYXJuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHNlY3JldCBBUk4nKTtcbiAgfVxuXG4gIGNvbnN0IHNlY3JldCA9IGF3YWl0IHNtLmdldFNlY3JldFZhbHVlKHsgU2VjcmV0SWQ6IGFybiB9KS5wcm9taXNlKCk7XG5cbiAgaWYgKCFzZWNyZXQuU2VjcmV0U3RyaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBTZWNyZXRTdHJpbmcgaW4gJHthcm59YCk7XG4gIH1cblxuICByZXR1cm4gc2VjcmV0LlNlY3JldFN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNlY3JldEpzb25WYWx1ZShhcm46IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICByZXR1cm4gSlNPTi5wYXJzZShhd2FpdCBnZXRTZWNyZXRWYWx1ZShhcm4pKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNlY3JldFZhbHVlKGFybjogc3RyaW5nIHwgdW5kZWZpbmVkLCB2YWx1ZTogc3RyaW5nKSB7XG4gIGlmICghYXJuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHNlY3JldCBBUk4nKTtcbiAgfVxuXG4gIGF3YWl0IHNtLnVwZGF0ZVNlY3JldCh7IFNlY3JldElkOiBhcm4sIFNlY3JldFN0cmluZzogdmFsdWUgfSkucHJvbWlzZSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3VzdG9tUmVzb3VyY2VSZXNwb25kKGV2ZW50OiBBV1NMYW1iZGEuQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50LCByZXNwb25zZVN0YXR1czogc3RyaW5nLFxuICByZWFzb246IHN0cmluZywgcGh5c2ljYWxSZXNvdXJjZUlkOiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICBjb25zdCByZXNwb25zZUJvZHkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgU3RhdHVzOiByZXNwb25zZVN0YXR1cyxcbiAgICBSZWFzb246IHJlYXNvbixcbiAgICBQaHlzaWNhbFJlc291cmNlSWQ6IHBoeXNpY2FsUmVzb3VyY2VJZCxcbiAgICBTdGFja0lkOiBldmVudC5TdGFja0lkLFxuICAgIFJlcXVlc3RJZDogZXZlbnQuUmVxdWVzdElkLFxuICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCxcbiAgICBOb0VjaG86IGZhbHNlLFxuICAgIERhdGE6IGRhdGEsXG4gIH0pO1xuXG4gIGNvbnNvbGUubG9nKCdSZXNwb25kaW5nJywgcmVzcG9uc2VCb2R5KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBwYXJzZWRVcmwgPSByZXF1aXJlKCd1cmwnKS5wYXJzZShldmVudC5SZXNwb25zZVVSTCk7XG4gIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuICAgIGhvc3RuYW1lOiBwYXJzZWRVcmwuaG9zdG5hbWUsXG4gICAgcGF0aDogcGFyc2VkVXJsLnBhdGgsXG4gICAgbWV0aG9kOiAnUFVUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnY29udGVudC10eXBlJzogJycsXG4gICAgICAnY29udGVudC1sZW5ndGgnOiByZXNwb25zZUJvZHkubGVuZ3RoLFxuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSByZXF1aXJlKCdodHRwcycpLnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIHJlc29sdmUpO1xuICAgICAgcmVxdWVzdC5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgcmVxdWVzdC53cml0ZShyZXNwb25zZUJvZHkpO1xuICAgICAgcmVxdWVzdC5lbmQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZWplY3QoZSk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
/**
|
|
4
|
+
* Props for SetupFunction
|
|
5
|
+
*/
|
|
6
|
+
export interface SetupFunctionProps extends lambda.FunctionOptions {
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* An AWS Lambda function which executes src/lambdas/setup.
|
|
10
|
+
*/
|
|
11
|
+
export declare class SetupFunction extends lambda.Function {
|
|
12
|
+
constructor(scope: Construct, id: string, props?: SetupFunctionProps);
|
|
13
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SetupFunction = void 0;
|
|
4
|
+
// ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const lambda = require("aws-cdk-lib/aws-lambda");
|
|
7
|
+
/**
|
|
8
|
+
* An AWS Lambda function which executes src/lambdas/setup.
|
|
9
|
+
*/
|
|
10
|
+
class SetupFunction extends lambda.Function {
|
|
11
|
+
constructor(scope, id, props) {
|
|
12
|
+
super(scope, id, {
|
|
13
|
+
description: 'src/lambdas/setup.lambda.ts',
|
|
14
|
+
...props,
|
|
15
|
+
runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),
|
|
16
|
+
handler: 'index.handler',
|
|
17
|
+
code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/lambdas/setup.lambda')),
|
|
18
|
+
});
|
|
19
|
+
this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.SetupFunction = SetupFunction;
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFtYmRhcy9zZXR1cC1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2RUFBNkU7QUFDN0UsNkJBQTZCO0FBQzdCLGlEQUFpRDtBQVNqRDs7R0FFRztBQUNILE1BQWEsYUFBYyxTQUFRLE1BQU0sQ0FBQyxRQUFRO0lBQ2hELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUsNkJBQTZCO1lBQzFDLEdBQUcsS0FBSztZQUNSLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ3RFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO1NBQ3ZGLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMscUNBQXFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUYsQ0FBQztDQUNGO0FBWEQsc0NBV0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLmpzIGFuZCBydW4gXCJucHggcHJvamVuXCIuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIFNldHVwRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXR1cEZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb25PcHRpb25zIHtcbn1cblxuLyoqXG4gKiBBbiBBV1MgTGFtYmRhIGZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGVzIHNyYy9sYW1iZGFzL3NldHVwLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dXBGdW5jdGlvbiBleHRlbmRzIGxhbWJkYS5GdW5jdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogU2V0dXBGdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3NyYy9sYW1iZGFzL3NldHVwLmxhbWJkYS50cycsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHJ1bnRpbWU6IG5ldyBsYW1iZGEuUnVudGltZSgnbm9kZWpzMTQueCcsIGxhbWJkYS5SdW50aW1lRmFtaWx5Lk5PREVKUyksXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Fzc2V0cy9sYW1iZGFzL3NldHVwLmxhbWJkYScpKSxcbiAgICB9KTtcbiAgICB0aGlzLmFkZEVudmlyb25tZW50KCdBV1NfTk9ERUpTX0NPTk5FQ1RJT05fUkVVU0VfRU5BQkxFRCcsICcxJywgeyByZW1vdmVJbkVkZ2U6IHRydWUgfSk7XG4gIH1cbn0iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable import/no-extraneous-dependencies */
|
|
4
|
+
const crypto = require("crypto");
|
|
5
|
+
const fs = require("fs");
|
|
6
|
+
const rest_1 = require("@octokit/rest");
|
|
7
|
+
const github_1 = require("./github");
|
|
8
|
+
const helpers_1 = require("./helpers");
|
|
9
|
+
const nonce = crypto.randomBytes(64).toString('hex');
|
|
10
|
+
function getHtml(baseUrl, token, domain) {
|
|
11
|
+
return fs.readFileSync('index.html', 'utf-8')
|
|
12
|
+
.replace(/INSERT_WEBHOOK_URL_HERE/g, process.env.WEBHOOK_URL)
|
|
13
|
+
.replace(/INSERT_BASE_URL_HERE/g, baseUrl)
|
|
14
|
+
.replace(/INSERT_TOKEN_HERE/g, token)
|
|
15
|
+
.replace(/INSERT_SECRET_ARN_HERE/g, process.env.SETUP_SECRET_ARN)
|
|
16
|
+
.replace(/INSERT_DOMAIN_HERE/g, domain)
|
|
17
|
+
.replace(/<script/g, `<script nonce="${nonce}"`)
|
|
18
|
+
.replace(/<style/g, `<style nonce="${nonce}"`);
|
|
19
|
+
}
|
|
20
|
+
function response(code, body) {
|
|
21
|
+
return {
|
|
22
|
+
statusCode: code,
|
|
23
|
+
headers: {
|
|
24
|
+
'Content-Type': 'text/html',
|
|
25
|
+
'Content-Security-Policy': `default-src 'unsafe-inline' 'nonce-${nonce}'; img-src data:; connect-src 'self'; form-action https:; frame-ancestors 'none'; object-src 'none'; base-uri 'self'`,
|
|
26
|
+
},
|
|
27
|
+
body: body,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async function handleRoot(event, setupToken) {
|
|
31
|
+
const setupBaseUrl = `https://${event.requestContext.domainName}`;
|
|
32
|
+
const githubSecrets = await helpers_1.getSecretJsonValue(process.env.GITHUB_SECRET_ARN);
|
|
33
|
+
return response(200, getHtml(setupBaseUrl, setupToken, githubSecrets.domain));
|
|
34
|
+
}
|
|
35
|
+
function decodeBody(event) {
|
|
36
|
+
let body = event.body;
|
|
37
|
+
if (!body) {
|
|
38
|
+
throw new Error('No body found');
|
|
39
|
+
}
|
|
40
|
+
if (event.isBase64Encoded) {
|
|
41
|
+
body = Buffer.from(body, 'base64').toString('utf-8');
|
|
42
|
+
}
|
|
43
|
+
return JSON.parse(body);
|
|
44
|
+
}
|
|
45
|
+
async function handleDomain(event) {
|
|
46
|
+
const body = decodeBody(event);
|
|
47
|
+
if (!body.domain) {
|
|
48
|
+
return response(400, 'Invalid domain');
|
|
49
|
+
}
|
|
50
|
+
const githubSecrets = await helpers_1.getSecretJsonValue(process.env.GITHUB_SECRET_ARN);
|
|
51
|
+
githubSecrets.domain = body.domain;
|
|
52
|
+
await helpers_1.updateSecretValue(process.env.GITHUB_SECRET_ARN, JSON.stringify(githubSecrets));
|
|
53
|
+
return response(200, 'Domain set');
|
|
54
|
+
}
|
|
55
|
+
async function handlePat(event) {
|
|
56
|
+
const body = decodeBody(event);
|
|
57
|
+
if (!body.pat || !body.domain) {
|
|
58
|
+
return response(400, 'Invalid personal access token');
|
|
59
|
+
}
|
|
60
|
+
await helpers_1.updateSecretValue(process.env.GITHUB_SECRET_ARN, JSON.stringify({
|
|
61
|
+
domain: body.domain,
|
|
62
|
+
appId: '',
|
|
63
|
+
personalAuthToken: body.pat,
|
|
64
|
+
}));
|
|
65
|
+
await helpers_1.updateSecretValue(process.env.SETUP_SECRET_ARN, JSON.stringify({ token: '' }));
|
|
66
|
+
return response(200, 'Personal access token set');
|
|
67
|
+
}
|
|
68
|
+
async function handleNewApp(event) {
|
|
69
|
+
if (!event.queryStringParameters) {
|
|
70
|
+
return response(400, 'Invalid code');
|
|
71
|
+
}
|
|
72
|
+
const code = event.queryStringParameters.code;
|
|
73
|
+
if (!code) {
|
|
74
|
+
return response(400, 'Invalid code');
|
|
75
|
+
}
|
|
76
|
+
const githubSecrets = await helpers_1.getSecretJsonValue(process.env.GITHUB_SECRET_ARN);
|
|
77
|
+
const baseUrl = github_1.baseUrlFromDomain(githubSecrets.domain);
|
|
78
|
+
const newApp = await new rest_1.Octokit({ baseUrl }).rest.apps.createFromManifest({ code });
|
|
79
|
+
await helpers_1.updateSecretValue(process.env.GITHUB_SECRET_ARN, JSON.stringify({
|
|
80
|
+
domain: new URL(newApp.data.html_url).host,
|
|
81
|
+
appId: newApp.data.id,
|
|
82
|
+
personalAuthToken: '',
|
|
83
|
+
}));
|
|
84
|
+
await helpers_1.updateSecretValue(process.env.GITHUB_PRIVATE_KEY_SECRET_ARN, newApp.data.pem);
|
|
85
|
+
await helpers_1.updateSecretValue(process.env.WEBHOOK_SECRET_ARN, JSON.stringify({
|
|
86
|
+
webhookSecret: newApp.data.webhook_secret,
|
|
87
|
+
}));
|
|
88
|
+
await helpers_1.updateSecretValue(process.env.SETUP_SECRET_ARN, JSON.stringify({ token: '' }));
|
|
89
|
+
return response(200, `New app set. <a href="${newApp.data.html_url}/installations/new">Install it</a> for your repositories.`);
|
|
90
|
+
}
|
|
91
|
+
async function handleExistingApp(event) {
|
|
92
|
+
const body = decodeBody(event);
|
|
93
|
+
if (!body.appid || !body.pk || !body.domain) {
|
|
94
|
+
return response(400, 'Missing fields');
|
|
95
|
+
}
|
|
96
|
+
await helpers_1.updateSecretValue(process.env.GITHUB_SECRET_ARN, JSON.stringify({
|
|
97
|
+
domain: body.domain,
|
|
98
|
+
appId: body.appid,
|
|
99
|
+
personalAuthToken: '',
|
|
100
|
+
}));
|
|
101
|
+
await helpers_1.updateSecretValue(process.env.GITHUB_PRIVATE_KEY_SECRET_ARN, body.pk);
|
|
102
|
+
await helpers_1.updateSecretValue(process.env.SETUP_SECRET_ARN, JSON.stringify({ token: '' }));
|
|
103
|
+
return response(200, 'Existing app set. Don\'t forget to set up the webhook.');
|
|
104
|
+
}
|
|
105
|
+
exports.handler = async function (event) {
|
|
106
|
+
// confirm required environment variables
|
|
107
|
+
if (!process.env.WEBHOOK_URL) {
|
|
108
|
+
throw new Error('Missing environment variables');
|
|
109
|
+
}
|
|
110
|
+
const setupToken = (await helpers_1.getSecretJsonValue(process.env.SETUP_SECRET_ARN)).token;
|
|
111
|
+
// bail out if setup was already completed
|
|
112
|
+
if (!setupToken) {
|
|
113
|
+
return response(200, 'Setup already complete. Put a new token in the setup secret if you want to redo it.');
|
|
114
|
+
}
|
|
115
|
+
if (!event.queryStringParameters) {
|
|
116
|
+
return response(403, 'Wrong setup token.');
|
|
117
|
+
}
|
|
118
|
+
// safely confirm url token matches our secret
|
|
119
|
+
const urlToken = event.queryStringParameters.token || event.queryStringParameters.state || '';
|
|
120
|
+
if (urlToken.length != setupToken.length || !crypto.timingSafeEqual(Buffer.from(urlToken, 'utf-8'), Buffer.from(setupToken, 'utf-8'))) {
|
|
121
|
+
return response(403, 'Wrong setup token.');
|
|
122
|
+
}
|
|
123
|
+
// handle requests
|
|
124
|
+
try {
|
|
125
|
+
if (event.requestContext.http.path == '/') {
|
|
126
|
+
return await handleRoot(event, setupToken);
|
|
127
|
+
}
|
|
128
|
+
else if (event.requestContext.http.path == '/domain' && event.requestContext.http.method == 'POST') {
|
|
129
|
+
return await handleDomain(event);
|
|
130
|
+
}
|
|
131
|
+
else if (event.requestContext.http.path == '/pat' && event.requestContext.http.method == 'POST') {
|
|
132
|
+
return await handlePat(event);
|
|
133
|
+
}
|
|
134
|
+
else if (event.requestContext.http.path == '/complete-new-app' && event.requestContext.http.method == 'GET') {
|
|
135
|
+
return await handleNewApp(event);
|
|
136
|
+
}
|
|
137
|
+
else if (event.requestContext.http.path == '/app' && event.requestContext.http.method == 'POST') {
|
|
138
|
+
return await handleExistingApp(event);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
return response(404, 'Not found');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
return response(500, `<b>Error:</b> ${e}`);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xhbWJkYXMvc2V0dXAubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0RBQXNEO0FBQ3RELGlDQUFpQztBQUNqQyx5QkFBeUI7QUFDekIsd0NBQXdDO0FBR3hDLHFDQUE2QztBQUM3Qyx1Q0FBa0U7QUFFbEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFckQsU0FBUyxPQUFPLENBQUMsT0FBZSxFQUFFLEtBQWEsRUFBRSxNQUFjO0lBQzdELE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDO1NBQzFDLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVksQ0FBQztTQUM3RCxPQUFPLENBQUMsdUJBQXVCLEVBQUUsT0FBTyxDQUFDO1NBQ3pDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUM7U0FDcEMsT0FBTyxDQUFDLHlCQUF5QixFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWlCLENBQUM7U0FDakUsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztTQUN0QyxPQUFPLENBQUMsVUFBVSxFQUFFLGtCQUFrQixLQUFLLEdBQUcsQ0FBQztTQUMvQyxPQUFPLENBQUMsU0FBUyxFQUFFLGlCQUFpQixLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxJQUFZLEVBQUUsSUFBWTtJQUMxQyxPQUFPO1FBQ0wsVUFBVSxFQUFFLElBQUk7UUFDaEIsT0FBTyxFQUFFO1lBQ1AsY0FBYyxFQUFFLFdBQVc7WUFDM0IseUJBQXlCLEVBQUUsc0NBQXNDLEtBQUssc0hBQXNIO1NBQzdMO1FBQ0QsSUFBSSxFQUFFLElBQUk7S0FDWCxDQUFDO0FBQ0osQ0FBQztBQUVELEtBQUssVUFBVSxVQUFVLENBQUMsS0FBdUMsRUFBRSxVQUFrQjtJQUNuRixNQUFNLFlBQVksR0FBRyxXQUFXLEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbEUsTUFBTSxhQUFhLEdBQUcsTUFBTSw0QkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFOUUsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUF1QztJQUN6RCxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ3RCLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0tBQ2xDO0lBQ0QsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFO1FBQ3pCLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDdEQ7SUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVELEtBQUssVUFBVSxZQUFZLENBQUMsS0FBdUM7SUFDakUsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1FBQ2hCLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ3hDO0lBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSw0QkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDOUUsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ25DLE1BQU0sMkJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFdEYsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCxLQUFLLFVBQVUsU0FBUyxDQUFDLEtBQXVDO0lBQzlELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDN0IsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFLCtCQUErQixDQUFDLENBQUM7S0FDdkQ7SUFFRCxNQUFNLDJCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07UUFDbkIsS0FBSyxFQUFFLEVBQUU7UUFDVCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsR0FBRztLQUM1QixDQUFDLENBQUMsQ0FBQztJQUNKLE1BQU0sMkJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVyRixPQUFPLFFBQVEsQ0FBRSxHQUFHLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQsS0FBSyxVQUFVLFlBQVksQ0FBQyxLQUF1QztJQUNqRSxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFO1FBQ2hDLE9BQU8sUUFBUSxDQUFFLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztLQUN2QztJQUVELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7SUFFOUMsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNULE9BQU8sUUFBUSxDQUFFLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztLQUN2QztJQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sNEJBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzlFLE1BQU0sT0FBTyxHQUFHLDBCQUFpQixDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksY0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVyRixNQUFNLDJCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwRSxNQUFNLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJO1FBQzFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDckIsaUJBQWlCLEVBQUUsRUFBRTtLQUN0QixDQUFDLENBQUMsQ0FBQztJQUNKLE1BQU0sMkJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BGLE1BQU0sMkJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3JFLGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWM7S0FDMUMsQ0FBQyxDQUFDLENBQUM7SUFDSixNQUFNLDJCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFckYsT0FBTyxRQUFRLENBQUUsR0FBRyxFQUFFLHlCQUF5QixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsMkRBQTJELENBQUMsQ0FBQztBQUNsSSxDQUFDO0FBRUQsS0FBSyxVQUFVLGlCQUFpQixDQUFDLEtBQXVDO0lBQ3RFLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUvQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1FBQzNDLE9BQU8sUUFBUSxDQUFFLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ3pDO0lBRUQsTUFBTSwyQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1FBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztRQUNqQixpQkFBaUIsRUFBRSxFQUFFO0tBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0osTUFBTSwyQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLElBQUksQ0FBQyxFQUFZLENBQUMsQ0FBQztJQUN0RixNQUFNLDJCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFckYsT0FBTyxRQUFRLENBQUUsR0FBRyxFQUFFLHdEQUF3RCxDQUFDLENBQUM7QUFDbEYsQ0FBQztBQUVELE9BQU8sQ0FBQyxPQUFPLEdBQUcsS0FBSyxXQUFXLEtBQXVDO0lBQ3ZFLHlDQUF5QztJQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUU7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0tBQ2xEO0lBRUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLDRCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUVsRiwwQ0FBMEM7SUFDMUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUNmLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxxRkFBcUYsQ0FBQyxDQUFDO0tBQzdHO0lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRTtRQUNoQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztLQUM1QztJQUVELDhDQUE4QztJQUM5QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMscUJBQXFCLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO0lBQzlGLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFO1FBQ3JJLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0tBQzVDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQUk7UUFDRixJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUU7WUFDekMsT0FBTyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDNUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sRUFBRTtZQUNwRyxPQUFPLE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xDO2FBQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLEVBQUU7WUFDakcsT0FBTyxNQUFNLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMvQjthQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLG1CQUFtQixJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7WUFDN0csT0FBTyxNQUFNLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsQzthQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxFQUFFO1lBQ2pHLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2QzthQUFNO1lBQ0wsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQ25DO0tBQ0Y7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUM1QztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvcmVzdCc7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzLGltcG9ydC9uby11bnJlc29sdmVkICovXG5pbXBvcnQgKiBhcyBBV1NMYW1iZGEgZnJvbSAnYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBiYXNlVXJsRnJvbURvbWFpbiB9IGZyb20gJy4vZ2l0aHViJztcbmltcG9ydCB7IGdldFNlY3JldEpzb25WYWx1ZSwgdXBkYXRlU2VjcmV0VmFsdWUgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5jb25zdCBub25jZSA9IGNyeXB0by5yYW5kb21CeXRlcyg2NCkudG9TdHJpbmcoJ2hleCcpO1xuXG5mdW5jdGlvbiBnZXRIdG1sKGJhc2VVcmw6IHN0cmluZywgdG9rZW46IHN0cmluZywgZG9tYWluOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKCdpbmRleC5odG1sJywgJ3V0Zi04JylcbiAgICAucmVwbGFjZSgvSU5TRVJUX1dFQkhPT0tfVVJMX0hFUkUvZywgcHJvY2Vzcy5lbnYuV0VCSE9PS19VUkwhKVxuICAgIC5yZXBsYWNlKC9JTlNFUlRfQkFTRV9VUkxfSEVSRS9nLCBiYXNlVXJsKVxuICAgIC5yZXBsYWNlKC9JTlNFUlRfVE9LRU5fSEVSRS9nLCB0b2tlbilcbiAgICAucmVwbGFjZSgvSU5TRVJUX1NFQ1JFVF9BUk5fSEVSRS9nLCBwcm9jZXNzLmVudi5TRVRVUF9TRUNSRVRfQVJOISlcbiAgICAucmVwbGFjZSgvSU5TRVJUX0RPTUFJTl9IRVJFL2csIGRvbWFpbilcbiAgICAucmVwbGFjZSgvPHNjcmlwdC9nLCBgPHNjcmlwdCBub25jZT1cIiR7bm9uY2V9XCJgKVxuICAgIC5yZXBsYWNlKC88c3R5bGUvZywgYDxzdHlsZSBub25jZT1cIiR7bm9uY2V9XCJgKTtcbn1cblxuZnVuY3Rpb24gcmVzcG9uc2UoY29kZTogbnVtYmVyLCBib2R5OiBzdHJpbmcpOiBBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5UmVzdWx0VjIge1xuICByZXR1cm4ge1xuICAgIHN0YXR1c0NvZGU6IGNvZGUsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L2h0bWwnLFxuICAgICAgJ0NvbnRlbnQtU2VjdXJpdHktUG9saWN5JzogYGRlZmF1bHQtc3JjICd1bnNhZmUtaW5saW5lJyAnbm9uY2UtJHtub25jZX0nOyBpbWctc3JjIGRhdGE6OyBjb25uZWN0LXNyYyAnc2VsZic7IGZvcm0tYWN0aW9uIGh0dHBzOjsgZnJhbWUtYW5jZXN0b3JzICdub25lJzsgb2JqZWN0LXNyYyAnbm9uZSc7IGJhc2UtdXJpICdzZWxmJ2AsXG4gICAgfSxcbiAgICBib2R5OiBib2R5LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVSb290KGV2ZW50OiBBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5RXZlbnRWMiwgc2V0dXBUb2tlbjogc3RyaW5nKTogUHJvbWlzZTxBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5UmVzdWx0VjI+IHtcbiAgY29uc3Qgc2V0dXBCYXNlVXJsID0gYGh0dHBzOi8vJHtldmVudC5yZXF1ZXN0Q29udGV4dC5kb21haW5OYW1lfWA7XG4gIGNvbnN0IGdpdGh1YlNlY3JldHMgPSBhd2FpdCBnZXRTZWNyZXRKc29uVmFsdWUocHJvY2Vzcy5lbnYuR0lUSFVCX1NFQ1JFVF9BUk4pO1xuXG4gIHJldHVybiByZXNwb25zZSgyMDAsIGdldEh0bWwoc2V0dXBCYXNlVXJsLCBzZXR1cFRva2VuLCBnaXRodWJTZWNyZXRzLmRvbWFpbikpO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVCb2R5KGV2ZW50OiBBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5RXZlbnRWMikge1xuICBsZXQgYm9keSA9IGV2ZW50LmJvZHk7XG4gIGlmICghYm9keSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gYm9keSBmb3VuZCcpO1xuICB9XG4gIGlmIChldmVudC5pc0Jhc2U2NEVuY29kZWQpIHtcbiAgICBib2R5ID0gQnVmZmVyLmZyb20oYm9keSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICB9XG4gIHJldHVybiBKU09OLnBhcnNlKGJvZHkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVEb21haW4oZXZlbnQ6IEFXU0xhbWJkYS5BUElHYXRld2F5UHJveHlFdmVudFYyKTogUHJvbWlzZTxBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5UmVzdWx0VjI+IHtcbiAgY29uc3QgYm9keSA9IGRlY29kZUJvZHkoZXZlbnQpO1xuICBpZiAoIWJvZHkuZG9tYWluKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlKDQwMCwgJ0ludmFsaWQgZG9tYWluJyk7XG4gIH1cblxuICBjb25zdCBnaXRodWJTZWNyZXRzID0gYXdhaXQgZ2V0U2VjcmV0SnNvblZhbHVlKHByb2Nlc3MuZW52LkdJVEhVQl9TRUNSRVRfQVJOKTtcbiAgZ2l0aHViU2VjcmV0cy5kb21haW4gPSBib2R5LmRvbWFpbjtcbiAgYXdhaXQgdXBkYXRlU2VjcmV0VmFsdWUocHJvY2Vzcy5lbnYuR0lUSFVCX1NFQ1JFVF9BUk4sIEpTT04uc3RyaW5naWZ5KGdpdGh1YlNlY3JldHMpKTtcblxuICByZXR1cm4gcmVzcG9uc2UoMjAwLCAnRG9tYWluIHNldCcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVQYXQoZXZlbnQ6IEFXU0xhbWJkYS5BUElHYXRld2F5UHJveHlFdmVudFYyKTogUHJvbWlzZTxBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5UmVzdWx0VjI+IHtcbiAgY29uc3QgYm9keSA9IGRlY29kZUJvZHkoZXZlbnQpO1xuICBpZiAoIWJvZHkucGF0IHx8ICFib2R5LmRvbWFpbikge1xuICAgIHJldHVybiByZXNwb25zZSg0MDAsICdJbnZhbGlkIHBlcnNvbmFsIGFjY2VzcyB0b2tlbicpO1xuICB9XG5cbiAgYXdhaXQgdXBkYXRlU2VjcmV0VmFsdWUocHJvY2Vzcy5lbnYuR0lUSFVCX1NFQ1JFVF9BUk4sIEpTT04uc3RyaW5naWZ5KHtcbiAgICBkb21haW46IGJvZHkuZG9tYWluLFxuICAgIGFwcElkOiAnJyxcbiAgICBwZXJzb25hbEF1dGhUb2tlbjogYm9keS5wYXQsXG4gIH0pKTtcbiAgYXdhaXQgdXBkYXRlU2VjcmV0VmFsdWUocHJvY2Vzcy5lbnYuU0VUVVBfU0VDUkVUX0FSTiwgSlNPTi5zdHJpbmdpZnkoeyB0b2tlbjogJycgfSkpO1xuXG4gIHJldHVybiByZXNwb25zZSggMjAwLCAnUGVyc29uYWwgYWNjZXNzIHRva2VuIHNldCcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVOZXdBcHAoZXZlbnQ6IEFXU0xhbWJkYS5BUElHYXRld2F5UHJveHlFdmVudFYyKTogUHJvbWlzZTxBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5UmVzdWx0VjI+IHtcbiAgaWYgKCFldmVudC5xdWVyeVN0cmluZ1BhcmFtZXRlcnMpIHtcbiAgICByZXR1cm4gcmVzcG9uc2UoIDQwMCwgJ0ludmFsaWQgY29kZScpO1xuICB9XG5cbiAgY29uc3QgY29kZSA9IGV2ZW50LnF1ZXJ5U3RyaW5nUGFyYW1ldGVycy5jb2RlO1xuXG4gIGlmICghY29kZSkge1xuICAgIHJldHVybiByZXNwb25zZSggNDAwLCAnSW52YWxpZCBjb2RlJyk7XG4gIH1cblxuICBjb25zdCBnaXRodWJTZWNyZXRzID0gYXdhaXQgZ2V0U2VjcmV0SnNvblZhbHVlKHByb2Nlc3MuZW52LkdJVEhVQl9TRUNSRVRfQVJOKTtcbiAgY29uc3QgYmFzZVVybCA9IGJhc2VVcmxGcm9tRG9tYWluKGdpdGh1YlNlY3JldHMuZG9tYWluKTtcbiAgY29uc3QgbmV3QXBwID0gYXdhaXQgbmV3IE9jdG9raXQoeyBiYXNlVXJsIH0pLnJlc3QuYXBwcy5jcmVhdGVGcm9tTWFuaWZlc3QoeyBjb2RlIH0pO1xuXG4gIGF3YWl0IHVwZGF0ZVNlY3JldFZhbHVlKHByb2Nlc3MuZW52LkdJVEhVQl9TRUNSRVRfQVJOLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgZG9tYWluOiBuZXcgVVJMKG5ld0FwcC5kYXRhLmh0bWxfdXJsKS5ob3N0LFxuICAgIGFwcElkOiBuZXdBcHAuZGF0YS5pZCxcbiAgICBwZXJzb25hbEF1dGhUb2tlbjogJycsXG4gIH0pKTtcbiAgYXdhaXQgdXBkYXRlU2VjcmV0VmFsdWUocHJvY2Vzcy5lbnYuR0lUSFVCX1BSSVZBVEVfS0VZX1NFQ1JFVF9BUk4sIG5ld0FwcC5kYXRhLnBlbSk7XG4gIGF3YWl0IHVwZGF0ZVNlY3JldFZhbHVlKHByb2Nlc3MuZW52LldFQkhPT0tfU0VDUkVUX0FSTiwgSlNPTi5zdHJpbmdpZnkoe1xuICAgIHdlYmhvb2tTZWNyZXQ6IG5ld0FwcC5kYXRhLndlYmhvb2tfc2VjcmV0LFxuICB9KSk7XG4gIGF3YWl0IHVwZGF0ZVNlY3JldFZhbHVlKHByb2Nlc3MuZW52LlNFVFVQX1NFQ1JFVF9BUk4sIEpTT04uc3RyaW5naWZ5KHsgdG9rZW46ICcnIH0pKTtcblxuICByZXR1cm4gcmVzcG9uc2UoIDIwMCwgYE5ldyBhcHAgc2V0LiA8YSBocmVmPVwiJHtuZXdBcHAuZGF0YS5odG1sX3VybH0vaW5zdGFsbGF0aW9ucy9uZXdcIj5JbnN0YWxsIGl0PC9hPiBmb3IgeW91ciByZXBvc2l0b3JpZXMuYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUV4aXN0aW5nQXBwKGV2ZW50OiBBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5RXZlbnRWMik6IFByb21pc2U8QVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eVJlc3VsdFYyPiB7XG4gIGNvbnN0IGJvZHkgPSBkZWNvZGVCb2R5KGV2ZW50KTtcblxuICBpZiAoIWJvZHkuYXBwaWQgfHwgIWJvZHkucGsgfHwgIWJvZHkuZG9tYWluKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlKCA0MDAsICdNaXNzaW5nIGZpZWxkcycpO1xuICB9XG5cbiAgYXdhaXQgdXBkYXRlU2VjcmV0VmFsdWUocHJvY2Vzcy5lbnYuR0lUSFVCX1NFQ1JFVF9BUk4sIEpTT04uc3RyaW5naWZ5KHtcbiAgICBkb21haW46IGJvZHkuZG9tYWluLFxuICAgIGFwcElkOiBib2R5LmFwcGlkLFxuICAgIHBlcnNvbmFsQXV0aFRva2VuOiAnJyxcbiAgfSkpO1xuICBhd2FpdCB1cGRhdGVTZWNyZXRWYWx1ZShwcm9jZXNzLmVudi5HSVRIVUJfUFJJVkFURV9LRVlfU0VDUkVUX0FSTiwgYm9keS5wayBhcyBzdHJpbmcpO1xuICBhd2FpdCB1cGRhdGVTZWNyZXRWYWx1ZShwcm9jZXNzLmVudi5TRVRVUF9TRUNSRVRfQVJOLCBKU09OLnN0cmluZ2lmeSh7IHRva2VuOiAnJyB9KSk7XG5cbiAgcmV0dXJuIHJlc3BvbnNlKCAyMDAsICdFeGlzdGluZyBhcHAgc2V0LiBEb25cXCd0IGZvcmdldCB0byBzZXQgdXAgdGhlIHdlYmhvb2suJyk7XG59XG5cbmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudDogQVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eUV2ZW50VjIpOiBQcm9taXNlPEFXU0xhbWJkYS5BUElHYXRld2F5UHJveHlSZXN1bHRWMj4ge1xuICAvLyBjb25maXJtIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICBpZiAoIXByb2Nlc3MuZW52LldFQkhPT0tfVVJMKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcycpO1xuICB9XG5cbiAgY29uc3Qgc2V0dXBUb2tlbiA9IChhd2FpdCBnZXRTZWNyZXRKc29uVmFsdWUocHJvY2Vzcy5lbnYuU0VUVVBfU0VDUkVUX0FSTikpLnRva2VuO1xuXG4gIC8vIGJhaWwgb3V0IGlmIHNldHVwIHdhcyBhbHJlYWR5IGNvbXBsZXRlZFxuICBpZiAoIXNldHVwVG9rZW4pIHtcbiAgICByZXR1cm4gcmVzcG9uc2UoMjAwLCAnU2V0dXAgYWxyZWFkeSBjb21wbGV0ZS4gUHV0IGEgbmV3IHRva2VuIGluIHRoZSBzZXR1cCBzZWNyZXQgaWYgeW91IHdhbnQgdG8gcmVkbyBpdC4nKTtcbiAgfVxuXG4gIGlmICghZXZlbnQucXVlcnlTdHJpbmdQYXJhbWV0ZXJzKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlKDQwMywgJ1dyb25nIHNldHVwIHRva2VuLicpO1xuICB9XG5cbiAgLy8gc2FmZWx5IGNvbmZpcm0gdXJsIHRva2VuIG1hdGNoZXMgb3VyIHNlY3JldFxuICBjb25zdCB1cmxUb2tlbiA9IGV2ZW50LnF1ZXJ5U3RyaW5nUGFyYW1ldGVycy50b2tlbiB8fCBldmVudC5xdWVyeVN0cmluZ1BhcmFtZXRlcnMuc3RhdGUgfHwgJyc7XG4gIGlmICh1cmxUb2tlbi5sZW5ndGggIT0gc2V0dXBUb2tlbi5sZW5ndGggfHwgIWNyeXB0by50aW1pbmdTYWZlRXF1YWwoQnVmZmVyLmZyb20odXJsVG9rZW4sICd1dGYtOCcpLCBCdWZmZXIuZnJvbShzZXR1cFRva2VuLCAndXRmLTgnKSkpIHtcbiAgICByZXR1cm4gcmVzcG9uc2UoNDAzLCAnV3Jvbmcgc2V0dXAgdG9rZW4uJyk7XG4gIH1cblxuICAvLyBoYW5kbGUgcmVxdWVzdHNcbiAgdHJ5IHtcbiAgICBpZiAoZXZlbnQucmVxdWVzdENvbnRleHQuaHR0cC5wYXRoID09ICcvJykge1xuICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZVJvb3QoZXZlbnQsIHNldHVwVG9rZW4pO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQucmVxdWVzdENvbnRleHQuaHR0cC5wYXRoID09ICcvZG9tYWluJyAmJiBldmVudC5yZXF1ZXN0Q29udGV4dC5odHRwLm1ldGhvZCA9PSAnUE9TVCcpIHtcbiAgICAgIHJldHVybiBhd2FpdCBoYW5kbGVEb21haW4oZXZlbnQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQucmVxdWVzdENvbnRleHQuaHR0cC5wYXRoID09ICcvcGF0JyAmJiBldmVudC5yZXF1ZXN0Q29udGV4dC5odHRwLm1ldGhvZCA9PSAnUE9TVCcpIHtcbiAgICAgIHJldHVybiBhd2FpdCBoYW5kbGVQYXQoZXZlbnQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQucmVxdWVzdENvbnRleHQuaHR0cC5wYXRoID09ICcvY29tcGxldGUtbmV3LWFwcCcgJiYgZXZlbnQucmVxdWVzdENvbnRleHQuaHR0cC5tZXRob2QgPT0gJ0dFVCcpIHtcbiAgICAgIHJldHVybiBhd2FpdCBoYW5kbGVOZXdBcHAoZXZlbnQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQucmVxdWVzdENvbnRleHQuaHR0cC5wYXRoID09ICcvYXBwJyAmJiBldmVudC5yZXF1ZXN0Q29udGV4dC5odHRwLm1ldGhvZCA9PSAnUE9TVCcpIHtcbiAgICAgIHJldHVybiBhd2FpdCBoYW5kbGVFeGlzdGluZ0FwcChldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXNwb25zZSg0MDQsICdOb3QgZm91bmQnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gcmVzcG9uc2UoNTAwLCBgPGI+RXJyb3I6PC9iPiAke2V9YCk7XG4gIH1cbn07XG4iXX0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
/**
|
|
4
|
+
* Props for StatusFunction
|
|
5
|
+
*/
|
|
6
|
+
export interface StatusFunctionProps extends lambda.FunctionOptions {
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* An AWS Lambda function which executes src/lambdas/status.
|
|
10
|
+
*/
|
|
11
|
+
export declare class StatusFunction extends lambda.Function {
|
|
12
|
+
constructor(scope: Construct, id: string, props?: StatusFunctionProps);
|
|
13
|
+
}
|