@cloudsnorkel/cdk-github-runners 0.12.4 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/.jsii +340 -202
  2. package/API.md +21 -1
  3. package/assets/idle-runner-repear.lambda/index.js +44 -11
  4. package/assets/image-builders/aws-image-builder/delete-ami.lambda/index.js +9 -4
  5. package/assets/image-builders/aws-image-builder/filter-failed-builds.lambda/index.js +1 -1
  6. package/assets/image-builders/aws-image-builder/versioner.lambda/index.js +1 -1
  7. package/assets/image-builders/build-image.lambda/index.js +11 -27
  8. package/assets/providers/ami-root-device.lambda/index.js +1 -1
  9. package/assets/providers/update-lambda.lambda/index.js +1 -1
  10. package/assets/setup.lambda/index.html +1 -1
  11. package/assets/webhook-handler.lambda/index.js +26 -10
  12. package/lib/access.js +1 -1
  13. package/lib/idle-runner-repear.lambda.js +45 -12
  14. package/lib/image-builders/api.js +3 -3
  15. package/lib/image-builders/aws-image-builder/ami.js +9 -1
  16. package/lib/image-builders/aws-image-builder/builder.d.ts +2 -1
  17. package/lib/image-builders/aws-image-builder/builder.js +24 -11
  18. package/lib/image-builders/aws-image-builder/common.js +3 -2
  19. package/lib/image-builders/aws-image-builder/container.d.ts +2 -4
  20. package/lib/image-builders/aws-image-builder/container.js +6 -2
  21. package/lib/image-builders/aws-image-builder/delete-ami.lambda.js +10 -5
  22. package/lib/image-builders/aws-image-builder/deprecated/ami.js +1 -1
  23. package/lib/image-builders/aws-image-builder/deprecated/common.js +2 -2
  24. package/lib/image-builders/aws-image-builder/deprecated/container.js +3 -3
  25. package/lib/image-builders/aws-image-builder/deprecated/linux-components.js +1 -1
  26. package/lib/image-builders/aws-image-builder/deprecated/windows-components.js +1 -1
  27. package/lib/image-builders/aws-image-builder/filter-failed-builds.lambda.js +2 -2
  28. package/lib/image-builders/aws-image-builder/versioner.lambda.js +2 -2
  29. package/lib/image-builders/build-image.lambda.d.ts +11 -0
  30. package/lib/image-builders/build-image.lambda.js +12 -30
  31. package/lib/image-builders/codebuild-deprecated.js +1 -1
  32. package/lib/image-builders/codebuild.d.ts +1 -0
  33. package/lib/image-builders/codebuild.js +52 -27
  34. package/lib/image-builders/common.d.ts +10 -0
  35. package/lib/image-builders/common.js +1 -1
  36. package/lib/image-builders/components.js +12 -4
  37. package/lib/image-builders/static.js +1 -1
  38. package/lib/providers/ami-root-device.lambda.js +2 -2
  39. package/lib/providers/codebuild.js +4 -4
  40. package/lib/providers/common.d.ts +5 -1
  41. package/lib/providers/common.js +12 -7
  42. package/lib/providers/ec2.js +2 -2
  43. package/lib/providers/ecs.js +6 -6
  44. package/lib/providers/fargate.js +6 -6
  45. package/lib/providers/lambda.js +14 -11
  46. package/lib/providers/update-lambda.lambda.js +2 -2
  47. package/lib/runner.js +44 -19
  48. package/lib/secrets.js +1 -1
  49. package/lib/utils.d.ts +19 -1
  50. package/lib/utils.js +32 -2
  51. package/lib/webhook-handler.lambda.js +27 -11
  52. package/lib/webhook.js +5 -3
  53. package/package.json +18 -18
package/API.md CHANGED
@@ -7802,6 +7802,7 @@ const runnerImageBuilderProps: RunnerImageBuilderProps = { ... }
7802
7802
  | <code><a href="#@cloudsnorkel/cdk-github-runners.RunnerImageBuilderProps.property.securityGroups">securityGroups</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup[]</code> | Security Groups to assign to this instance. |
7803
7803
  | <code><a href="#@cloudsnorkel/cdk-github-runners.RunnerImageBuilderProps.property.subnetSelection">subnetSelection</a></code> | <code>aws-cdk-lib.aws_ec2.SubnetSelection</code> | Where to place the network interfaces within the VPC. |
7804
7804
  | <code><a href="#@cloudsnorkel/cdk-github-runners.RunnerImageBuilderProps.property.vpc">vpc</a></code> | <code>aws-cdk-lib.aws_ec2.IVpc</code> | VPC to build the image in. |
7805
+ | <code><a href="#@cloudsnorkel/cdk-github-runners.RunnerImageBuilderProps.property.waitOnDeploy">waitOnDeploy</a></code> | <code>boolean</code> | Wait for image to finish building during deployment. |
7805
7806
 
7806
7807
  ---
7807
7808
 
@@ -8013,6 +8014,25 @@ VPC to build the image in.
8013
8014
 
8014
8015
  ---
8015
8016
 
8017
+ ##### `waitOnDeploy`<sup>Optional</sup> <a name="waitOnDeploy" id="@cloudsnorkel/cdk-github-runners.RunnerImageBuilderProps.property.waitOnDeploy"></a>
8018
+
8019
+ ```typescript
8020
+ public readonly waitOnDeploy: boolean;
8021
+ ```
8022
+
8023
+ - *Type:* boolean
8024
+ - *Default:* true
8025
+
8026
+ Wait for image to finish building during deployment.
8027
+
8028
+ It's usually best to leave this enabled to ensure everything is ready once deployment is done. However, it can be disabled to speed up deployment in case where you have a lot of image components that can take a long time to build.
8029
+
8030
+ Disabling this option means a finished deployment is not ready to be used. You will have to wait for the image to finish building before the system can be used.
8031
+
8032
+ Disabling this option may also mean any changes to settings or components can take up to a week (default rebuild interval) to take effect.
8033
+
8034
+ ---
8035
+
8016
8036
  ### RunnerImageComponentCustomProps <a name="RunnerImageComponentCustomProps" id="@cloudsnorkel/cdk-github-runners.RunnerImageComponentCustomProps"></a>
8017
8037
 
8018
8038
  #### Initializer <a name="Initializer" id="@cloudsnorkel/cdk-github-runners.RunnerImageComponentCustomProps.Initializer"></a>
@@ -8824,7 +8844,7 @@ public readonly name: string;
8824
8844
 
8825
8845
  ##### ~~`LINUX`~~<sup>Required</sup> <a name="LINUX" id="@cloudsnorkel/cdk-github-runners.Os.property.LINUX"></a>
8826
8846
 
8827
- - *Deprecated:* use {@link LINUX_UBUNTU } or {@link LINUX_AMAZON_2 }
8847
+ - *Deprecated:* use {@link LINUX_UBUNTU } or {@link LINUX_AMAZON_2 } or {@link LINUX_AMAZON_2023 }
8828
8848
 
8829
8849
  ```typescript
8830
8850
  public readonly LINUX: Os;
@@ -13919,11 +13919,17 @@ async function handler(event) {
13919
13919
  let runnerLevel;
13920
13920
  for (const record of event.Records) {
13921
13921
  const input = JSON.parse(record.body);
13922
- console.log(`Checking runner for ${input.owner}/${input.repo} [execution-id=${input.runnerName}]`);
13922
+ console.log({
13923
+ notice: "Checking runner",
13924
+ input
13925
+ });
13923
13926
  const retryLater = () => result.batchItemFailures.push({ itemIdentifier: record.messageId });
13924
13927
  const execution = await sfn.send(new import_client_sfn.DescribeExecutionCommand({ executionArn: input.executionArn }));
13925
13928
  if (execution.status != "RUNNING") {
13926
- console.log("Runner already finished");
13929
+ console.log({
13930
+ notice: "Runner already finished",
13931
+ input
13932
+ });
13927
13933
  continue;
13928
13934
  }
13929
13935
  if (!octokitCache2) {
@@ -13933,12 +13939,18 @@ async function handler(event) {
13933
13939
  }
13934
13940
  const runner = await getRunner(octokitCache2, runnerLevel, input.owner, input.repo, input.runnerName);
13935
13941
  if (!runner) {
13936
- console.error(`Runner not running yet for ${input.owner}/${input.repo}:${input.runnerName}`);
13942
+ console.log({
13943
+ notice: "Runner not running yet",
13944
+ input
13945
+ });
13937
13946
  retryLater();
13938
13947
  continue;
13939
13948
  }
13940
13949
  if (runner.busy) {
13941
- console.log("Runner is not idle");
13950
+ console.log({
13951
+ notice: "Runner is not idle",
13952
+ input
13953
+ });
13942
13954
  retryLater();
13943
13955
  continue;
13944
13956
  }
@@ -13949,26 +13961,44 @@ async function handler(event) {
13949
13961
  const startedDate = new Date(started * 1e3);
13950
13962
  const now = /* @__PURE__ */ new Date();
13951
13963
  const diffMs = now.getTime() - startedDate.getTime();
13952
- console.log(`Runner ${input.runnerName} started ${diffMs / 1e3} seconds ago`);
13964
+ console.log({
13965
+ notice: `Runner ${input.runnerName} started ${diffMs / 1e3} seconds ago`,
13966
+ input
13967
+ });
13953
13968
  if (diffMs > 1e3 * input.maxIdleSeconds) {
13954
- console.log(`Runner ${input.runnerName} is idle for too long`);
13969
+ console.log({
13970
+ notice: `Runner ${input.runnerName} is idle for too long`,
13971
+ input
13972
+ });
13955
13973
  try {
13956
- console.log(`Stopping step function ${input.executionArn}...`);
13974
+ console.log({
13975
+ notice: `Stopping step function ${input.executionArn}...`,
13976
+ input
13977
+ });
13957
13978
  await sfn.send(new import_client_sfn.StopExecutionCommand({
13958
13979
  executionArn: input.executionArn,
13959
13980
  error: "IdleRunner",
13960
13981
  cause: `Runner ${input.runnerName} on ${input.owner}/${input.repo} is idle for too long (${diffMs / 1e3} seconds and limit is ${input.maxIdleSeconds} seconds)`
13961
13982
  }));
13962
13983
  } catch (e) {
13963
- console.error(`Failed to stop step function ${input.executionArn}: ${e}`);
13984
+ console.error({
13985
+ notice: `Failed to stop step function ${input.executionArn}: ${e}`,
13986
+ input
13987
+ });
13964
13988
  retryLater();
13965
13989
  continue;
13966
13990
  }
13967
13991
  try {
13968
- console.log(`Deleting runner ${runner.id}...`);
13992
+ console.log({
13993
+ notice: `Deleting runner ${runner.id}...`,
13994
+ input
13995
+ });
13969
13996
  await deleteRunner(octokitCache2, runnerLevel, input.owner, input.repo, runner.id);
13970
13997
  } catch (e) {
13971
- console.error(`Failed to delete runner ${runner.id}: ${e}`);
13998
+ console.error({
13999
+ notice: `Failed to delete runner ${runner.id}: ${e}`,
14000
+ input
14001
+ });
13972
14002
  retryLater();
13973
14003
  continue;
13974
14004
  }
@@ -13980,7 +14010,10 @@ async function handler(event) {
13980
14010
  }
13981
14011
  }
13982
14012
  if (!found) {
13983
- console.error("No `cdkghr:started:xxx` label found???");
14013
+ console.error({
14014
+ notice: "No `cdkghr:started:xxx` label found???",
14015
+ input
14016
+ });
13984
14017
  retryLater();
13985
14018
  }
13986
14019
  }
@@ -79,11 +79,16 @@ async function deleteAmis(stackName, builderName) {
79
79
  ]
80
80
  }));
81
81
  let imagesToDelete = images.Images ?? [];
82
- console.log(`Found ${imagesToDelete.length} AMIs`);
83
- console.log(JSON.stringify(imagesToDelete.map((i) => i.ImageId)));
82
+ console.log({
83
+ notice: `Found ${imagesToDelete.length} AMIs`,
84
+ images: imagesToDelete.map((i) => i.ImageId)
85
+ });
84
86
  for (const image of imagesToDelete) {
85
87
  if (!image.ImageId) {
86
- console.warn(`No image id? ${JSON.stringify(image)}`);
88
+ console.warn({
89
+ notice: "No image id?",
90
+ image
91
+ });
87
92
  continue;
88
93
  }
89
94
  console.log(`Deregistering ${image.ImageId}`);
@@ -102,7 +107,7 @@ async function deleteAmis(stackName, builderName) {
102
107
  }
103
108
  async function handler(event, context) {
104
109
  try {
105
- console.log(JSON.stringify({ ...event, ResponseURL: "..." }));
110
+ console.log({ ...event, ResponseURL: "..." });
106
111
  switch (event.RequestType) {
107
112
  case "Create":
108
113
  case "Update":
@@ -26,7 +26,7 @@ module.exports = __toCommonJS(filter_failed_builds_lambda_exports);
26
26
  var import_client_sns = require("@aws-sdk/client-sns");
27
27
  var sns = new import_client_sns.SNSClient();
28
28
  async function handler(event) {
29
- console.log(JSON.stringify(event));
29
+ console.log(event);
30
30
  for (const record of event.Records) {
31
31
  let message = JSON.parse(record.Sns.Message);
32
32
  if (message.state.status === "FAILED") {
@@ -2577,7 +2577,7 @@ function increaseVersion(allVersions) {
2577
2577
  return version;
2578
2578
  }
2579
2579
  async function handler(event, context) {
2580
- console.log(JSON.stringify({ ...event, ResponseURL: "..." }));
2580
+ console.log({ ...event, ResponseURL: "..." });
2581
2581
  try {
2582
2582
  const objectType = event.ResourceProperties.ObjectType;
2583
2583
  const objectName = event.ResourceProperties.ObjectName;
@@ -68,47 +68,31 @@ var codebuild = new import_client_codebuild.CodeBuildClient();
68
68
  var ib = new import_client_imagebuilder.ImagebuilderClient();
69
69
  async function handler(event, context) {
70
70
  try {
71
- console.log(JSON.stringify({ ...event, ResponseURL: "..." }));
72
- const deleteOnly = event.ResourceProperties.DeleteOnly;
73
- const projectName = event.ResourceProperties.ProjectName;
74
- const ibName = event.ResourceProperties.ImageBuilderName;
71
+ console.log({ ...event, ResponseURL: "..." });
72
+ const props = event.ResourceProperties;
75
73
  switch (event.RequestType) {
76
74
  case "Create":
77
75
  case "Update":
78
- if (deleteOnly) {
76
+ if (props.DeleteOnly) {
79
77
  await customResourceRespond(event, "SUCCESS", "OK", "Deleter", {});
80
78
  break;
81
79
  }
82
- console.log(`Starting CodeBuild project ${projectName}`);
83
- await codebuild.send(new import_client_codebuild.StartBuildCommand({
84
- projectName,
80
+ console.log(`Starting CodeBuild project ${props.ProjectName}`);
81
+ const cbRes = await codebuild.send(new import_client_codebuild.StartBuildCommand({
82
+ projectName: props.ProjectName,
85
83
  environmentVariablesOverride: [
86
84
  {
87
85
  type: "PLAINTEXT",
88
- name: "STACK_ID",
89
- value: event.StackId
90
- },
91
- {
92
- type: "PLAINTEXT",
93
- name: "REQUEST_ID",
94
- value: event.RequestId
95
- },
96
- {
97
- type: "PLAINTEXT",
98
- name: "LOGICAL_RESOURCE_ID",
99
- value: event.LogicalResourceId
100
- },
101
- {
102
- type: "PLAINTEXT",
103
- name: "RESPONSE_URL",
104
- value: event.ResponseURL
86
+ name: "WAIT_HANDLE",
87
+ value: props.WaitHandle
105
88
  }
106
89
  ]
107
90
  }));
91
+ await customResourceRespond(event, "SUCCESS", "OK", cbRes.build?.id ?? "build", {});
108
92
  break;
109
93
  case "Delete":
110
- if (ibName) {
111
- const ibImages = await ib.send(new import_client_imagebuilder.ListImagesCommand({ filters: [{ name: "name", values: [ibName] }] }));
94
+ if (props.ImageBuilderName) {
95
+ const ibImages = await ib.send(new import_client_imagebuilder.ListImagesCommand({ filters: [{ name: "name", values: [props.ImageBuilderName] }] }));
112
96
  if (ibImages.imageVersionList) {
113
97
  for (const v of ibImages.imageVersionList) {
114
98
  if (v.arn) {
@@ -83,7 +83,7 @@ async function handleAmi(event, ami) {
83
83
  }
84
84
  async function handler(event, context) {
85
85
  try {
86
- console.log(JSON.stringify({ ...event, ResponseURL: "..." }));
86
+ console.log({ ...event, ResponseURL: "..." });
87
87
  const ami = event.ResourceProperties.Ami;
88
88
  switch (event.RequestType) {
89
89
  case "Create":
@@ -29,7 +29,7 @@ function sleep(ms) {
29
29
  return new Promise((resolve) => setTimeout(resolve, ms));
30
30
  }
31
31
  async function handler(event) {
32
- console.log(JSON.stringify(event));
32
+ console.log(event);
33
33
  while (true) {
34
34
  try {
35
35
  await lambda.send(new import_client_lambda.UpdateFunctionCodeCommand({
@@ -11,7 +11,7 @@
11
11
  available to you. Apps are easier to set up and provide more fine-grained access control. If
12
12
  you have previously created an app, you can choose to use an existing app.`,p=d(),c=s("div"),a=s("input"),m=d(),u=s("label"),u.innerHTML="New GitHub App <b>(recommended)</b>",k=d(),g=s("div"),_=s("input"),E=d(),f=s("label"),f.textContent="Existing GitHub App",S=d(),C=s("div"),b=s("input"),v=d(),T=s("label"),T.textContent="Personal Access Token",o(a,"class","form-check-input"),o(a,"type","radio"),a.__value="newApp",a.value=a.__value,o(a,"id","newApp"),o(u,"class","form-check-label"),o(u,"for","newApp"),o(c,"class","form-check"),o(_,"class","form-check-input"),o(_,"type","radio"),_.__value="existingApp",_.value=_.__value,o(_,"id","existingApp"),o(f,"class","form-check-label"),o(f,"for","existingApp"),o(g,"class","form-check"),o(b,"class","form-check-input"),o(b,"type","radio"),b.__value="pat",b.value=b.__value,o(b,"id","pat"),o(T,"class","form-check-label"),o(T,"for","pat"),o(C,"class","form-check"),o(l,"class","px-3 py-3"),A.p(a,_,b)},m(h,R){H(h,t,R),H(h,r,R),H(h,l,R),n(l,i),n(l,p),n(l,c),n(c,a),a.checked=a.__value===e[2],n(c,m),n(c,u),n(l,k),n(l,g),n(g,_),_.checked=_.__value===e[2],n(g,E),n(g,f),n(l,S),n(l,C),n(C,b),b.checked=b.__value===e[2],n(C,v),n(C,T),y||(N=[P(a,"change",e[19]),P(_,"change",e[20]),P(b,"change",e[21])],y=!0)},p(h,R){R[0]&4&&(a.checked=a.__value===h[2]),R[0]&4&&(_.checked=_.__value===h[2]),R[0]&4&&(b.checked=b.__value===h[2])},d(h){h&&O(t),h&&O(r),h&&O(l),A.r(),y=!1,ne(N)}}}function ot(e){let t,r,l,i,p,c,a,m,u,k,g,_,E,f,S,C,b;return{c(){t=s("h2"),t.textContent="Personal Access Token",r=d(),l=s("div"),i=s("p"),p=z("The "),c=s("a"),a=z("personal access token"),u=z(" must have the "),k=s("code"),k.textContent="repo",g=z(`
13
13
  scope enabled. Don't forget to also create a webhook as described in `),_=s("a"),_.textContent="SETUP_GITHUB.md",E=z("."),f=d(),S=s("input"),o(c,"href",m="https://"+e[1]+"/settings/tokens"),o(_,"href","https://github.com/CloudSnorkel/cdk-github-runners/blob/main/SETUP_GITHUB.md"),o(S,"class","form-control"),o(S,"placeholder","Token e.g. ghp_abcdefghijklmnopqrstuvwxyz1234567890"),o(l,"class","px-3 py-3")},m(v,T){H(v,t,T),H(v,r,T),H(v,l,T),n(l,i),n(i,p),n(i,c),n(c,a),n(i,u),n(i,k),n(i,g),n(i,_),n(i,E),n(l,f),n(l,S),X(S,e[8]),C||(b=P(S,"input",e[30]),C=!0)},p(v,T){T[0]&2&&m!==(m="https://"+v[1]+"/settings/tokens")&&o(c,"href",m),T[0]&256&&S.value!==v[8]&&X(S,v[8])},d(v){v&&O(t),v&&O(r),v&&O(l),C=!1,b()}}}function rt(e){let t,r,l,i,p,c,a,m,u,k,g,_,E,f,S,C,b,v,T,A,y,N,h,R,B,G,le,$,ie,x,oe,re,U,ee,Z=JSON.stringify(e[4]==="repo"?e[12]:e[13],void 0,2)+"",K,te,q,se,ae,Y,Q,ue;return Y=me(e[16][0]),{c(){t=s("h3"),t.textContent="Existing App Details",r=d(),l=s("div"),i=s("div"),p=s("label"),p.textContent="App Id",c=d(),a=s("div"),m=s("input"),u=d(),k=s("div"),g=s("label"),g.textContent="Private Key",_=d(),E=s("div"),f=s("textarea"),S=d(),C=s("div"),b=s("div"),b.textContent="Registration Level",v=d(),T=s("div"),A=s("div"),y=s("input"),N=d(),h=s("label"),h.textContent="Repository",R=d(),B=s("div"),G=s("input"),le=d(),$=s("label"),$.textContent="Organization",ie=d(),x=s("h4"),x.textContent="Required Permissions",oe=d(),re=s("p"),re.textContent="The existing app must have the following permissions.",U=d(),ee=s("pre"),K=z(Z),te=d(),q=s("h4"),q.textContent="Webhook",se=d(),ae=s("p"),ae.innerHTML='Don&#39;t forget to set up the webhook and its secret as described in <a href="https://github.com/CloudSnorkel/cdk-github-runners/blob/main/SETUP_GITHUB.md">SETUP_GITHUB.md</a>.',o(p,"for","appid"),o(p,"class","col-sm-2 col-form-label"),o(m,"type","number"),o(m,"class","form-control"),o(m,"id","appid"),o(a,"class","col-sm-10"),o(i,"class","form-group row px-3 py-2"),o(g,"for","pk"),o(g,"class","col-sm-2 col-form-label"),o(f,"class","form-control"),o(f,"id","pk"),o(f,"rows","10"),o(E,"class","col-sm-10"),o(k,"class","form-group row px-3 py-2"),o(b,"class","col-sm-2 col-form-label"),o(y,"class","form-check-input"),o(y,"type","radio"),y.__value="repo",y.value=y.__value,o(y,"id","repo"),o(h,"class","form-check-label"),o(h,"for","repo"),o(A,"class","form-check"),o(G,"class","form-check-input"),o(G,"type","radio"),G.__value="org",G.value=G.__value,o(G,"id","org"),o($,"class","form-check-label"),o($,"for","org"),o(B,"class","form-check"),o(T,"class","col-sm-10"),o(C,"class","form-group row px-3 py-2"),o(l,"class","px-3 py-3"),Y.p(y,G)},m(I,F){H(I,t,F),H(I,r,F),H(I,l,F),n(l,i),n(i,p),n(i,c),n(i,a),n(a,m),X(m,e[6]),n(l,u),n(l,k),n(k,g),n(k,_),n(k,E),n(E,f),X(f,e[7]),n(l,S),n(l,C),n(C,b),n(C,v),n(C,T),n(T,A),n(A,y),y.checked=y.__value===e[4],n(A,N),n(A,h),n(T,R),n(T,B),n(B,G),G.checked=G.__value===e[4],n(B,le),n(B,$),n(l,ie),n(l,x),n(l,oe),n(l,re),n(l,U),n(l,ee),n(ee,K),n(l,te),n(l,q),n(l,se),n(l,ae),Q||(ue=[P(m,"input",e[26]),P(f,"input",e[27]),P(y,"change",e[28]),P(G,"change",e[29])],Q=!0)},p(I,F){F[0]&64&&We(m.value)!==I[6]&&X(m,I[6]),F[0]&128&&X(f,I[7]),F[0]&16&&(y.checked=y.__value===I[4]),F[0]&16&&(G.checked=G.__value===I[4]),F[0]&16&&Z!==(Z=JSON.stringify(I[4]==="repo"?I[12]:I[13],void 0,2)+"")&&be(K,Z)},d(I){I&&O(t),I&&O(r),I&&O(l),Y.r(),Q=!1,ne(ue)}}}function st(e){let t,r,l,i,p,c,a,m,u,k,g,_,E,f,S,C,b,v,T,A,y=e[0]==="ghes"&&Ge(e),N=e[3]==="org"&&Pe(e);return v=me(e[16][1]),{c(){t=s("h3"),t.textContent="New App Settings",r=d(),l=s("div"),i=s("p"),i.textContent=`Choose whether to create a new personal app or organization app. A private personal app can
14
- only be used for repositories under your user. A private origination app can only be used
14
+ only be used for repositories under your user. A private organization app can only be used
15
15
  for repositories under that organization.`,p=d(),c=s("div"),a=s("input"),m=d(),u=s("label"),u.textContent="User app",k=d(),g=s("div"),_=s("input"),E=d(),f=s("label"),f.textContent="Organization app",S=d(),y&&y.c(),C=d(),N&&N.c(),b=Fe(),o(a,"class","form-check-input"),o(a,"type","radio"),a.__value="user",a.value=a.__value,o(a,"id","userScope"),o(u,"class","form-check-label"),o(u,"for","userScope"),o(c,"class","form-check"),o(_,"class","form-check-input"),o(_,"type","radio"),_.__value="org",_.value=_.__value,o(_,"id","orgScope"),o(f,"class","form-check-label"),o(f,"for","orgScope"),o(g,"class","form-check"),o(l,"class","px-3 py-3"),v.p(a,_)},m(h,R){H(h,t,R),H(h,r,R),H(h,l,R),n(l,i),n(l,p),n(l,c),n(c,a),a.checked=a.__value===e[3],n(c,m),n(c,u),n(l,k),n(l,g),n(g,_),_.checked=_.__value===e[3],n(g,E),n(g,f),n(l,S),y&&y.m(l,null),H(h,C,R),N&&N.m(h,R),H(h,b,R),T||(A=[P(a,"change",e[22]),P(_,"change",e[23])],T=!0)},p(h,R){R[0]&8&&(a.checked=a.__value===h[3]),R[0]&8&&(_.checked=_.__value===h[3]),h[0]==="ghes"?y?y.p(h,R):(y=Ge(h),y.c(),y.m(l,null)):y&&(y.d(1),y=null),h[3]==="org"?N?N.p(h,R):(N=Pe(h),N.c(),N.m(b.parentNode,b)):N&&(N.d(1),N=null)},d(h){h&&O(t),h&&O(r),h&&O(l),y&&y.d(),h&&O(C),N&&N.d(h),h&&O(b),v.r(),T=!1,ne(A)}}}function Ge(e){let t,r,l,i,p,c,a,m;return{c(){t=s("p"),t.textContent=`If multiple organizations under the same GitHub Enterprise Server need to use the runners,
16
16
  you can make the app public.`,r=d(),l=s("div"),i=s("input"),p=d(),c=s("label"),c.textContent="Public app",o(t,"class","pt-2"),o(i,"class","form-check-input"),o(i,"type","checkbox"),o(i,"id","public"),o(c,"class","form-check-label"),o(c,"for","public"),o(l,"class","form-check")},m(u,k){H(u,t,k),H(u,r,k),H(u,l,k),n(l,i),i.checked=e[11].public,n(l,p),n(l,c),a||(m=P(i,"change",e[24]),a=!0)},p(u,k){k[0]&2048&&(i.checked=u[11].public)},d(u){u&&O(t),u&&O(r),u&&O(l),a=!1,m()}}}function Pe(e){let t,r,l,i,p,c,a,m,u,k,g,_,E,f,S,C;return{c(){t=s("h3"),t.textContent="Organization name",r=d(),l=s("div"),i=s("p"),p=z(`What is the slug for your organization? If your repositories have a URL like
17
17
  `),c=s("code"),a=z("https://"),m=z(e[1]),u=z("/MyOrg/my-repo"),k=z(`
@@ -13964,14 +13964,20 @@ async function handler(event) {
13964
13964
  }
13965
13965
  const payload = JSON.parse(body);
13966
13966
  if (payload.action !== "queued") {
13967
- console.log(`Ignoring action "${payload.action}", expecting "queued"`);
13967
+ console.log({
13968
+ notice: `Ignoring action "${payload.action}", expecting "queued"`,
13969
+ job: payload.workflow_job
13970
+ });
13968
13971
  return {
13969
13972
  statusCode: 200,
13970
13973
  body: 'OK. No runner started (action is not "queued").'
13971
13974
  };
13972
13975
  }
13973
13976
  if (process.env.REQUIRE_SELF_HOSTED_LABEL === "1" && !payload.workflow_job.labels.includes("self-hosted")) {
13974
- console.log(`Ignoring labels "${payload.workflow_job.labels}", expecting "self-hosted"`);
13977
+ console.log({
13978
+ notice: `Ignoring labels "${payload.workflow_job.labels}", expecting "self-hosted"`,
13979
+ job: payload.workflow_job
13980
+ });
13975
13981
  return {
13976
13982
  statusCode: 200,
13977
13983
  body: 'OK. No runner started (no "self-hosted" label).'
@@ -13979,38 +13985,48 @@ async function handler(event) {
13979
13985
  }
13980
13986
  const provider = matchLabelsToProvider(payload.workflow_job.labels);
13981
13987
  if (!provider) {
13982
- console.log(`Ignoring labels "${payload.workflow_job.labels}", as they don't match a supported runner provider`);
13988
+ console.log({
13989
+ notice: `Ignoring labels "${payload.workflow_job.labels}", as they don't match a supported runner provider`,
13990
+ job: payload.workflow_job
13991
+ });
13983
13992
  return {
13984
13993
  statusCode: 200,
13985
13994
  body: "OK. No runner started (no provider with matching labels)."
13986
13995
  };
13987
13996
  }
13988
13997
  if (await isDeploymentPending(payload)) {
13989
- console.log("Ignoring job as its deployment is still pending");
13998
+ console.log({
13999
+ notice: "Ignoring job as its deployment is still pending",
14000
+ job: payload.workflow_job
14001
+ });
13990
14002
  return {
13991
14003
  statusCode: 200,
13992
14004
  body: "OK. No runner started (deployment pending)."
13993
14005
  };
13994
14006
  }
13995
14007
  let executionName = `${payload.repository.full_name.replace("/", "-")}-${getHeader(event, "x-github-delivery")}`.slice(0, 64);
13996
- const input = JSON.stringify({
14008
+ const input = {
13997
14009
  owner: payload.repository.owner.login,
13998
14010
  repo: payload.repository.name,
13999
14011
  jobId: payload.workflow_job.id,
14000
14012
  jobUrl: payload.workflow_job.html_url,
14001
14013
  installationId: payload.installation?.id ?? -1,
14002
14014
  // always pass value because step function can't handle missing input
14003
- labels: payload.workflow_job.labels,
14015
+ labels: payload.workflow_job.labels.join(","),
14004
14016
  provider
14005
- });
14017
+ };
14006
14018
  const execution = await sf.send(new import_client_sfn.StartExecutionCommand({
14007
14019
  stateMachineArn: process.env.STEP_FUNCTION_ARN,
14008
- input,
14020
+ input: JSON.stringify(input),
14009
14021
  // name is not random so multiple execution of this webhook won't cause multiple builders to start
14010
14022
  name: executionName
14011
14023
  }));
14012
- console.log(`Started ${execution.executionArn}`);
14013
- console.log(input);
14024
+ console.log({
14025
+ notice: "Started orchestrator",
14026
+ execution: execution.executionArn,
14027
+ sfnInput: input,
14028
+ job: payload.workflow_job
14029
+ });
14014
14030
  return {
14015
14031
  statusCode: 202,
14016
14032
  body: executionName
package/lib/access.js CHANGED
@@ -59,7 +59,7 @@ class LambdaAccess {
59
59
  }
60
60
  exports.LambdaAccess = LambdaAccess;
61
61
  _a = JSII_RTTI_SYMBOL_1;
62
- LambdaAccess[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.LambdaAccess", version: "0.12.4" };
62
+ LambdaAccess[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.LambdaAccess", version: "0.13.0" };
63
63
  /**
64
64
  * @internal
65
65
  */
@@ -10,13 +10,19 @@ async function handler(event) {
10
10
  let runnerLevel;
11
11
  for (const record of event.Records) {
12
12
  const input = JSON.parse(record.body);
13
- console.log(`Checking runner for ${input.owner}/${input.repo} [execution-id=${input.runnerName}]`);
13
+ console.log({
14
+ notice: 'Checking runner',
15
+ input,
16
+ });
14
17
  const retryLater = () => result.batchItemFailures.push({ itemIdentifier: record.messageId });
15
18
  // check if step function is still running
16
19
  const execution = await sfn.send(new client_sfn_1.DescribeExecutionCommand({ executionArn: input.executionArn }));
17
20
  if (execution.status != 'RUNNING') {
18
21
  // no need to test again as runner already finished
19
- console.log('Runner already finished');
22
+ console.log({
23
+ notice: 'Runner already finished',
24
+ input,
25
+ });
20
26
  continue;
21
27
  }
22
28
  // get github access
@@ -30,7 +36,10 @@ async function handler(event) {
30
36
  // find runner
31
37
  const runner = await (0, lambda_github_1.getRunner)(octokitCache, runnerLevel, input.owner, input.repo, input.runnerName);
32
38
  if (!runner) {
33
- console.error(`Runner not running yet for ${input.owner}/${input.repo}:${input.runnerName}`);
39
+ console.log({
40
+ notice: 'Runner not running yet',
41
+ input,
42
+ });
34
43
  retryLater();
35
44
  continue;
36
45
  }
@@ -38,7 +47,10 @@ async function handler(event) {
38
47
  // we want to try again because the runner might be retried due to e.g. lambda timeout
39
48
  // we need to keep following the retry too and make sure it doesn't go idle
40
49
  if (runner.busy) {
41
- console.log('Runner is not idle');
50
+ console.log({
51
+ notice: 'Runner is not idle',
52
+ input,
53
+ });
42
54
  retryLater();
43
55
  continue;
44
56
  }
@@ -50,14 +62,23 @@ async function handler(event) {
50
62
  const startedDate = new Date(started * 1000);
51
63
  const now = new Date();
52
64
  const diffMs = now.getTime() - startedDate.getTime();
53
- console.log(`Runner ${input.runnerName} started ${diffMs / 1000} seconds ago`);
65
+ console.log({
66
+ notice: `Runner ${input.runnerName} started ${diffMs / 1000} seconds ago`,
67
+ input,
68
+ });
54
69
  if (diffMs > 1000 * input.maxIdleSeconds) {
55
70
  // max idle time reached, delete runner
56
- console.log(`Runner ${input.runnerName} is idle for too long`);
71
+ console.log({
72
+ notice: `Runner ${input.runnerName} is idle for too long`,
73
+ input,
74
+ });
57
75
  try {
58
76
  // stop step function first, so it's marked as aborted with the proper error
59
77
  // if we delete the runner first, the step function will be marked as failed with a generic error
60
- console.log(`Stopping step function ${input.executionArn}...`);
78
+ console.log({
79
+ notice: `Stopping step function ${input.executionArn}...`,
80
+ input,
81
+ });
61
82
  await sfn.send(new client_sfn_1.StopExecutionCommand({
62
83
  executionArn: input.executionArn,
63
84
  error: 'IdleRunner',
@@ -65,16 +86,25 @@ async function handler(event) {
65
86
  }));
66
87
  }
67
88
  catch (e) {
68
- console.error(`Failed to stop step function ${input.executionArn}: ${e}`);
89
+ console.error({
90
+ notice: `Failed to stop step function ${input.executionArn}: ${e}`,
91
+ input,
92
+ });
69
93
  retryLater();
70
94
  continue;
71
95
  }
72
96
  try {
73
- console.log(`Deleting runner ${runner.id}...`);
97
+ console.log({
98
+ notice: `Deleting runner ${runner.id}...`,
99
+ input,
100
+ });
74
101
  await (0, lambda_github_1.deleteRunner)(octokitCache, runnerLevel, input.owner, input.repo, runner.id);
75
102
  }
76
103
  catch (e) {
77
- console.error(`Failed to delete runner ${runner.id}: ${e}`);
104
+ console.error({
105
+ notice: `Failed to delete runner ${runner.id}: ${e}`,
106
+ input,
107
+ });
78
108
  retryLater();
79
109
  continue;
80
110
  }
@@ -89,11 +119,14 @@ async function handler(event) {
89
119
  }
90
120
  if (!found) {
91
121
  // no started label? retry later (it won't retry forever as eventually the runner will stop and the step function will finish)
92
- console.error('No `cdkghr:started:xxx` label found???');
122
+ console.error({
123
+ notice: 'No `cdkghr:started:xxx` label found???',
124
+ input,
125
+ });
93
126
  retryLater();
94
127
  }
95
128
  }
96
129
  return result;
97
130
  }
98
131
  exports.handler = handler;
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRsZS1ydW5uZXItcmVwZWFyLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pZGxlLXJ1bm5lci1yZXBlYXIubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG9EQUFnRztBQUdoRyxtREFBc0U7QUFXdEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxzQkFBUyxFQUFFLENBQUM7QUFFckIsS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUF5QjtJQUNyRCxNQUFNLE1BQU0sR0FBK0IsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNyRSxJQUFJLFlBQWlDLENBQUM7SUFDdEMsSUFBSSxXQUF1QyxDQUFDO0lBRTVDLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBMEIsQ0FBQztRQUMvRCxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLGtCQUFrQixLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUVuRyxNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRTdGLDBDQUEwQztRQUMxQyxNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxxQ0FBd0IsQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JHLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNsQyxtREFBbUQ7WUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxD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LENBQUMsZ0NBQWdDLEtBQUssQ0FBQyxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDMUUsVUFBVSxFQUFFLENBQUM7d0JBQ2IsU0FBUztvQkFDWCxDQUFDO29CQUVELElBQUksQ0FBQzt3QkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDL0MsTUFBTSxJQUFBLDRCQUFZLEVBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNwRixDQUFDO29CQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUM1RCxVQUFVLEVBQUUsQ0FBQzt3QkFDYixTQUFTO29CQUNYLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGlEQUFpRDtvQkFDakQsVUFBVSxFQUFFLENBQUM7Z0JBQ2YsQ0FBQztnQkFFRCxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUNiLE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLDhIQUE4SDtZQUM5SCxPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7WUFDeEQsVUFBVSxFQUFFLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFyR0QsMEJBcUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpYmVFeGVjdXRpb25Db21tYW5kLCBTRk5DbGllbnQsIFN0b3BFeGVjdXRpb25Db21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNmbic7XG5pbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvcmVzdCc7XG5pbXBvcnQgKiBhcyBBV1NMYW1iZGEgZnJvbSAnYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBkZWxldGVSdW5uZXIsIGdldE9jdG9raXQsIGdldFJ1bm5lciB9IGZyb20gJy4vbGFtYmRhLWdpdGh1Yic7XG5cbmludGVyZmFjZSBJZGxlUmVhcGVyTGFtYmRhSW5wdXQge1xuICByZWFkb25seSBleGVjdXRpb25Bcm46IHN0cmluZztcbiAgcmVhZG9ubHkgcnVubmVyTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBvd25lcjogc3RyaW5nO1xuICByZWFkb25seSByZXBvOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGluc3RhbGxhdGlvbklkPzogbnVtYmVyO1xuICByZWFkb25seSBtYXhJZGxlU2Vjb25kczogbnVtYmVyO1xufVxuXG5jb25zdCBzZm4gPSBuZXcgU0ZOQ2xpZW50KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50OiBBV1NMYW1iZGEuU1FTRXZlbnQpOiBQcm9taXNlPEFXU0xhbWJkYS5TUVNCYXRjaFJlc3BvbnNlPiB7XG4gIGNvbnN0IHJlc3VsdDogQVdTTGFtYmRhLlNRU0JhdGNoUmVzcG9uc2UgPSB7IGJhdGNoSXRlbUZhaWx1cmVzOiBbXSB9O1xuICBsZXQgb2N0b2tpdENhY2hlOiBPY3Rva2l0IHwgdW5kZWZpbmVkO1xuICBsZXQgcnVubmVyTGV2ZWw6ICdyZXBvJyB8ICdvcmcnIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIGV2ZW50LlJlY29yZHMpIHtcbiAgICBjb25zdCBpbnB1dCA9IEpTT04ucGFyc2UocmVjb3JkLmJvZHkpIGFzIElkbGVSZWFwZXJMYW1iZGFJbnB1dDtcbiAgICBjb25zb2xlLmxvZyhgQ2hlY2tpbmcgcnVubmVyIGZvciAke2lucHV0Lm93bmVyfS8ke2lucHV0LnJlcG99IFtleGVjdXRpb24taWQ9JHtpbnB1dC5ydW5uZXJOYW1lfV1gKTtcblxuICAgIGNvbnN0IHJldHJ5TGF0ZXIgPSAoKSA9PiByZXN1bHQuYmF0Y2hJdGVtRmFpbHVyZXMucHVzaCh7IGl0ZW1JZGVudGlmaWVyOiByZWNvcmQubWVzc2FnZUlkIH0pO1xuXG4gICAgLy8gY2hlY2sgaWYgc3RlcCBmdW5jdGlvbiBpcyBzdGlsbCBydW5uaW5nXG4gICAgY29uc3QgZXhlY3V0aW9uID0gYXdhaXQgc2ZuLnNlbmQobmV3IERlc2NyaWJlRXhlY3V0aW9uQ29tbWFuZCh7IGV4ZWN1dGlvbkFybjogaW5wdXQuZXhlY3V0aW9uQXJuIH0pKTtcbiAgICBpZiAoZXhlY3V0aW9uLnN0YXR1cyAhPSAnUlVOTklORycpIHtcbiAgICAgIC8vIG5vIG5lZWQgdG8gdGVzdCBhZ2FpbiBhcyBydW5uZXIgYWxyZWFkeSBmaW5pc2hlZFxuICAgICAgY29uc29sZS5sb2coJ1J1bm5lciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBnZXQgZ2l0aHViIGFjY2Vzc1xuICAgIGlmICghb2N0b2tpdENhY2hlKSB7XG4gICAgICAvLyBnZXRPY3Rva2l0IGNhbGxzIHNlY3JldHMgbWFuYWdlciBldmVyeSB0aW1lLCBzbyBjYWNoZSB0aGUgcmVzdWx0XG4gICAgICBjb25zdCB7IG9jdG9raXQsIGdpdGh1YlNlY3JldHMgfSA9IGF3YWl0IGdldE9jdG9raXQoaW5wdXQuaW5zdGFsbGF0aW9uSWQpO1xuICAgICAgLy8gVE9ETyBpZiBpbnN0YWxsYXRpb25JZCBjaGFuZ2VzIGR1cmluZyBub3JtYWwgb3BlcmF0aW9ucywgd2UgbWF5IGhhdmUgc29tZSByZWNvcmRzIHdpdGggZ29vZCBpbnN0YWxsYXRpb25JZCwgYW5kIHNvbWUgd2l0aCBiYWRcbiAgICAgIG9jdG9raXRDYWNoZSA9IG9jdG9raXQ7XG4gICAgICBydW5uZXJMZXZlbCA9IGdpdGh1YlNlY3JldHMucnVubmVyTGV2ZWw7XG4gICAgfVxuXG4gICAgLy8gZmluZCBydW5uZXJcbiAgICBjb25zdCBydW5uZXIgPSBhd2FpdCBnZXRSdW5uZXIob2N0b2tpdENhY2hlLCBydW5uZXJMZXZlbCwgaW5wdXQub3duZXIsIGlucHV0LnJlcG8sIGlucHV0LnJ1bm5lck5hbWUpO1xuICAgIGlmICghcnVubmVyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBSdW5uZXIgbm90IHJ1bm5pbmcgeWV0IGZvciAke2lucHV0Lm93bmVyfS8ke2lucHV0LnJlcG99OiR7aW5wdXQucnVubmVyTmFtZX1gKTtcbiAgICAgIHJldHJ5TGF0ZXIoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGlmIG5vdCBpZGxlLCB0cnkgYWdhaW4gbGF0ZXJcbiAgICAvLyB3ZSB3YW50IHRvIHRyeSBhZ2FpbiBiZWNhdXNlIHRoZSBydW5uZXIgbWlnaHQgYmUgcmV0cmllZCBkdWUgdG8gZS5nLiBsYW1iZGEgdGltZW91dFxuICAgIC8vIHdlIG5lZWQgdG8ga2VlcCBmb2xsb3dpbmcgdGhlIHJldHJ5IHRvbyBhbmQgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZ28gaWRsZVxuICAgIGlmIChydW5uZXIuYnVzeSkge1xuICAgICAgY29uc29sZS5sb2coJ1J1bm5lciBpcyBub3QgaWRsZScpO1xuICAgICAgcmV0cnlMYXRlcigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgbWF4IGlkbGUgdGltZW91dCBoYXMgcmVhY2hlZFxuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgbGFiZWwgb2YgcnVubmVyLmxhYmVscykge1xuICAgICAgaWYgKGxhYmVsLm5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdjZGtnaHI6c3RhcnRlZDonKSkge1xuICAgICAgICBjb25zdCBzdGFydGVkID0gcGFyc2VGbG9hdChsYWJlbC5uYW1lLnNwbGl0KCc6JylbMl0pO1xuICAgICAgICBjb25zdCBzdGFydGVkRGF0ZSA9IG5ldyBEYXRlKHN0YXJ0ZWQgKiAxMDAwKTtcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgZGlmZk1zID0gbm93LmdldFRpbWUoKSAtIHN0YXJ0ZWREYXRlLmdldFRpbWUoKTtcblxuICAgICAgICBjb25zb2xlLmxvZyhgUnVubmVyICR7aW5wdXQucnVubmVyTmFtZX0gc3RhcnRlZCAke2RpZmZNcy8xMDAwfSBzZWNvbmRzIGFnb2ApO1xuXG4gICAgICAgIGlmIChkaWZmTXMgPiAxMDAwICogaW5wdXQubWF4SWRsZVNlY29uZHMpIHtcbiAgICAgICAgICAvLyBtYXggaWRsZSB0aW1lIHJlYWNoZWQsIGRlbGV0ZSBydW5uZXJcbiAgICAgICAgICBjb25zb2xlLmxvZyhgUnVubmVyICR7aW5wdXQucnVubmVyTmFtZX0gaXMgaWRsZSBmb3IgdG9vIGxvbmdgKTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBzdG9wIHN0ZXAgZnVuY3Rpb24gZmlyc3QsIHNvIGl0J3MgbWFya2VkIGFzIGFib3J0ZWQgd2l0aCB0aGUgcHJvcGVyIGVycm9yXG4gICAgICAgICAgICAvLyBpZiB3ZSBkZWxldGUgdGhlIHJ1bm5lciBmaXJzdCwgdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBtYXJrZWQgYXMgZmFpbGVkIHdpdGggYSBnZW5lcmljIGVycm9yXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RvcHBpbmcgc3RlcCBmdW5jdGlvbiAke2lucHV0LmV4ZWN1dGlvbkFybn0uLi5gKTtcbiAgICAgICAgICAgIGF3YWl0IHNmbi5zZW5kKG5ldyBTdG9wRXhlY3V0aW9uQ29tbWFuZCh7XG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkFybjogaW5wdXQuZXhlY3V0aW9uQXJuLFxuICAgICAgICAgICAgICBlcnJvcjogJ0lkbGVSdW5uZXInLFxuICAgICAgICAgICAgICBjYXVzZTogYFJ1bm5lciAke2lucHV0LnJ1bm5lck5hbWV9IG9uICR7aW5wdXQub3duZXJ9LyR7aW5wdXQucmVwb30gaXMgaWRsZSBmb3IgdG9vIGxvbmcgKCR7ZGlmZk1zIC8gMTAwMH0gc2Vjb25kcyBhbmQgbGltaXQgaXMgJHtpbnB1dC5tYXhJZGxlU2Vjb25kc30gc2Vjb25kcylgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBzdG9wIHN0ZXAgZnVuY3Rpb24gJHtpbnB1dC5leGVjdXRpb25Bcm59OiAke2V9YCk7XG4gICAgICAgICAgICByZXRyeUxhdGVyKCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW5nIHJ1bm5lciAke3J1bm5lci5pZH0uLi5gKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZVJ1bm5lcihvY3Rva2l0Q2FjaGUsIHJ1bm5lckxldmVsLCBpbnB1dC5vd25lciwgaW5wdXQucmVwbywgcnVubmVyLmlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIHJ1bm5lciAke3J1bm5lci5pZH06ICR7ZX1gKTtcbiAgICAgICAgICAgIHJldHJ5TGF0ZXIoKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzdGlsbCBpZGxlLCB0aW1lb3V0IG5vdCByZWFjaGVkIC0tIHJldHJ5IGxhdGVyXG4gICAgICAgICAgcmV0cnlMYXRlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAvLyBubyBzdGFydGVkIGxhYmVsPyByZXRyeSBsYXRlciAoaXQgd29uJ3QgcmV0cnkgZm9yZXZlciBhcyBldmVudHVhbGx5IHRoZSBydW5uZXIgd2lsbCBzdG9wIGFuZCB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGZpbmlzaClcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGBjZGtnaHI6c3RhcnRlZDp4eHhgIGxhYmVsIGZvdW5kPz8/Jyk7XG4gICAgICByZXRyeUxhdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRsZS1ydW5uZXItcmVwZWFyLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pZGxlLXJ1bm5lci1yZXBlYXIubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG9EQUFnRztBQUdoRyxtREFBc0U7QUFXdEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxzQkFBUyxFQUFFLENBQUM7QUFFckIsS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUF5QjtJQUNyRCxNQUFNLE1BQU0sR0FBK0IsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNyRSxJQUFJLFlBQWlDLENBQUM7SUFDdEMsSUFBSSxXQUF1QyxDQUFDO0lBRTVDLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBMEIsQ0FBQztRQUMvRCxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ1YsTUFBTSxFQUFFLGlCQUFpQjtZQUN6QixLQUFLO1NBQ04sQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUU3RiwwQ0FBMEM7UUFDMUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUkscUNBQXdCLENBQUMsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFLENBQUM7WUFDbEMsbURBQW1EO1lBQ25ELE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLHlCQUF5QjtnQkFDakMsS0FBSzthQUNOLENBQUMs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QUFFLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUF0SUQsMEJBc0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpYmVFeGVjdXRpb25Db21tYW5kLCBTRk5DbGllbnQsIFN0b3BFeGVjdXRpb25Db21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNmbic7XG5pbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvcmVzdCc7XG5pbXBvcnQgKiBhcyBBV1NMYW1iZGEgZnJvbSAnYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBkZWxldGVSdW5uZXIsIGdldE9jdG9raXQsIGdldFJ1bm5lciB9IGZyb20gJy4vbGFtYmRhLWdpdGh1Yic7XG5cbmludGVyZmFjZSBJZGxlUmVhcGVyTGFtYmRhSW5wdXQge1xuICByZWFkb25seSBleGVjdXRpb25Bcm46IHN0cmluZztcbiAgcmVhZG9ubHkgcnVubmVyTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBvd25lcjogc3RyaW5nO1xuICByZWFkb25seSByZXBvOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGluc3RhbGxhdGlvbklkPzogbnVtYmVyO1xuICByZWFkb25seSBtYXhJZGxlU2Vjb25kczogbnVtYmVyO1xufVxuXG5jb25zdCBzZm4gPSBuZXcgU0ZOQ2xpZW50KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50OiBBV1NMYW1iZGEuU1FTRXZlbnQpOiBQcm9taXNlPEFXU0xhbWJkYS5TUVNCYXRjaFJlc3BvbnNlPiB7XG4gIGNvbnN0IHJlc3VsdDogQVdTTGFtYmRhLlNRU0JhdGNoUmVzcG9uc2UgPSB7IGJhdGNoSXRlbUZhaWx1cmVzOiBbXSB9O1xuICBsZXQgb2N0b2tpdENhY2hlOiBPY3Rva2l0IHwgdW5kZWZpbmVkO1xuICBsZXQgcnVubmVyTGV2ZWw6ICdyZXBvJyB8ICdvcmcnIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIGV2ZW50LlJlY29yZHMpIHtcbiAgICBjb25zdCBpbnB1dCA9IEpTT04ucGFyc2UocmVjb3JkLmJvZHkpIGFzIElkbGVSZWFwZXJMYW1iZGFJbnB1dDtcbiAgICBjb25zb2xlLmxvZyh7XG4gICAgICBub3RpY2U6ICdDaGVja2luZyBydW5uZXInLFxuICAgICAgaW5wdXQsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXRyeUxhdGVyID0gKCkgPT4gcmVzdWx0LmJhdGNoSXRlbUZhaWx1cmVzLnB1c2goeyBpdGVtSWRlbnRpZmllcjogcmVjb3JkLm1lc3NhZ2VJZCB9KTtcblxuICAgIC8vIGNoZWNrIGlmIHN0ZXAgZnVuY3Rpb24gaXMgc3RpbGwgcnVubmluZ1xuICAgIGNvbnN0IGV4ZWN1dGlvbiA9IGF3YWl0IHNmbi5zZW5kKG5ldyBEZXNjcmliZUV4ZWN1dGlvbkNvbW1hbmQoeyBleGVjdXRpb25Bcm46IGlucHV0LmV4ZWN1dGlvbkFybiB9KSk7XG4gICAgaWYgKGV4ZWN1dGlvbi5zdGF0dXMgIT0gJ1JVTk5JTkcnKSB7XG4gICAgICAvLyBubyBuZWVkIHRvIHRlc3QgYWdhaW4gYXMgcnVubmVyIGFscmVhZHkgZmluaXNoZWRcbiAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgbm90aWNlOiAnUnVubmVyIGFscmVhZHkgZmluaXNoZWQnLFxuICAgICAgICBpbnB1dCxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGdpdGh1YiBhY2Nlc3NcbiAgICBpZiAoIW9jdG9raXRDYWNoZSkge1xuICAgICAgLy8gZ2V0T2N0b2tpdCBjYWxscyBzZWNyZXRzIG1hbmFnZXIgZXZlcnkgdGltZSwgc28gY2FjaGUgdGhlIHJlc3VsdFxuICAgICAgY29uc3QgeyBvY3Rva2l0LCBnaXRodWJTZWNyZXRzIH0gPSBhd2FpdCBnZXRPY3Rva2l0KGlucHV0Lmluc3RhbGxhdGlvbklkKTtcbiAgICAgIC8vIFRPRE8gaWYgaW5zdGFsbGF0aW9uSWQgY2hhbmdlcyBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbnMsIHdlIG1heSBoYXZlIHNvbWUgcmVjb3JkcyB3aXRoIGdvb2QgaW5zdGFsbGF0aW9uSWQsIGFuZCBzb21lIHdpdGggYmFkXG4gICAgICBvY3Rva2l0Q2FjaGUgPSBvY3Rva2l0O1xuICAgICAgcnVubmVyTGV2ZWwgPSBnaXRodWJTZWNyZXRzLnJ1bm5lckxldmVsO1xuICAgIH1cblxuICAgIC8vIGZpbmQgcnVubmVyXG4gICAgY29uc3QgcnVubmVyID0gYXdhaXQgZ2V0UnVubmVyKG9jdG9raXRDYWNoZSwgcnVubmVyTGV2ZWwsIGlucHV0Lm93bmVyLCBpbnB1dC5yZXBvLCBpbnB1dC5ydW5uZXJOYW1lKTtcbiAgICBpZiAoIXJ1bm5lcikge1xuICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICBub3RpY2U6ICdSdW5uZXIgbm90IHJ1bm5pbmcgeWV0JyxcbiAgICAgICAgaW5wdXQsXG4gICAgICB9KTtcbiAgICAgIHJldHJ5TGF0ZXIoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGlmIG5vdCBpZGxlLCB0cnkgYWdhaW4gbGF0ZXJcbiAgICAvLyB3ZSB3YW50IHRvIHRyeSBhZ2FpbiBiZWNhdXNlIHRoZSBydW5uZXIgbWlnaHQgYmUgcmV0cmllZCBkdWUgdG8gZS5nLiBsYW1iZGEgdGltZW91dFxuICAgIC8vIHdlIG5lZWQgdG8ga2VlcCBmb2xsb3dpbmcgdGhlIHJldHJ5IHRvbyBhbmQgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZ28gaWRsZVxuICAgIGlmIChydW5uZXIuYnVzeSkge1xuICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICBub3RpY2U6ICdSdW5uZXIgaXMgbm90IGlkbGUnLFxuICAgICAgICBpbnB1dCxcbiAgICAgIH0pO1xuICAgICAgcmV0cnlMYXRlcigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgbWF4IGlkbGUgdGltZW91dCBoYXMgcmVhY2hlZFxuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgbGFiZWwgb2YgcnVubmVyLmxhYmVscykge1xuICAgICAgaWYgKGxhYmVsLm5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdjZGtnaHI6c3RhcnRlZDonKSkge1xuICAgICAgICBjb25zdCBzdGFydGVkID0gcGFyc2VGbG9hdChsYWJlbC5uYW1lLnNwbGl0KCc6JylbMl0pO1xuICAgICAgICBjb25zdCBzdGFydGVkRGF0ZSA9IG5ldyBEYXRlKHN0YXJ0ZWQgKiAxMDAwKTtcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgZGlmZk1zID0gbm93LmdldFRpbWUoKSAtIHN0YXJ0ZWREYXRlLmdldFRpbWUoKTtcblxuICAgICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgICAgbm90aWNlOiBgUnVubmVyICR7aW5wdXQucnVubmVyTmFtZX0gc3RhcnRlZCAke2RpZmZNcyAvIDEwMDB9IHNlY29uZHMgYWdvYCxcbiAgICAgICAgICBpbnB1dCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGRpZmZNcyA+IDEwMDAgKiBpbnB1dC5tYXhJZGxlU2Vjb25kcykge1xuICAgICAgICAgIC8vIG1heCBpZGxlIHRpbWUgcmVhY2hlZCwgZGVsZXRlIHJ1bm5lclxuICAgICAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgICAgIG5vdGljZTogYFJ1bm5lciAke2lucHV0LnJ1bm5lck5hbWV9IGlzIGlkbGUgZm9yIHRvbyBsb25nYCxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIHN0b3Agc3RlcCBmdW5jdGlvbiBmaXJzdCwgc28gaXQncyBtYXJrZWQgYXMgYWJvcnRlZCB3aXRoIHRoZSBwcm9wZXIgZXJyb3JcbiAgICAgICAgICAgIC8vIGlmIHdlIGRlbGV0ZSB0aGUgcnVubmVyIGZpcnN0LCB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIG1hcmtlZCBhcyBmYWlsZWQgd2l0aCBhIGdlbmVyaWMgZXJyb3JcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgICAgICAgbm90aWNlOiBgU3RvcHBpbmcgc3RlcCBmdW5jdGlvbiAke2lucHV0LmV4ZWN1dGlvbkFybn0uLi5gLFxuICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgc2ZuLnNlbmQobmV3IFN0b3BFeGVjdXRpb25Db21tYW5kKHtcbiAgICAgICAgICAgICAgZXhlY3V0aW9uQXJuOiBpbnB1dC5leGVjdXRpb25Bcm4sXG4gICAgICAgICAgICAgIGVycm9yOiAnSWRsZVJ1bm5lcicsXG4gICAgICAgICAgICAgIGNhdXNlOiBgUnVubmVyICR7aW5wdXQucnVubmVyTmFtZX0gb24gJHtpbnB1dC5vd25lcn0vJHtpbnB1dC5yZXBvfSBpcyBpZGxlIGZvciB0b28gbG9uZyAoJHtkaWZmTXMgLyAxMDAwfSBzZWNvbmRzIGFuZCBsaW1pdCBpcyAke2lucHV0Lm1heElkbGVTZWNvbmRzfSBzZWNvbmRzKWAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcih7XG4gICAgICAgICAgICAgIG5vdGljZTogYEZhaWxlZCB0byBzdG9wIHN0ZXAgZnVuY3Rpb24gJHtpbnB1dC5leGVjdXRpb25Bcm59OiAke2V9YCxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHJ5TGF0ZXIoKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgICAgICAgIG5vdGljZTogYERlbGV0aW5nIHJ1bm5lciAke3J1bm5lci5pZH0uLi5gLFxuICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgZGVsZXRlUnVubmVyKG9jdG9raXRDYWNoZSwgcnVubmVyTGV2ZWwsIGlucHV0Lm93bmVyLCBpbnB1dC5yZXBvLCBydW5uZXIuaWQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Ioe1xuICAgICAgICAgICAgICBub3RpY2U6IGBGYWlsZWQgdG8gZGVsZXRlIHJ1bm5lciAke3J1bm5lci5pZH06ICR7ZX1gLFxuICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0cnlMYXRlcigpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHN0aWxsIGlkbGUsIHRpbWVvdXQgbm90IHJlYWNoZWQgLS0gcmV0cnkgbGF0ZXJcbiAgICAgICAgICByZXRyeUxhdGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZm91bmQpIHtcbiAgICAgIC8vIG5vIHN0YXJ0ZWQgbGFiZWw/IHJldHJ5IGxhdGVyIChpdCB3b24ndCByZXRyeSBmb3JldmVyIGFzIGV2ZW50dWFsbHkgdGhlIHJ1bm5lciB3aWxsIHN0b3AgYW5kIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgZmluaXNoKVxuICAgICAgY29uc29sZS5lcnJvcih7XG4gICAgICAgIG5vdGljZTogJ05vIGBjZGtnaHI6c3RhcnRlZDp4eHhgIGxhYmVsIGZvdW5kPz8/JyxcbiAgICAgICAgaW5wdXQsXG4gICAgICB9KTtcbiAgICAgIHJldHJ5TGF0ZXIoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19
@@ -30,7 +30,7 @@ class RunnerImageBuilder extends common_1.RunnerImageBuilderBase {
30
30
  return new aws_image_builder_1.AwsImageBuilderRunnerImageBuilder(scope, id, props);
31
31
  }
32
32
  const os = props?.os ?? providers_1.Os.LINUX_UBUNTU;
33
- if (os.is(providers_1.Os.LINUX_UBUNTU) || os.is(providers_1.Os.LINUX_AMAZON_2) || os.is(providers_1.Os.LINUX_AMAZON_2023)) {
33
+ if (os.isIn(providers_1.Os._ALL_LINUX_VERSIONS)) {
34
34
  return new codebuild_1.CodeBuildRunnerImageBuilder(scope, id, props);
35
35
  }
36
36
  else if (os.is(providers_1.Os.WINDOWS)) {
@@ -43,5 +43,5 @@ class RunnerImageBuilder extends common_1.RunnerImageBuilderBase {
43
43
  }
44
44
  exports.RunnerImageBuilder = RunnerImageBuilder;
45
45
  _a = JSII_RTTI_SYMBOL_1;
46
- RunnerImageBuilder[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.RunnerImageBuilder", version: "0.12.4" };
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltYWdlLWJ1aWxkZXJzL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUEwQztBQUUxQywyREFBd0U7QUFDeEUsMkNBQTBEO0FBQzFELHFDQUFvSTtBQUNwSSw0Q0FBa0M7QUFFbEM7Ozs7OztHQU1HO0FBQ0gsTUFBc0Isa0JBQW1CLFNBQVEsK0JBQXNCO0lBQ3JFOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN0RSxJQUFJLEtBQUssRUFBRSxVQUFVLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdDLHlCQUFXLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxrSEFBa0gsQ0FBQyxDQUFDO1FBQ3ZKLENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxXQUFXLEtBQUssK0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0QsT0FBTyxJQUFJLHVDQUEyQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0QsQ0FBQzthQUFNLElBQUksS0FBSyxFQUFFLFdBQVcsS0FBSywrQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNFLE9BQU8sSUFBSSxxREFBaUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxJQUFJLGNBQUUsQ0FBQyxZQUFZLENBQUM7UUFDeEMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLGNBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLGNBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLGNBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7WUFDdEYsT0FBTyxJQUFJLHVDQUEyQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0QsQ0FBQzthQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxjQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUkscURBQWlDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7SUFDSCxDQUFDOztBQXZCSCxnREF3QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQXdzSW1hZ2VCdWlsZGVyUnVubmVySW1hZ2VCdWlsZGVyIH0gZnJvbSAnLi9hd3MtaW1hZ2UtYnVpbGRlcic7XG5pbXBvcnQgeyBDb2RlQnVpbGRSdW5uZXJJbWFnZUJ1aWxkZXIgfSBmcm9tICcuL2NvZGVidWlsZCc7XG5pbXBvcnQgeyBJQ29uZmlndXJhYmxlUnVubmVySW1hZ2VCdWlsZGVyLCBSdW5uZXJJbWFnZUJ1aWxkZXJCYXNlLCBSdW5uZXJJbWFnZUJ1aWxkZXJQcm9wcywgUnVubmVySW1hZ2VCdWlsZGVyVHlwZSB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7IE9zIH0gZnJvbSAnLi4vcHJvdmlkZXJzJztcblxuLyoqXG4gKiBHaXRIdWIgUnVubmVyIGltYWdlIGJ1aWxkZXIuIEJ1aWxkcyBhIERvY2tlciBpbWFnZSBvciBBTUkgd2l0aCBHaXRIdWIgUnVubmVyIGFuZCBvdGhlciByZXF1aXJlbWVudHMgaW5zdGFsbGVkLlxuICpcbiAqIEltYWdlcyBjYW4gYmUgY3VzdG9taXplZCBiZWZvcmUgcGFzc2VkIGludG8gdGhlIHByb3ZpZGVyIGJ5IGFkZGluZyBvciByZW1vdmluZyBjb21wb25lbnRzIHRvIGJlIGluc3RhbGxlZC5cbiAqXG4gKiBJbWFnZXMgYXJlIHJlYnVpbHQgZXZlcnkgd2VlayBieSBkZWZhdWx0IHRvIGVuc3VyZSB0aGF0IHRoZSBsYXRlc3Qgc2VjdXJpdHkgcGF0Y2hlcyBhcmUgYXBwbGllZC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJ1bm5lckltYWdlQnVpbGRlciBleHRlbmRzIFJ1bm5lckltYWdlQnVpbGRlckJhc2Uge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGltYWdlIGJ1aWxkZXIgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMuIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGRpZmZlciBiYXNlZCBvbiB0aGUgT1MsIGFyY2hpdGVjdHVyZSwgYW5kIHJlcXVlc3RlZCBidWlsZGVyIHR5cGUuXG4gICAqL1xuICBzdGF0aWMgbmV3KHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogUnVubmVySW1hZ2VCdWlsZGVyUHJvcHMpOiBJQ29uZmlndXJhYmxlUnVubmVySW1hZ2VCdWlsZGVyIHtcbiAgICBpZiAocHJvcHM/LmNvbXBvbmVudHMgJiYgcHJvcHMucnVubmVyVmVyc2lvbikge1xuICAgICAgQW5ub3RhdGlvbnMub2Yoc2NvcGUpLmFkZFdhcm5pbmcoJ3J1bm5lclZlcnNpb24gaXMgaWdub3JlZCB3aGVuIGNvbXBvbmVudHMgYXJlIHNwZWNpZmllZC4gVGhlIHJ1bm5lciB2ZXJzaW9uIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgY29tcG9uZW50cy4nKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHM/LmJ1aWxkZXJUeXBlID09PSBSdW5uZXJJbWFnZUJ1aWxkZXJUeXBlLkNPREVfQlVJTEQpIHtcbiAgICAgIHJldHVybiBuZXcgQ29kZUJ1aWxkUnVubmVySW1hZ2VCdWlsZGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIH0gZWxzZSBpZiAocHJvcHM/LmJ1aWxkZXJUeXBlID09PSBSdW5uZXJJbWFnZUJ1aWxkZXJUeXBlLkFXU19JTUFHRV9CVUlMREVSKSB7XG4gICAgICByZXR1cm4gbmV3IEF3c0ltYWdlQnVpbGRlclJ1bm5lckltYWdlQnVpbGRlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcyA9IHByb3BzPy5vcyA/PyBPcy5MSU5VWF9VQlVOVFU7XG4gICAgaWYgKG9zLmlzKE9zLkxJTlVYX1VCVU5UVSkgfHwgb3MuaXMoT3MuTElOVVhfQU1BWk9OXzIpIHx8IG9zLmlzKE9zLkxJTlVYX0FNQVpPTl8yMDIzKSkge1xuICAgICAgcmV0dXJuIG5ldyBDb2RlQnVpbGRSdW5uZXJJbWFnZUJ1aWxkZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgfSBlbHNlIGlmIChvcy5pcyhPcy5XSU5ET1dTKSkge1xuICAgICAgcmV0dXJuIG5ldyBBd3NJbWFnZUJ1aWxkZXJSdW5uZXJJbWFnZUJ1aWxkZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgcnVubmVyIGltYWdlIGJ1aWxkZXIgaW1wbGVtZW50YXRpb24gZm9yICR7b3MubmFtZX1gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
46
+ RunnerImageBuilder[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.RunnerImageBuilder", version: "0.13.0" };
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltYWdlLWJ1aWxkZXJzL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUEwQztBQUUxQywyREFBd0U7QUFDeEUsMkNBQTBEO0FBQzFELHFDQUFvSTtBQUNwSSw0Q0FBa0M7QUFFbEM7Ozs7OztHQU1HO0FBQ0gsTUFBc0Isa0JBQW1CLFNBQVEsK0JBQXNCO0lBQ3JFOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN0RSxJQUFJLEtBQUssRUFBRSxVQUFVLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdDLHlCQUFXLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxrSEFBa0gsQ0FBQyxDQUFDO1FBQ3ZKLENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxXQUFXLEtBQUssK0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0QsT0FBTyxJQUFJLHVDQUEyQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0QsQ0FBQzthQUFNLElBQUksS0FBSyxFQUFFLFdBQVcsS0FBSywrQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNFLE9BQU8sSUFBSSxxREFBaUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxJQUFJLGNBQUUsQ0FBQyxZQUFZLENBQUM7UUFDeEMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLHVDQUEyQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0QsQ0FBQzthQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxjQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUkscURBQWlDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7SUFDSCxDQUFDOztBQXZCSCxnREF3QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQXdzSW1hZ2VCdWlsZGVyUnVubmVySW1hZ2VCdWlsZGVyIH0gZnJvbSAnLi9hd3MtaW1hZ2UtYnVpbGRlcic7XG5pbXBvcnQgeyBDb2RlQnVpbGRSdW5uZXJJbWFnZUJ1aWxkZXIgfSBmcm9tICcuL2NvZGVidWlsZCc7XG5pbXBvcnQgeyBJQ29uZmlndXJhYmxlUnVubmVySW1hZ2VCdWlsZGVyLCBSdW5uZXJJbWFnZUJ1aWxkZXJCYXNlLCBSdW5uZXJJbWFnZUJ1aWxkZXJQcm9wcywgUnVubmVySW1hZ2VCdWlsZGVyVHlwZSB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7IE9zIH0gZnJvbSAnLi4vcHJvdmlkZXJzJztcblxuLyoqXG4gKiBHaXRIdWIgUnVubmVyIGltYWdlIGJ1aWxkZXIuIEJ1aWxkcyBhIERvY2tlciBpbWFnZSBvciBBTUkgd2l0aCBHaXRIdWIgUnVubmVyIGFuZCBvdGhlciByZXF1aXJlbWVudHMgaW5zdGFsbGVkLlxuICpcbiAqIEltYWdlcyBjYW4gYmUgY3VzdG9taXplZCBiZWZvcmUgcGFzc2VkIGludG8gdGhlIHByb3ZpZGVyIGJ5IGFkZGluZyBvciByZW1vdmluZyBjb21wb25lbnRzIHRvIGJlIGluc3RhbGxlZC5cbiAqXG4gKiBJbWFnZXMgYXJlIHJlYnVpbHQgZXZlcnkgd2VlayBieSBkZWZhdWx0IHRvIGVuc3VyZSB0aGF0IHRoZSBsYXRlc3Qgc2VjdXJpdHkgcGF0Y2hlcyBhcmUgYXBwbGllZC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJ1bm5lckltYWdlQnVpbGRlciBleHRlbmRzIFJ1bm5lckltYWdlQnVpbGRlckJhc2Uge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGltYWdlIGJ1aWxkZXIgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMuIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGRpZmZlciBiYXNlZCBvbiB0aGUgT1MsIGFyY2hpdGVjdHVyZSwgYW5kIHJlcXVlc3RlZCBidWlsZGVyIHR5cGUuXG4gICAqL1xuICBzdGF0aWMgbmV3KHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogUnVubmVySW1hZ2VCdWlsZGVyUHJvcHMpOiBJQ29uZmlndXJhYmxlUnVubmVySW1hZ2VCdWlsZGVyIHtcbiAgICBpZiAocHJvcHM/LmNvbXBvbmVudHMgJiYgcHJvcHMucnVubmVyVmVyc2lvbikge1xuICAgICAgQW5ub3RhdGlvbnMub2Yoc2NvcGUpLmFkZFdhcm5pbmcoJ3J1bm5lclZlcnNpb24gaXMgaWdub3JlZCB3aGVuIGNvbXBvbmVudHMgYXJlIHNwZWNpZmllZC4gVGhlIHJ1bm5lciB2ZXJzaW9uIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgY29tcG9uZW50cy4nKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHM/LmJ1aWxkZXJUeXBlID09PSBSdW5uZXJJbWFnZUJ1aWxkZXJUeXBlLkNPREVfQlVJTEQpIHtcbiAgICAgIHJldHVybiBuZXcgQ29kZUJ1aWxkUnVubmVySW1hZ2VCdWlsZGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIH0gZWxzZSBpZiAocHJvcHM/LmJ1aWxkZXJUeXBlID09PSBSdW5uZXJJbWFnZUJ1aWxkZXJUeXBlLkFXU19JTUFHRV9CVUlMREVSKSB7XG4gICAgICByZXR1cm4gbmV3IEF3c0ltYWdlQnVpbGRlclJ1bm5lckltYWdlQnVpbGRlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcyA9IHByb3BzPy5vcyA/PyBPcy5MSU5VWF9VQlVOVFU7XG4gICAgaWYgKG9zLmlzSW4oT3MuX0FMTF9MSU5VWF9WRVJTSU9OUykpIHtcbiAgICAgIHJldHVybiBuZXcgQ29kZUJ1aWxkUnVubmVySW1hZ2VCdWlsZGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIH0gZWxzZSBpZiAob3MuaXMoT3MuV0lORE9XUykpIHtcbiAgICAgIHJldHVybiBuZXcgQXdzSW1hZ2VCdWlsZGVyUnVubmVySW1hZ2VCdWlsZGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIHJ1bm5lciBpbWFnZSBidWlsZGVyIGltcGxlbWVudGF0aW9uIGZvciAke29zLm5hbWV9YCk7XG4gICAgfVxuICB9XG59XG4iXX0=