@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.
Files changed (51) hide show
  1. package/.jsii +70 -70
  2. package/API.md +3 -3
  3. package/README.md +52 -7
  4. package/assets/delete-failed-runner.lambda/index.js +44 -20
  5. package/assets/idle-runner-repear.lambda/index.js +44 -20
  6. package/assets/image-builders/aws-image-builder/delete-resources.lambda/index.js +209 -0
  7. package/assets/image-builders/aws-image-builder/versioner.lambda/index.js +28 -4
  8. package/assets/image-builders/build-image.lambda/index.js +0 -24
  9. package/assets/setup.lambda/index.js +16 -16
  10. package/assets/status.lambda/index.js +44 -20
  11. package/assets/token-retriever.lambda/index.js +44 -20
  12. package/assets/webhook-handler.lambda/index.js +44 -20
  13. package/lib/access.js +1 -1
  14. package/lib/image-builders/api.js +1 -1
  15. package/lib/image-builders/aws-image-builder/ami.d.ts +8 -0
  16. package/lib/image-builders/aws-image-builder/ami.js +3 -1
  17. package/lib/image-builders/aws-image-builder/builder.d.ts +2 -0
  18. package/lib/image-builders/aws-image-builder/builder.js +108 -68
  19. package/lib/image-builders/aws-image-builder/common.js +1 -1
  20. package/lib/image-builders/aws-image-builder/container.d.ts +6 -0
  21. package/lib/image-builders/aws-image-builder/container.js +3 -1
  22. package/lib/image-builders/aws-image-builder/delete-resources-function.d.ts +13 -0
  23. package/lib/image-builders/aws-image-builder/delete-resources-function.js +23 -0
  24. package/lib/image-builders/aws-image-builder/delete-resources.lambda.d.ts +9 -0
  25. package/lib/image-builders/aws-image-builder/delete-resources.lambda.js +159 -0
  26. package/lib/image-builders/aws-image-builder/deprecated/ami.d.ts +2 -2
  27. package/lib/image-builders/aws-image-builder/deprecated/ami.js +18 -37
  28. package/lib/image-builders/aws-image-builder/deprecated/container.js +13 -35
  29. package/lib/image-builders/aws-image-builder/deprecated/linux-components.js +1 -1
  30. package/lib/image-builders/aws-image-builder/deprecated/windows-components.js +1 -1
  31. package/lib/image-builders/aws-image-builder/workflow.js +2 -1
  32. package/lib/image-builders/build-image.lambda.d.ts +1 -3
  33. package/lib/image-builders/build-image.lambda.js +1 -25
  34. package/lib/image-builders/codebuild-deprecated.js +3 -3
  35. package/lib/image-builders/codebuild.js +2 -2
  36. package/lib/image-builders/components.js +1 -1
  37. package/lib/image-builders/static.js +1 -1
  38. package/lib/providers/codebuild.js +2 -2
  39. package/lib/providers/common.js +3 -3
  40. package/lib/providers/ec2.js +2 -2
  41. package/lib/providers/ecs.js +1 -1
  42. package/lib/providers/fargate.js +2 -2
  43. package/lib/providers/lambda.js +2 -2
  44. package/lib/runner.js +1 -1
  45. package/lib/secrets.js +1 -1
  46. package/package.json +27 -26
  47. package/assets/image-builders/aws-image-builder/delete-ami.lambda/index.js +0 -129
  48. package/lib/image-builders/aws-image-builder/delete-ami-function.d.ts +0 -13
  49. package/lib/image-builders/aws-image-builder/delete-ami-function.js +0 -23
  50. package/lib/image-builders/aws-image-builder/delete-ami.lambda.d.ts +0 -2
  51. 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.format();
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().split(/\s+/).join(" ");
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.format();
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
  }