@cloudsnorkel/cdk-github-runners 0.14.0 → 0.14.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/.jsii +70 -70
- package/API.md +3 -3
- package/README.md +52 -7
- package/assets/delete-failed-runner.lambda/index.js +44 -20
- package/assets/idle-runner-repear.lambda/index.js +44 -20
- package/assets/image-builders/aws-image-builder/delete-resources.lambda/index.js +209 -0
- package/assets/image-builders/aws-image-builder/versioner.lambda/index.js +28 -4
- package/assets/image-builders/build-image.lambda/index.js +0 -24
- package/assets/setup.lambda/index.js +16 -16
- package/assets/status.lambda/index.js +44 -20
- package/assets/token-retriever.lambda/index.js +44 -20
- package/assets/webhook-handler.lambda/index.js +44 -20
- package/lib/access.js +1 -1
- package/lib/image-builders/api.js +1 -1
- package/lib/image-builders/aws-image-builder/ami.d.ts +8 -0
- package/lib/image-builders/aws-image-builder/ami.js +3 -1
- package/lib/image-builders/aws-image-builder/builder.d.ts +2 -0
- package/lib/image-builders/aws-image-builder/builder.js +108 -68
- package/lib/image-builders/aws-image-builder/common.js +1 -1
- package/lib/image-builders/aws-image-builder/container.d.ts +6 -0
- package/lib/image-builders/aws-image-builder/container.js +3 -1
- package/lib/image-builders/aws-image-builder/delete-resources-function.d.ts +13 -0
- package/lib/image-builders/aws-image-builder/delete-resources-function.js +23 -0
- package/lib/image-builders/aws-image-builder/delete-resources.lambda.d.ts +9 -0
- package/lib/image-builders/aws-image-builder/delete-resources.lambda.js +159 -0
- package/lib/image-builders/aws-image-builder/deprecated/ami.d.ts +2 -2
- package/lib/image-builders/aws-image-builder/deprecated/ami.js +18 -37
- package/lib/image-builders/aws-image-builder/deprecated/container.js +13 -35
- package/lib/image-builders/aws-image-builder/deprecated/linux-components.js +1 -1
- package/lib/image-builders/aws-image-builder/deprecated/windows-components.js +1 -1
- package/lib/image-builders/aws-image-builder/workflow.js +2 -1
- package/lib/image-builders/build-image.lambda.d.ts +1 -3
- package/lib/image-builders/build-image.lambda.js +1 -25
- package/lib/image-builders/codebuild-deprecated.js +3 -3
- package/lib/image-builders/codebuild.js +2 -2
- package/lib/image-builders/components.js +1 -1
- package/lib/image-builders/static.js +1 -1
- package/lib/providers/codebuild.js +2 -2
- package/lib/providers/common.js +3 -3
- package/lib/providers/ec2.js +2 -2
- package/lib/providers/ecs.js +1 -1
- package/lib/providers/fargate.js +2 -2
- package/lib/providers/lambda.js +2 -2
- package/lib/runner.js +1 -1
- package/lib/secrets.js +1 -1
- package/package.json +27 -26
- package/assets/image-builders/aws-image-builder/delete-ami.lambda/index.js +0 -129
- package/lib/image-builders/aws-image-builder/delete-ami-function.d.ts +0 -13
- package/lib/image-builders/aws-image-builder/delete-ami-function.js +0 -23
- package/lib/image-builders/aws-image-builder/delete-ami.lambda.d.ts +0 -2
- package/lib/image-builders/aws-image-builder/delete-ami.lambda.js +0 -70
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/image-builders/aws-image-builder/delete-resources.lambda.ts
|
|
21
|
+
var delete_resources_lambda_exports = {};
|
|
22
|
+
__export(delete_resources_lambda_exports, {
|
|
23
|
+
handler: () => handler
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(delete_resources_lambda_exports);
|
|
26
|
+
var import_client_ec2 = require("@aws-sdk/client-ec2");
|
|
27
|
+
var import_client_ecr = require("@aws-sdk/client-ecr");
|
|
28
|
+
var import_client_imagebuilder = require("@aws-sdk/client-imagebuilder");
|
|
29
|
+
|
|
30
|
+
// src/lambda-helpers.ts
|
|
31
|
+
var import_client_secrets_manager = require("@aws-sdk/client-secrets-manager");
|
|
32
|
+
var sm = new import_client_secrets_manager.SecretsManagerClient();
|
|
33
|
+
async function customResourceRespond(event, responseStatus, reason, physicalResourceId, data) {
|
|
34
|
+
const responseBody = JSON.stringify({
|
|
35
|
+
Status: responseStatus,
|
|
36
|
+
Reason: reason,
|
|
37
|
+
PhysicalResourceId: physicalResourceId,
|
|
38
|
+
StackId: event.StackId,
|
|
39
|
+
RequestId: event.RequestId,
|
|
40
|
+
LogicalResourceId: event.LogicalResourceId,
|
|
41
|
+
NoEcho: false,
|
|
42
|
+
Data: data
|
|
43
|
+
});
|
|
44
|
+
console.log("Responding", responseBody);
|
|
45
|
+
const parsedUrl = require("url").parse(event.ResponseURL);
|
|
46
|
+
const requestOptions = {
|
|
47
|
+
hostname: parsedUrl.hostname,
|
|
48
|
+
path: parsedUrl.path,
|
|
49
|
+
method: "PUT",
|
|
50
|
+
headers: {
|
|
51
|
+
"content-type": "",
|
|
52
|
+
"content-length": responseBody.length
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
try {
|
|
57
|
+
const request = require("https").request(requestOptions, resolve);
|
|
58
|
+
request.on("error", reject);
|
|
59
|
+
request.write(responseBody);
|
|
60
|
+
request.end();
|
|
61
|
+
} catch (e) {
|
|
62
|
+
reject(e);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// src/image-builders/aws-image-builder/delete-resources.lambda.ts
|
|
68
|
+
var ec2 = new import_client_ec2.EC2Client();
|
|
69
|
+
var ecr = new import_client_ecr.ECRClient();
|
|
70
|
+
var ib = new import_client_imagebuilder.ImagebuilderClient();
|
|
71
|
+
async function deleteResources(props) {
|
|
72
|
+
const buildsToDelete = [];
|
|
73
|
+
const amisToDelete = [];
|
|
74
|
+
const dockerImagesToDelete = [];
|
|
75
|
+
let result = {};
|
|
76
|
+
do {
|
|
77
|
+
result = await ib.send(new import_client_imagebuilder.ListImageBuildVersionsCommand({
|
|
78
|
+
imageVersionArn: props.ImageVersionArn,
|
|
79
|
+
nextToken: result.nextToken
|
|
80
|
+
}));
|
|
81
|
+
if (result.imageSummaryList) {
|
|
82
|
+
for (const image of result.imageSummaryList) {
|
|
83
|
+
if (image.arn) {
|
|
84
|
+
buildsToDelete.push(image.arn);
|
|
85
|
+
}
|
|
86
|
+
for (const output of image.outputResources?.amis ?? []) {
|
|
87
|
+
if (output.image) {
|
|
88
|
+
amisToDelete.push(output.image);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
for (const output of image.outputResources?.containers ?? []) {
|
|
92
|
+
if (output.imageUris) {
|
|
93
|
+
dockerImagesToDelete.push(...output.imageUris);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
} while (result.nextToken);
|
|
99
|
+
for (const imageId of amisToDelete) {
|
|
100
|
+
try {
|
|
101
|
+
console.log({
|
|
102
|
+
notice: "Deleting AMI",
|
|
103
|
+
image: imageId
|
|
104
|
+
});
|
|
105
|
+
const imageDesc = await ec2.send(new import_client_ec2.DescribeImagesCommand({
|
|
106
|
+
Owners: ["self"],
|
|
107
|
+
ImageIds: [imageId]
|
|
108
|
+
}));
|
|
109
|
+
if (imageDesc.Images?.length !== 1) {
|
|
110
|
+
console.warn({
|
|
111
|
+
notice: "Unable to find AMI",
|
|
112
|
+
image: imageId
|
|
113
|
+
});
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
await ec2.send(new import_client_ec2.DeregisterImageCommand({
|
|
117
|
+
ImageId: imageId
|
|
118
|
+
}));
|
|
119
|
+
for (const blockMapping of imageDesc.Images[0].BlockDeviceMappings ?? []) {
|
|
120
|
+
if (blockMapping.Ebs?.SnapshotId) {
|
|
121
|
+
console.log({
|
|
122
|
+
notice: "Deleting EBS snapshot",
|
|
123
|
+
image: imageId,
|
|
124
|
+
snapshot: blockMapping.Ebs.SnapshotId
|
|
125
|
+
});
|
|
126
|
+
await ec2.send(new import_client_ec2.DeleteSnapshotCommand({
|
|
127
|
+
SnapshotId: blockMapping.Ebs.SnapshotId
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
} catch (e) {
|
|
132
|
+
console.warn({
|
|
133
|
+
notice: "Failed to delete AMI",
|
|
134
|
+
image: imageId,
|
|
135
|
+
error: e
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
for (const image of dockerImagesToDelete) {
|
|
140
|
+
try {
|
|
141
|
+
console.log({
|
|
142
|
+
notice: "Deleting Docker Image",
|
|
143
|
+
image
|
|
144
|
+
});
|
|
145
|
+
const parts = image.split("/")[1].split(":");
|
|
146
|
+
const repo = parts[0];
|
|
147
|
+
const tag = parts[1];
|
|
148
|
+
await ecr.send(new import_client_ecr.BatchDeleteImageCommand({
|
|
149
|
+
repositoryName: repo,
|
|
150
|
+
imageIds: [
|
|
151
|
+
{
|
|
152
|
+
imageTag: tag
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
}));
|
|
156
|
+
} catch (e) {
|
|
157
|
+
console.warn({
|
|
158
|
+
notice: "Failed to delete docker image",
|
|
159
|
+
image,
|
|
160
|
+
error: e
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
for (const build of buildsToDelete) {
|
|
165
|
+
try {
|
|
166
|
+
console.log({
|
|
167
|
+
notice: "Deleting Image Build",
|
|
168
|
+
build
|
|
169
|
+
});
|
|
170
|
+
await ib.send(new import_client_imagebuilder.DeleteImageCommand({
|
|
171
|
+
imageBuildVersionArn: build
|
|
172
|
+
}));
|
|
173
|
+
} catch (e) {
|
|
174
|
+
console.warn({
|
|
175
|
+
notice: "Failed to delete image version build",
|
|
176
|
+
build,
|
|
177
|
+
error: e
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async function handler(event, _context) {
|
|
183
|
+
try {
|
|
184
|
+
console.log({
|
|
185
|
+
...event,
|
|
186
|
+
ResponseURL: "..."
|
|
187
|
+
});
|
|
188
|
+
const props = event.ResourceProperties;
|
|
189
|
+
switch (event.RequestType) {
|
|
190
|
+
case "Create":
|
|
191
|
+
case "Update":
|
|
192
|
+
await customResourceRespond(event, "SUCCESS", "OK", props.ImageVersionArn, {});
|
|
193
|
+
break;
|
|
194
|
+
case "Delete":
|
|
195
|
+
if (event.PhysicalResourceId != "FAIL") {
|
|
196
|
+
await deleteResources(props);
|
|
197
|
+
}
|
|
198
|
+
await customResourceRespond(event, "SUCCESS", "OK", event.PhysicalResourceId, {});
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
} catch (e) {
|
|
202
|
+
console.error(e);
|
|
203
|
+
await customResourceRespond(event, "FAILED", e.message || "Internal Error", "FAIL", {});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
207
|
+
0 && (module.exports = {
|
|
208
|
+
handler
|
|
209
|
+
});
|
|
@@ -364,6 +364,8 @@ var require_semver = __commonJS({
|
|
|
364
364
|
this.inc("patch", identifier, identifierBase);
|
|
365
365
|
this.inc("pre", identifier, identifierBase);
|
|
366
366
|
break;
|
|
367
|
+
// If the input is a non-prerelease version, this acts the same as
|
|
368
|
+
// prepatch.
|
|
367
369
|
case "prerelease":
|
|
368
370
|
if (this.prerelease.length === 0) {
|
|
369
371
|
this.inc("patch", identifier, identifierBase);
|
|
@@ -391,6 +393,8 @@ var require_semver = __commonJS({
|
|
|
391
393
|
}
|
|
392
394
|
this.prerelease = [];
|
|
393
395
|
break;
|
|
396
|
+
// This probably shouldn't be used publicly.
|
|
397
|
+
// 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
|
|
394
398
|
case "pre": {
|
|
395
399
|
const base = Number(identifierBase) ? 1 : 0;
|
|
396
400
|
if (!identifier && identifierBase === false) {
|
|
@@ -864,6 +868,7 @@ var require_lrucache = __commonJS({
|
|
|
864
868
|
var require_range = __commonJS({
|
|
865
869
|
"node_modules/semver/classes/range.js"(exports2, module2) {
|
|
866
870
|
"use strict";
|
|
871
|
+
var SPACE_CHARACTERS = /\s+/g;
|
|
867
872
|
var Range = class _Range {
|
|
868
873
|
constructor(range, options) {
|
|
869
874
|
options = parseOptions(options);
|
|
@@ -877,13 +882,13 @@ var require_range = __commonJS({
|
|
|
877
882
|
if (range instanceof Comparator) {
|
|
878
883
|
this.raw = range.value;
|
|
879
884
|
this.set = [[range]];
|
|
880
|
-
this.
|
|
885
|
+
this.formatted = void 0;
|
|
881
886
|
return this;
|
|
882
887
|
}
|
|
883
888
|
this.options = options;
|
|
884
889
|
this.loose = !!options.loose;
|
|
885
890
|
this.includePrerelease = !!options.includePrerelease;
|
|
886
|
-
this.raw = range.trim().
|
|
891
|
+
this.raw = range.trim().replace(SPACE_CHARACTERS, " ");
|
|
887
892
|
this.set = this.raw.split("||").map((r) => this.parseRange(r.trim())).filter((c) => c.length);
|
|
888
893
|
if (!this.set.length) {
|
|
889
894
|
throw new TypeError(`Invalid SemVer Range: ${this.raw}`);
|
|
@@ -902,10 +907,27 @@ var require_range = __commonJS({
|
|
|
902
907
|
}
|
|
903
908
|
}
|
|
904
909
|
}
|
|
905
|
-
this.
|
|
910
|
+
this.formatted = void 0;
|
|
911
|
+
}
|
|
912
|
+
get range() {
|
|
913
|
+
if (this.formatted === void 0) {
|
|
914
|
+
this.formatted = "";
|
|
915
|
+
for (let i = 0; i < this.set.length; i++) {
|
|
916
|
+
if (i > 0) {
|
|
917
|
+
this.formatted += "||";
|
|
918
|
+
}
|
|
919
|
+
const comps = this.set[i];
|
|
920
|
+
for (let k = 0; k < comps.length; k++) {
|
|
921
|
+
if (k > 0) {
|
|
922
|
+
this.formatted += " ";
|
|
923
|
+
}
|
|
924
|
+
this.formatted += comps[k].toString().trim();
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
return this.formatted;
|
|
906
929
|
}
|
|
907
930
|
format() {
|
|
908
|
-
this.range = this.set.map((comps) => comps.join(" ").trim()).join("||").trim();
|
|
909
931
|
return this.range;
|
|
910
932
|
}
|
|
911
933
|
toString() {
|
|
@@ -1447,6 +1469,7 @@ var require_min_version = __commonJS({
|
|
|
1447
1469
|
compver.prerelease.push(0);
|
|
1448
1470
|
}
|
|
1449
1471
|
compver.raw = compver.format();
|
|
1472
|
+
/* fallthrough */
|
|
1450
1473
|
case "":
|
|
1451
1474
|
case ">=":
|
|
1452
1475
|
if (!setMin || gt(compver, setMin)) {
|
|
@@ -1456,6 +1479,7 @@ var require_min_version = __commonJS({
|
|
|
1456
1479
|
case "<":
|
|
1457
1480
|
case "<=":
|
|
1458
1481
|
break;
|
|
1482
|
+
/* istanbul ignore next */
|
|
1459
1483
|
default:
|
|
1460
1484
|
throw new Error(`Unexpected operation: ${comparator.operator}`);
|
|
1461
1485
|
}
|
|
@@ -24,7 +24,6 @@ __export(build_image_lambda_exports, {
|
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(build_image_lambda_exports);
|
|
26
26
|
var import_client_codebuild = require("@aws-sdk/client-codebuild");
|
|
27
|
-
var import_client_imagebuilder = require("@aws-sdk/client-imagebuilder");
|
|
28
27
|
|
|
29
28
|
// src/lambda-helpers.ts
|
|
30
29
|
var import_client_secrets_manager = require("@aws-sdk/client-secrets-manager");
|
|
@@ -65,7 +64,6 @@ async function customResourceRespond(event, responseStatus, reason, physicalReso
|
|
|
65
64
|
|
|
66
65
|
// src/image-builders/build-image.lambda.ts
|
|
67
66
|
var codebuild = new import_client_codebuild.CodeBuildClient();
|
|
68
|
-
var ib = new import_client_imagebuilder.ImagebuilderClient();
|
|
69
67
|
async function handler(event, context) {
|
|
70
68
|
try {
|
|
71
69
|
console.log({ ...event, ResponseURL: "..." });
|
|
@@ -73,10 +71,6 @@ async function handler(event, context) {
|
|
|
73
71
|
switch (event.RequestType) {
|
|
74
72
|
case "Create":
|
|
75
73
|
case "Update":
|
|
76
|
-
if (props.DeleteOnly) {
|
|
77
|
-
await customResourceRespond(event, "SUCCESS", "OK", "Deleter", {});
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
74
|
console.log(`Starting CodeBuild project ${props.ProjectName}`);
|
|
81
75
|
const cbRes = await codebuild.send(new import_client_codebuild.StartBuildCommand({
|
|
82
76
|
projectName: props.ProjectName,
|
|
@@ -91,24 +85,6 @@ async function handler(event, context) {
|
|
|
91
85
|
await customResourceRespond(event, "SUCCESS", "OK", cbRes.build?.id ?? "build", {});
|
|
92
86
|
break;
|
|
93
87
|
case "Delete":
|
|
94
|
-
if (props.ImageBuilderName) {
|
|
95
|
-
const ibImages = await ib.send(new import_client_imagebuilder.ListImagesCommand({ filters: [{ name: "name", values: [props.ImageBuilderName] }] }));
|
|
96
|
-
if (ibImages.imageVersionList) {
|
|
97
|
-
for (const v of ibImages.imageVersionList) {
|
|
98
|
-
if (v.arn) {
|
|
99
|
-
const ibImageVersions = await ib.send(new import_client_imagebuilder.ListImageBuildVersionsCommand({ imageVersionArn: v.arn }));
|
|
100
|
-
if (ibImageVersions.imageSummaryList) {
|
|
101
|
-
for (const vs of ibImageVersions.imageSummaryList) {
|
|
102
|
-
if (vs.arn) {
|
|
103
|
-
console.log(`Deleting ${vs.arn}`);
|
|
104
|
-
await ib.send(new import_client_imagebuilder.DeleteImageCommand({ imageBuildVersionArn: vs.arn }));
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
88
|
await customResourceRespond(event, "SUCCESS", "OK", event.PhysicalResourceId, {});
|
|
113
89
|
break;
|
|
114
90
|
}
|