@cloudsnorkel/cdk-github-runners 0.9.4 → 0.9.5
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 +3 -3
- package/.jsii +315 -267
- package/API.md +43 -7
- package/README.md +15 -2
- package/assets/{providers/image-builders → image-builders}/aws-image-builder/delete-ami.lambda/index.js +2 -2
- package/assets/{providers/image-builders → image-builders}/aws-image-builder/filter-failed-builds.lambda/index.js +1 -1
- package/assets/{providers/image-builders → image-builders}/aws-image-builder/versioner.lambda/index.js +2 -2
- package/lib/access.js +1 -1
- package/lib/image-builders/api.js +47 -0
- package/lib/{providers/image-builders → image-builders}/aws-image-builder/ami.d.ts +2 -3
- package/lib/image-builders/aws-image-builder/ami.js +93 -0
- package/lib/{providers/image-builders → image-builders}/aws-image-builder/builder.d.ts +9 -2
- package/lib/image-builders/aws-image-builder/builder.js +529 -0
- package/lib/image-builders/aws-image-builder/common.js +46 -0
- package/lib/{providers/image-builders → image-builders}/aws-image-builder/container.d.ts +1 -1
- package/lib/image-builders/aws-image-builder/container.js +63 -0
- package/lib/{providers/image-builders → image-builders}/aws-image-builder/delete-ami-function.d.ts +1 -1
- package/lib/image-builders/aws-image-builder/delete-ami-function.js +23 -0
- package/lib/image-builders/aws-image-builder/delete-ami.lambda.js +87 -0
- package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/ami.d.ts +2 -2
- package/lib/image-builders/aws-image-builder/deprecated/ami.js +240 -0
- package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/common.d.ts +1 -1
- package/lib/image-builders/aws-image-builder/deprecated/common.js +144 -0
- package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/container.d.ts +1 -1
- package/lib/image-builders/aws-image-builder/deprecated/container.js +222 -0
- package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/index.js +1 -1
- package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/linux-components.d.ts +1 -1
- package/lib/image-builders/aws-image-builder/deprecated/linux-components.js +172 -0
- package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/windows-components.d.ts +1 -1
- package/lib/image-builders/aws-image-builder/deprecated/windows-components.js +126 -0
- package/lib/{providers/image-builders → image-builders}/aws-image-builder/filter-failed-builds-function.d.ts +1 -1
- package/lib/image-builders/aws-image-builder/filter-failed-builds-function.js +23 -0
- package/lib/image-builders/aws-image-builder/filter-failed-builds.lambda.js +18 -0
- package/lib/{providers/image-builders → image-builders}/aws-image-builder/index.js +1 -1
- package/lib/{providers/image-builders → image-builders}/aws-image-builder/versioner-function.d.ts +1 -1
- package/lib/image-builders/aws-image-builder/versioner-function.js +23 -0
- package/lib/image-builders/aws-image-builder/versioner.lambda.js +96 -0
- package/lib/{providers/image-builders → image-builders}/codebuild-deprecated.d.ts +2 -2
- package/lib/image-builders/codebuild-deprecated.js +373 -0
- package/lib/{providers/image-builders → image-builders}/codebuild.d.ts +2 -2
- package/lib/image-builders/codebuild.js +287 -0
- package/lib/{providers/image-builders → image-builders}/common.d.ts +4 -2
- package/lib/image-builders/common.js +61 -0
- package/lib/{providers/image-builders → image-builders}/components.d.ts +8 -2
- package/lib/image-builders/components.js +568 -0
- package/lib/{providers/image-builders → image-builders}/index.js +1 -1
- package/lib/{providers/image-builders → image-builders}/static.d.ts +1 -1
- package/lib/image-builders/static.js +58 -0
- package/lib/providers/codebuild.d.ts +1 -1
- package/lib/providers/codebuild.js +4 -4
- package/lib/providers/common.js +3 -3
- package/lib/providers/ec2.d.ts +1 -1
- package/lib/providers/ec2.js +4 -4
- package/lib/providers/ecs.d.ts +1 -1
- package/lib/providers/ecs.js +3 -3
- package/lib/providers/fargate.d.ts +1 -1
- package/lib/providers/fargate.js +4 -4
- package/lib/providers/index.d.ts +1 -1
- package/lib/providers/index.js +2 -2
- package/lib/providers/lambda.d.ts +1 -1
- package/lib/providers/lambda.js +4 -4
- package/lib/runner.js +1 -1
- package/lib/secrets.js +1 -1
- package/package.json +10 -10
- package/lib/providers/image-builders/api.js +0 -47
- package/lib/providers/image-builders/aws-image-builder/ami.js +0 -81
- package/lib/providers/image-builders/aws-image-builder/builder.js +0 -520
- package/lib/providers/image-builders/aws-image-builder/common.js +0 -46
- package/lib/providers/image-builders/aws-image-builder/container.js +0 -63
- package/lib/providers/image-builders/aws-image-builder/delete-ami-function.js +0 -23
- package/lib/providers/image-builders/aws-image-builder/delete-ami.lambda.js +0 -87
- package/lib/providers/image-builders/aws-image-builder/deprecated/ami.js +0 -240
- package/lib/providers/image-builders/aws-image-builder/deprecated/common.js +0 -144
- package/lib/providers/image-builders/aws-image-builder/deprecated/container.js +0 -222
- package/lib/providers/image-builders/aws-image-builder/deprecated/linux-components.js +0 -172
- package/lib/providers/image-builders/aws-image-builder/deprecated/windows-components.js +0 -129
- package/lib/providers/image-builders/aws-image-builder/filter-failed-builds-function.js +0 -23
- package/lib/providers/image-builders/aws-image-builder/filter-failed-builds.lambda.js +0 -18
- package/lib/providers/image-builders/aws-image-builder/versioner-function.js +0 -23
- package/lib/providers/image-builders/aws-image-builder/versioner.lambda.js +0 -96
- package/lib/providers/image-builders/codebuild-deprecated.js +0 -373
- package/lib/providers/image-builders/codebuild.js +0 -287
- package/lib/providers/image-builders/common.js +0 -61
- package/lib/providers/image-builders/components.js +0 -535
- package/lib/providers/image-builders/static.js +0 -58
- /package/lib/{providers/image-builders → image-builders}/api.d.ts +0 -0
- /package/lib/{providers/image-builders → image-builders}/aws-image-builder/common.d.ts +0 -0
- /package/lib/{providers/image-builders → image-builders}/aws-image-builder/delete-ami.lambda.d.ts +0 -0
- /package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/index.d.ts +0 -0
- /package/lib/{providers/image-builders → image-builders}/aws-image-builder/filter-failed-builds.lambda.d.ts +0 -0
- /package/lib/{providers/image-builders → image-builders}/aws-image-builder/index.d.ts +0 -0
- /package/lib/{providers/image-builders → image-builders}/aws-image-builder/versioner.lambda.d.ts +0 -0
- /package/lib/{providers/image-builders → image-builders}/index.d.ts +0 -0
package/API.md
CHANGED
|
@@ -3294,7 +3294,8 @@ new ImageBuilderComponent(this, 'AWS CLI', {
|
|
|
3294
3294
|
displayName: 'AWS CLI',
|
|
3295
3295
|
description: 'Install latest version of AWS CLI',
|
|
3296
3296
|
commands: [
|
|
3297
|
-
'Start-Process msiexec.exe -Wait -ArgumentList \'/i https://awscli.amazonaws.com/AWSCLIV2.msi /qn\'',
|
|
3297
|
+
'$p = Start-Process msiexec.exe -PassThru -Wait -ArgumentList \'/i https://awscli.amazonaws.com/AWSCLIV2.msi /qn\'',
|
|
3298
|
+
'if ($p.ExitCode -ne 0) { throw "Exit code is $p.ExitCode" }',
|
|
3298
3299
|
],
|
|
3299
3300
|
}
|
|
3300
3301
|
```
|
|
@@ -4666,8 +4667,6 @@ public readonly installDocker: boolean;
|
|
|
4666
4667
|
|
|
4667
4668
|
Install Docker inside the image, so it can be used by the runner.
|
|
4668
4669
|
|
|
4669
|
-
You may want to disable this if you are building a Windows image and don't have a Docker Desktop license.
|
|
4670
|
-
|
|
4671
4670
|
---
|
|
4672
4671
|
|
|
4673
4672
|
##### `instanceType`<sup>Optional</sup> <a name="instanceType" id="@cloudsnorkel/cdk-github-runners.AmiBuilderProps.property.instanceType"></a>
|
|
@@ -4975,7 +4974,7 @@ public readonly buildImage: IBuildImage;
|
|
|
4975
4974
|
```
|
|
4976
4975
|
|
|
4977
4976
|
- *Type:* aws-cdk-lib.aws_codebuild.IBuildImage
|
|
4978
|
-
- *Default:* Ubuntu
|
|
4977
|
+
- *Default:* Ubuntu 22.04 for x64 and Amazon Linux 2 for ARM64
|
|
4979
4978
|
|
|
4980
4979
|
Build image to use in CodeBuild.
|
|
4981
4980
|
|
|
@@ -5159,7 +5158,7 @@ public readonly buildImage: IBuildImage;
|
|
|
5159
5158
|
```
|
|
5160
5159
|
|
|
5161
5160
|
- *Type:* aws-cdk-lib.aws_codebuild.IBuildImage
|
|
5162
|
-
- *Default:* Ubuntu
|
|
5161
|
+
- *Default:* Ubuntu 22.04 for x64 and Amazon Linux 2 for ARM64
|
|
5163
5162
|
|
|
5164
5163
|
Build image to use in CodeBuild.
|
|
5165
5164
|
|
|
@@ -6700,6 +6699,7 @@ const imageBuilderComponentProperties: ImageBuilderComponentProperties = { ... }
|
|
|
6700
6699
|
| <code><a href="#@cloudsnorkel/cdk-github-runners.ImageBuilderComponentProperties.property.displayName">displayName</a></code> | <code>string</code> | Component display name. |
|
|
6701
6700
|
| <code><a href="#@cloudsnorkel/cdk-github-runners.ImageBuilderComponentProperties.property.platform">platform</a></code> | <code>string</code> | Component platform. |
|
|
6702
6701
|
| <code><a href="#@cloudsnorkel/cdk-github-runners.ImageBuilderComponentProperties.property.assets">assets</a></code> | <code><a href="#@cloudsnorkel/cdk-github-runners.ImageBuilderAsset">ImageBuilderAsset</a>[]</code> | Optional assets to add to the built image. |
|
|
6702
|
+
| <code><a href="#@cloudsnorkel/cdk-github-runners.ImageBuilderComponentProperties.property.reboot">reboot</a></code> | <code>boolean</code> | Require a reboot after installing this component. |
|
|
6703
6703
|
|
|
6704
6704
|
---
|
|
6705
6705
|
|
|
@@ -6767,6 +6767,19 @@ Optional assets to add to the built image.
|
|
|
6767
6767
|
|
|
6768
6768
|
---
|
|
6769
6769
|
|
|
6770
|
+
##### `reboot`<sup>Optional</sup> <a name="reboot" id="@cloudsnorkel/cdk-github-runners.ImageBuilderComponentProperties.property.reboot"></a>
|
|
6771
|
+
|
|
6772
|
+
```typescript
|
|
6773
|
+
public readonly reboot: boolean;
|
|
6774
|
+
```
|
|
6775
|
+
|
|
6776
|
+
- *Type:* boolean
|
|
6777
|
+
- *Default:* false
|
|
6778
|
+
|
|
6779
|
+
Require a reboot after installing this component.
|
|
6780
|
+
|
|
6781
|
+
---
|
|
6782
|
+
|
|
6770
6783
|
### LambdaRunnerProviderProps <a name="LambdaRunnerProviderProps" id="@cloudsnorkel/cdk-github-runners.LambdaRunnerProviderProps"></a>
|
|
6771
6784
|
|
|
6772
6785
|
#### Initializer <a name="Initializer" id="@cloudsnorkel/cdk-github-runners.LambdaRunnerProviderProps.Initializer"></a>
|
|
@@ -7432,10 +7445,12 @@ public readonly baseAmi: string;
|
|
|
7432
7445
|
```
|
|
7433
7446
|
|
|
7434
7447
|
- *Type:* string
|
|
7435
|
-
- *Default:* latest Ubuntu
|
|
7448
|
+
- *Default:* latest Ubuntu 22.04 AMI for Os.LINUX_UBUNTU, latest Amazon Linux 2 AMI for Os.LINUX_AMAZON_2, latest Windows Server 2022 AMI for Os.WINDOWS
|
|
7436
7449
|
|
|
7437
7450
|
Base AMI from which runner AMIs will be built.
|
|
7438
7451
|
|
|
7452
|
+
This can be an actual AMI or an AWS Image Builder ARN that points to the latest AMI. For example `arn:aws:imagebuilder:us-east-1:aws:image/ubuntu-server-22-lts-x86/x.x.x` would always use the latest version of Ubuntu 22.04 in each build. If you want a specific version, you can replace `x.x.x` with that version.
|
|
7453
|
+
|
|
7439
7454
|
---
|
|
7440
7455
|
|
|
7441
7456
|
##### `baseDockerImage`<sup>Optional</sup> <a name="baseDockerImage" id="@cloudsnorkel/cdk-github-runners.RunnerImageBuilderProps.property.baseDockerImage"></a>
|
|
@@ -8443,6 +8458,7 @@ new RunnerImageComponent()
|
|
|
8443
8458
|
| <code><a href="#@cloudsnorkel/cdk-github-runners.RunnerImageComponent.getAssets">getAssets</a></code> | Returns assets to copy into the built image. |
|
|
8444
8459
|
| <code><a href="#@cloudsnorkel/cdk-github-runners.RunnerImageComponent.getCommands">getCommands</a></code> | Returns commands to run to in built image. |
|
|
8445
8460
|
| <code><a href="#@cloudsnorkel/cdk-github-runners.RunnerImageComponent.getDockerCommands">getDockerCommands</a></code> | Returns Docker commands to run to in built image. |
|
|
8461
|
+
| <code><a href="#@cloudsnorkel/cdk-github-runners.RunnerImageComponent.shouldReboot">shouldReboot</a></code> | Returns true if the image builder should be rebooted after this component is installed. |
|
|
8446
8462
|
|
|
8447
8463
|
---
|
|
8448
8464
|
|
|
@@ -8514,6 +8530,26 @@ Docker commands are added after assets and normal commands.
|
|
|
8514
8530
|
|
|
8515
8531
|
---
|
|
8516
8532
|
|
|
8533
|
+
##### `shouldReboot` <a name="shouldReboot" id="@cloudsnorkel/cdk-github-runners.RunnerImageComponent.shouldReboot"></a>
|
|
8534
|
+
|
|
8535
|
+
```typescript
|
|
8536
|
+
public shouldReboot(_os: Os, _architecture: Architecture): boolean
|
|
8537
|
+
```
|
|
8538
|
+
|
|
8539
|
+
Returns true if the image builder should be rebooted after this component is installed.
|
|
8540
|
+
|
|
8541
|
+
###### `_os`<sup>Required</sup> <a name="_os" id="@cloudsnorkel/cdk-github-runners.RunnerImageComponent.shouldReboot.parameter._os"></a>
|
|
8542
|
+
|
|
8543
|
+
- *Type:* <a href="#@cloudsnorkel/cdk-github-runners.Os">Os</a>
|
|
8544
|
+
|
|
8545
|
+
---
|
|
8546
|
+
|
|
8547
|
+
###### `_architecture`<sup>Required</sup> <a name="_architecture" id="@cloudsnorkel/cdk-github-runners.RunnerImageComponent.shouldReboot.parameter._architecture"></a>
|
|
8548
|
+
|
|
8549
|
+
- *Type:* <a href="#@cloudsnorkel/cdk-github-runners.Architecture">Architecture</a>
|
|
8550
|
+
|
|
8551
|
+
---
|
|
8552
|
+
|
|
8517
8553
|
#### Static Functions <a name="Static Functions" id="Static Functions"></a>
|
|
8518
8554
|
|
|
8519
8555
|
| **Name** | **Description** |
|
|
@@ -8574,7 +8610,7 @@ RunnerImageComponent.docker()
|
|
|
8574
8610
|
|
|
8575
8611
|
A component to install Docker.
|
|
8576
8612
|
|
|
8577
|
-
On Windows this
|
|
8613
|
+
On Windows this sets up dockerd for Windows containers without Docker Desktop. If you need Linux containers on Windows, you'll need to install Docker Desktop which doesn't seem to play well with servers (PRs welcome).
|
|
8578
8614
|
|
|
8579
8615
|
##### `dockerInDocker` <a name="dockerInDocker" id="@cloudsnorkel/cdk-github-runners.RunnerImageComponent.dockerInDocker"></a>
|
|
8580
8616
|
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[][7]
|
|
4
4
|
[][6]
|
|
5
|
-
[][8]
|
|
6
6
|
[][11]
|
|
7
7
|
[][12]
|
|
8
8
|
[](https://github.com/CloudSnorkel/cdk-github-runners/actions/workflows/release.yml)
|
|
@@ -21,6 +21,7 @@ Self-hosted runners in AWS are useful when:
|
|
|
21
21
|
* You need easy access to internal resources in your actions
|
|
22
22
|
* You want to pre-install some software for your actions
|
|
23
23
|
* You want to provide some basic AWS API access (but [aws-actions/configure-aws-credentials][2] has more security controls)
|
|
24
|
+
* You are using GitHub Enterprise Server
|
|
24
25
|
|
|
25
26
|
Ephemeral (or on-demand) runners are the [recommended way by GitHub][14] for auto-scaling, and they make sure all jobs run with a clean image. Runners are started on-demand. You don't pay unless a job is running.
|
|
26
27
|
|
|
@@ -212,7 +213,7 @@ new GitHubRunners(this, 'runners', {
|
|
|
212
213
|
1. Always start with the status function, make sure no errors are reported, and confirm all status codes are OK
|
|
213
214
|
2. If jobs are stuck on pending:
|
|
214
215
|
1. Make sure `runs-on` in the workflow matches the expected labels set in the runner provider
|
|
215
|
-
2. If
|
|
216
|
+
2. If jobs get stuck often and take a long time to start, cancel the pending jobs and start them again
|
|
216
217
|
4. Confirm the webhook Lambda was called by visiting the URL in `troubleshooting.webhookHandlerUrl` from `status.json`
|
|
217
218
|
1. If it's not called or logs errors, confirm the webhook settings on the GitHub side
|
|
218
219
|
2. If you see too many errors, make sure you're only sending `workflow_job` events
|
|
@@ -221,6 +222,18 @@ new GitHubRunners(this, 'runners', {
|
|
|
221
222
|
1. Use the details tab to find the specific execution of the provider (Lambda, CodeBuild, Fargate, etc.)
|
|
222
223
|
2. Every step function execution should be successful, even if the runner action inside it failed
|
|
223
224
|
|
|
225
|
+
## Monitoring
|
|
226
|
+
|
|
227
|
+
There are two important ways to monitor your runners:
|
|
228
|
+
|
|
229
|
+
1. Make sure runners don't fail to start. When that happens, jobs may sit and wait. Use `GitHubRunners.metricFailed()` to get a metric for the number of failed runner starts. You should use this metric to trigger an alarm.
|
|
230
|
+
2. Make sure runner images don't fail to build. Failed runner image builds mean you will get stuck with out-of-date software on your runners. It may lead to security vulnerabilities, or it may lead to slower runner start-ups as the runner software itself needs to be updated. Use `GitHubRunners.failedImageBuildsTopic()` to get SNS topic that gets notified of failed runner image builds. You should subscribe to this topic.
|
|
231
|
+
|
|
232
|
+
Other useful metrics to track:
|
|
233
|
+
|
|
234
|
+
1. Use `GitHubRunners.metricJobCompleted()` to get a metric for the number of completed jobs broken down by labels and job success.
|
|
235
|
+
2. Use `GitHubRunners.metricTime()` to get a metric for the total time a runner is running. This includes the overhead of starting the runner.
|
|
236
|
+
|
|
224
237
|
## Other Options
|
|
225
238
|
|
|
226
239
|
1. [philips-labs/terraform-aws-github-runner][3] if you're using Terraform
|
|
@@ -22,7 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
22
22
|
mod
|
|
23
23
|
));
|
|
24
24
|
|
|
25
|
-
// src/
|
|
25
|
+
// src/image-builders/aws-image-builder/delete-ami.lambda.ts
|
|
26
26
|
var AWS2 = __toESM(require("aws-sdk"));
|
|
27
27
|
|
|
28
28
|
// src/lambda-helpers.ts
|
|
@@ -62,7 +62,7 @@ async function customResourceRespond(event, responseStatus, reason, physicalReso
|
|
|
62
62
|
});
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
// src/
|
|
65
|
+
// src/image-builders/aws-image-builder/delete-ami.lambda.ts
|
|
66
66
|
var ec2 = new AWS2.EC2();
|
|
67
67
|
async function deleteAmis(launchTemplateId, stackName, builderName, deleteAll) {
|
|
68
68
|
var _a;
|
|
@@ -22,7 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
22
22
|
mod
|
|
23
23
|
));
|
|
24
24
|
|
|
25
|
-
// src/
|
|
25
|
+
// src/image-builders/aws-image-builder/filter-failed-builds.lambda.ts
|
|
26
26
|
var AWS = __toESM(require("aws-sdk"));
|
|
27
27
|
var sns = new AWS.SNS();
|
|
28
28
|
exports.handler = async function(event) {
|
|
@@ -2432,7 +2432,7 @@ var require_semver2 = __commonJS({
|
|
|
2432
2432
|
}
|
|
2433
2433
|
});
|
|
2434
2434
|
|
|
2435
|
-
// src/
|
|
2435
|
+
// src/image-builders/aws-image-builder/versioner.lambda.ts
|
|
2436
2436
|
var versioner_lambda_exports = {};
|
|
2437
2437
|
__export(versioner_lambda_exports, {
|
|
2438
2438
|
handler: () => handler
|
|
@@ -2478,7 +2478,7 @@ async function customResourceRespond(event, responseStatus, reason, physicalReso
|
|
|
2478
2478
|
});
|
|
2479
2479
|
}
|
|
2480
2480
|
|
|
2481
|
-
// src/
|
|
2481
|
+
// src/image-builders/aws-image-builder/versioner.lambda.ts
|
|
2482
2482
|
var ib = new AWS2.Imagebuilder();
|
|
2483
2483
|
async function handler(event, context) {
|
|
2484
2484
|
console.log(JSON.stringify({ ...event, ResponseURL: "..." }));
|
package/lib/access.js
CHANGED
|
@@ -56,7 +56,7 @@ class LambdaAccess {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
_a = JSII_RTTI_SYMBOL_1;
|
|
59
|
-
LambdaAccess[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.LambdaAccess", version: "0.9.
|
|
59
|
+
LambdaAccess[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.LambdaAccess", version: "0.9.5" };
|
|
60
60
|
exports.LambdaAccess = LambdaAccess;
|
|
61
61
|
/**
|
|
62
62
|
* @internal
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.RunnerImageBuilder = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
|
+
const aws_image_builder_1 = require("./aws-image-builder");
|
|
8
|
+
const codebuild_1 = require("./codebuild");
|
|
9
|
+
const common_1 = require("./common");
|
|
10
|
+
const common_2 = require("../providers/common");
|
|
11
|
+
/**
|
|
12
|
+
* GitHub Runner image builder. Builds a Docker image or AMI with GitHub Runner and other requirements installed.
|
|
13
|
+
*
|
|
14
|
+
* Images can be customized before passed into the provider by adding or removing components to be installed.
|
|
15
|
+
*
|
|
16
|
+
* Images are rebuilt every week by default to ensure that the latest security patches are applied.
|
|
17
|
+
*/
|
|
18
|
+
class RunnerImageBuilder extends common_1.RunnerImageBuilderBase {
|
|
19
|
+
/**
|
|
20
|
+
* Create a new image builder based on the provided properties. The implementation will differ based on the OS, architecture, and requested builder type.
|
|
21
|
+
*/
|
|
22
|
+
static new(scope, id, props) {
|
|
23
|
+
if (props?.components && props.runnerVersion) {
|
|
24
|
+
aws_cdk_lib_1.Annotations.of(scope).addWarning('runnerVersion is ignored when components are specified. The runner version will be determined by the components.');
|
|
25
|
+
}
|
|
26
|
+
if (props?.builderType === common_1.RunnerImageBuilderType.CODE_BUILD) {
|
|
27
|
+
return new codebuild_1.CodeBuildRunnerImageBuilder(scope, id, props);
|
|
28
|
+
}
|
|
29
|
+
else if (props?.builderType === common_1.RunnerImageBuilderType.AWS_IMAGE_BUILDER) {
|
|
30
|
+
return new aws_image_builder_1.AwsImageBuilderRunnerImageBuilder(scope, id, props);
|
|
31
|
+
}
|
|
32
|
+
const os = props?.os ?? common_2.Os.LINUX_UBUNTU;
|
|
33
|
+
if (os.is(common_2.Os.LINUX_UBUNTU) || os.is(common_2.Os.LINUX_AMAZON_2)) {
|
|
34
|
+
return new codebuild_1.CodeBuildRunnerImageBuilder(scope, id, props);
|
|
35
|
+
}
|
|
36
|
+
else if (os.is(common_2.Os.WINDOWS)) {
|
|
37
|
+
return new aws_image_builder_1.AwsImageBuilderRunnerImageBuilder(scope, id, props);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
throw new Error(`Unable to find runner image builder implementation for ${os.name}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
45
|
+
RunnerImageBuilder[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.RunnerImageBuilder", version: "0.9.5" };
|
|
46
|
+
exports.RunnerImageBuilder = RunnerImageBuilder;
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltYWdlLWJ1aWxkZXJzL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUEwQztBQUUxQywyREFBd0U7QUFDeEUsMkNBQTBEO0FBQzFELHFDQUFtRztBQUNuRyxnREFBeUM7QUFFekM7Ozs7OztHQU1HO0FBQ0gsTUFBc0Isa0JBQW1CLFNBQVEsK0JBQXNCO0lBQ3JFOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN0RSxJQUFJLEtBQUssRUFBRSxVQUFVLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUM1Qyx5QkFBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsa0hBQWtILENBQUMsQ0FBQztTQUN0SjtRQUVELElBQUksS0FBSyxFQUFFLFdBQVcsS0FBSywrQkFBc0IsQ0FBQyxVQUFVLEVBQUU7WUFDNUQsT0FBTyxJQUFJLHVDQUEyQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDMUQ7YUFBTSxJQUFJLEtBQUssRUFBRSxXQUFXLEtBQUssK0JBQXNCLENBQUMsaUJBQWlCLEVBQUU7WUFDMUUsT0FBTyxJQUFJLHFEQUFpQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDaEU7UUFFRCxNQUFNLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxJQUFJLFdBQUUsQ0FBQyxZQUFZLENBQUM7UUFDeEMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUN0RCxPQUFPLElBQUksdUNBQTJCLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMxRDthQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDNUIsT0FBTyxJQUFJLHFEQUFpQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDaEU7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ3RGO0lBQ0gsQ0FBQzs7OztBQXZCbUIsZ0RBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEF3c0ltYWdlQnVpbGRlclJ1bm5lckltYWdlQnVpbGRlciB9IGZyb20gJy4vYXdzLWltYWdlLWJ1aWxkZXInO1xuaW1wb3J0IHsgQ29kZUJ1aWxkUnVubmVySW1hZ2VCdWlsZGVyIH0gZnJvbSAnLi9jb2RlYnVpbGQnO1xuaW1wb3J0IHsgUnVubmVySW1hZ2VCdWlsZGVyQmFzZSwgUnVubmVySW1hZ2VCdWlsZGVyUHJvcHMsIFJ1bm5lckltYWdlQnVpbGRlclR5cGUgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBPcyB9IGZyb20gJy4uL3Byb3ZpZGVycy9jb21tb24nO1xuXG4vKipcbiAqIEdpdEh1YiBSdW5uZXIgaW1hZ2UgYnVpbGRlci4gQnVpbGRzIGEgRG9ja2VyIGltYWdlIG9yIEFNSSB3aXRoIEdpdEh1YiBSdW5uZXIgYW5kIG90aGVyIHJlcXVpcmVtZW50cyBpbnN0YWxsZWQuXG4gKlxuICogSW1hZ2VzIGNhbiBiZSBjdXN0b21pemVkIGJlZm9yZSBwYXNzZWQgaW50byB0aGUgcHJvdmlkZXIgYnkgYWRkaW5nIG9yIHJlbW92aW5nIGNvbXBvbmVudHMgdG8gYmUgaW5zdGFsbGVkLlxuICpcbiAqIEltYWdlcyBhcmUgcmVidWlsdCBldmVyeSB3ZWVrIGJ5IGRlZmF1bHQgdG8gZW5zdXJlIHRoYXQgdGhlIGxhdGVzdCBzZWN1cml0eSBwYXRjaGVzIGFyZSBhcHBsaWVkLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUnVubmVySW1hZ2VCdWlsZGVyIGV4dGVuZHMgUnVubmVySW1hZ2VCdWlsZGVyQmFzZSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaW1hZ2UgYnVpbGRlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcHJvcGVydGllcy4gVGhlIGltcGxlbWVudGF0aW9uIHdpbGwgZGlmZmVyIGJhc2VkIG9uIHRoZSBPUywgYXJjaGl0ZWN0dXJlLCBhbmQgcmVxdWVzdGVkIGJ1aWxkZXIgdHlwZS5cbiAgICovXG4gIHN0YXRpYyBuZXcoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBSdW5uZXJJbWFnZUJ1aWxkZXJQcm9wcyk6IFJ1bm5lckltYWdlQnVpbGRlciB7XG4gICAgaWYgKHByb3BzPy5jb21wb25lbnRzICYmIHByb3BzLnJ1bm5lclZlcnNpb24pIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHNjb3BlKS5hZGRXYXJuaW5nKCdydW5uZXJWZXJzaW9uIGlzIGlnbm9yZWQgd2hlbiBjb21wb25lbnRzIGFyZSBzcGVjaWZpZWQuIFRoZSBydW5uZXIgdmVyc2lvbiB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGNvbXBvbmVudHMuJyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzPy5idWlsZGVyVHlwZSA9PT0gUnVubmVySW1hZ2VCdWlsZGVyVHlwZS5DT0RFX0JVSUxEKSB7XG4gICAgICByZXR1cm4gbmV3IENvZGVCdWlsZFJ1bm5lckltYWdlQnVpbGRlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzPy5idWlsZGVyVHlwZSA9PT0gUnVubmVySW1hZ2VCdWlsZGVyVHlwZS5BV1NfSU1BR0VfQlVJTERFUikge1xuICAgICAgcmV0dXJuIG5ldyBBd3NJbWFnZUJ1aWxkZXJSdW5uZXJJbWFnZUJ1aWxkZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3MgPSBwcm9wcz8ub3MgPz8gT3MuTElOVVhfVUJVTlRVO1xuICAgIGlmIChvcy5pcyhPcy5MSU5VWF9VQlVOVFUpIHx8IG9zLmlzKE9zLkxJTlVYX0FNQVpPTl8yKSkge1xuICAgICAgcmV0dXJuIG5ldyBDb2RlQnVpbGRSdW5uZXJJbWFnZUJ1aWxkZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgfSBlbHNlIGlmIChvcy5pcyhPcy5XSU5ET1dTKSkge1xuICAgICAgcmV0dXJuIG5ldyBBd3NJbWFnZUJ1aWxkZXJSdW5uZXJJbWFnZUJ1aWxkZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgcnVubmVyIGltYWdlIGJ1aWxkZXIgaW1wbGVtZW50YXRpb24gZm9yICR7b3MubmFtZX1gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { aws_ec2 as ec2 } from 'aws-cdk-lib';
|
|
2
1
|
import { Construct } from 'constructs';
|
|
3
2
|
import { ImageBuilderComponent } from './builder';
|
|
4
3
|
import { ImageBuilderObjectBase } from './common';
|
|
5
|
-
import { Architecture, Os } from '../../common';
|
|
4
|
+
import { Architecture, Os } from '../../providers/common';
|
|
6
5
|
/**
|
|
7
6
|
* Properties for AmiRecipe construct.
|
|
8
7
|
*/
|
|
@@ -39,5 +38,5 @@ export declare class AmiRecipe extends ImageBuilderObjectBase {
|
|
|
39
38
|
*
|
|
40
39
|
* @internal
|
|
41
40
|
*/
|
|
42
|
-
export declare function defaultBaseAmi(os: Os, architecture: Architecture):
|
|
41
|
+
export declare function defaultBaseAmi(scope: Construct, os: Os, architecture: Architecture): string;
|
|
43
42
|
export {};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultBaseAmi = exports.AmiRecipe = void 0;
|
|
4
|
+
const cdk = require("aws-cdk-lib");
|
|
5
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
+
const common_1 = require("./common");
|
|
7
|
+
const common_2 = require("../../providers/common");
|
|
8
|
+
const common_3 = require("../common");
|
|
9
|
+
/**
|
|
10
|
+
* Image builder recipe for Amazon Machine Image (AMI).
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
class AmiRecipe extends common_1.ImageBuilderObjectBase {
|
|
15
|
+
constructor(scope, id, props) {
|
|
16
|
+
super(scope, id);
|
|
17
|
+
const name = (0, common_3.uniqueImageBuilderName)(this);
|
|
18
|
+
let components = props.components.map(component => {
|
|
19
|
+
return {
|
|
20
|
+
componentArn: component.arn,
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
let workingDirectory;
|
|
24
|
+
if (props.platform == 'Linux') {
|
|
25
|
+
workingDirectory = '/home/runner';
|
|
26
|
+
}
|
|
27
|
+
else if (props.platform == 'Windows') {
|
|
28
|
+
workingDirectory = 'C:/'; // must exist or Image Builder fails and must not be empty or git will stall installing from the default windows\system32
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
throw new Error(`Unsupported AMI recipe platform: ${props.platform}`);
|
|
32
|
+
}
|
|
33
|
+
const recipe = new aws_cdk_lib_1.aws_imagebuilder.CfnImageRecipe(this, 'Recipe', {
|
|
34
|
+
name: name,
|
|
35
|
+
version: this.version('ImageRecipe', name, {
|
|
36
|
+
platform: props.platform,
|
|
37
|
+
components,
|
|
38
|
+
parentAmi: props.baseAmi,
|
|
39
|
+
}),
|
|
40
|
+
parentImage: props.baseAmi,
|
|
41
|
+
components,
|
|
42
|
+
workingDirectory,
|
|
43
|
+
});
|
|
44
|
+
this.arn = recipe.attrArn;
|
|
45
|
+
this.name = name;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.AmiRecipe = AmiRecipe;
|
|
49
|
+
/**
|
|
50
|
+
* Default base AMI for given OS and architecture.
|
|
51
|
+
*
|
|
52
|
+
* @internal
|
|
53
|
+
*/
|
|
54
|
+
function defaultBaseAmi(scope, os, architecture) {
|
|
55
|
+
const stack = cdk.Stack.of(scope);
|
|
56
|
+
let arch;
|
|
57
|
+
if (architecture.is(common_2.Architecture.X86_64)) {
|
|
58
|
+
arch = 'x86';
|
|
59
|
+
}
|
|
60
|
+
else if (architecture.is(common_2.Architecture.ARM64)) {
|
|
61
|
+
arch = 'arm64';
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
throw new Error(`Unsupported architecture for base AMI: ${architecture.name}`);
|
|
65
|
+
}
|
|
66
|
+
if (os.is(common_2.Os.LINUX_UBUNTU) || os.is(common_2.Os.LINUX)) {
|
|
67
|
+
return stack.formatArn({
|
|
68
|
+
service: 'imagebuilder',
|
|
69
|
+
resource: 'image',
|
|
70
|
+
account: 'aws',
|
|
71
|
+
resourceName: `ubuntu-server-22-lts-${arch}/x.x.x`,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
if (os.is(common_2.Os.LINUX_AMAZON_2)) {
|
|
75
|
+
return stack.formatArn({
|
|
76
|
+
service: 'imagebuilder',
|
|
77
|
+
resource: 'image',
|
|
78
|
+
account: 'aws',
|
|
79
|
+
resourceName: `amazon-linux-2-${arch}/x.x.x`,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (os.is(common_2.Os.WINDOWS)) {
|
|
83
|
+
return stack.formatArn({
|
|
84
|
+
service: 'imagebuilder',
|
|
85
|
+
resource: 'image',
|
|
86
|
+
account: 'aws',
|
|
87
|
+
resourceName: `windows-server-2022-english-full-base-${arch}/x.x.x`,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
throw new Error(`OS ${os.name} not supported for AMI runner image`);
|
|
91
|
+
}
|
|
92
|
+
exports.defaultBaseAmi = defaultBaseAmi;
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1pLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ltYWdlLWJ1aWxkZXJzL2F3cy1pbWFnZS1idWlsZGVyL2FtaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBbUM7QUFDbkMsNkNBQStEO0FBRy9ELHFDQUFrRDtBQUNsRCxtREFBMEQ7QUFDMUQsc0NBQW1EO0FBMkJuRDs7OztHQUlHO0FBQ0gsTUFBYSxTQUFVLFNBQVEsK0JBQXNCO0lBSW5ELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLElBQUksR0FBRyxJQUFBLCtCQUFzQixFQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2hELE9BQU87Z0JBQ0wsWUFBWSxFQUFFLFNBQVMsQ0FBQyxHQUFHO2FBQzVCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksZ0JBQWdCLENBQUM7UUFDckIsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLE9BQU8sRUFBRTtZQUM3QixnQkFBZ0IsR0FBRyxjQUFjLENBQUM7U0FDbkM7YUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksU0FBUyxFQUFFO1lBQ3RDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLHlIQUF5SDtTQUNwSjthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDdkU7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLDhCQUFZLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDN0QsSUFBSSxFQUFFLElBQUk7WUFDVixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFO2dCQUN6QyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7Z0JBQ3hCLFVBQVU7Z0JBQ1YsU0FBUyxFQUFFLEtBQUssQ0FBQyxPQUFPO2FBQ3pCLENBQUM7WUFDRixXQUFXLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDMUIsVUFBVTtZQUNWLGdCQUFnQjtTQUNqQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBdkNELDhCQXVDQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixjQUFjLENBQUMsS0FBZ0IsRUFBRSxFQUFNLEVBQUUsWUFBMEI7SUFDakYsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFbEMsSUFBSSxJQUFJLENBQUM7SUFDVCxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMscUJBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN4QyxJQUFJLEdBQUcsS0FBSyxDQUFDO0tBQ2Q7U0FBTSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMscUJBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM5QyxJQUFJLEdBQUcsT0FBTyxDQUFDO0tBQ2hCO1NBQU07UUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztLQUNoRjtJQUVELElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDN0MsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ3JCLE9BQU8sRUFBRSxjQUFjO1lBQ3ZCLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsWUFBWSxFQUFFLHdCQUF3QixJQUFJLFFBQVE7U0FDbkQsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1FBQzVCLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUNyQixPQUFPLEVBQUUsY0FBYztZQUN2QixRQUFRLEVBQUUsT0FBTztZQUNqQixPQUFPLEVBQUUsS0FBSztZQUNkLFlBQVksRUFBRSxrQkFBa0IsSUFBSSxRQUFRO1NBQzdDLENBQUMsQ0FBQztLQUNKO0lBRUQsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNyQixPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDckIsT0FBTyxFQUFFLGNBQWM7WUFDdkIsUUFBUSxFQUFFLE9BQU87WUFDakIsT0FBTyxFQUFFLEtBQUs7WUFDZCxZQUFZLEVBQUUseUNBQXlDLElBQUksUUFBUTtTQUNwRSxDQUFDLENBQUM7S0FDSjtJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxxQ0FBcUMsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUF4Q0Qsd0NBd0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGF3c19pbWFnZWJ1aWxkZXIgYXMgaW1hZ2VidWlsZGVyIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJbWFnZUJ1aWxkZXJDb21wb25lbnQgfSBmcm9tICcuL2J1aWxkZXInO1xuaW1wb3J0IHsgSW1hZ2VCdWlsZGVyT2JqZWN0QmFzZSB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7IEFyY2hpdGVjdHVyZSwgT3MgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvY29tbW9uJztcbmltcG9ydCB7IHVuaXF1ZUltYWdlQnVpbGRlck5hbWUgfSBmcm9tICcuLi9jb21tb24nO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIEFtaVJlY2lwZSBjb25zdHJ1Y3QuXG4gKi9cbmludGVyZmFjZSBBbWlSZWNpcGVQcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIFRhcmdldCBwbGF0Zm9ybS4gTXVzdCBtYXRjaCBidWlsZGVyIHBsYXRmb3JtLlxuICAgKi9cbiAgcmVhZG9ubHkgcGxhdGZvcm06ICdMaW51eCcgfCAnV2luZG93cyc7XG5cbiAgLyoqXG4gICAqIFRhcmdldCBhcmNoaXRlY3R1cmUuIE11c3QgbWF0Y2ggYnVpbGRlciBwbGF0Zm9ybS5cbiAgICovXG4gIHJlYWRvbmx5IGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBCYXNlIEFNSSB0byB1c2UgZm9yIHRoZSBuZXcgcnVubmVyIEFNSS5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VBbWk6IHN0cmluZztcblxuICAvKipcbiAgICogQ29tcG9uZW50cyB0byBhZGQgdG8gdGFyZ2V0IGNvbnRhaW5lciBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudHM6IEltYWdlQnVpbGRlckNvbXBvbmVudFtdO1xufVxuXG4vKipcbiAqIEltYWdlIGJ1aWxkZXIgcmVjaXBlIGZvciBBbWF6b24gTWFjaGluZSBJbWFnZSAoQU1JKS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEFtaVJlY2lwZSBleHRlbmRzIEltYWdlQnVpbGRlck9iamVjdEJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEFtaVJlY2lwZVByb3BlcnRpZXMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgbmFtZSA9IHVuaXF1ZUltYWdlQnVpbGRlck5hbWUodGhpcyk7XG5cbiAgICBsZXQgY29tcG9uZW50cyA9IHByb3BzLmNvbXBvbmVudHMubWFwKGNvbXBvbmVudCA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21wb25lbnRBcm46IGNvbXBvbmVudC5hcm4sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgbGV0IHdvcmtpbmdEaXJlY3Rvcnk7XG4gICAgaWYgKHByb3BzLnBsYXRmb3JtID09ICdMaW51eCcpIHtcbiAgICAgIHdvcmtpbmdEaXJlY3RvcnkgPSAnL2hvbWUvcnVubmVyJztcbiAgICB9IGVsc2UgaWYgKHByb3BzLnBsYXRmb3JtID09ICdXaW5kb3dzJykge1xuICAgICAgd29ya2luZ0RpcmVjdG9yeSA9ICdDOi8nOyAvLyBtdXN0IGV4aXN0IG9yIEltYWdlIEJ1aWxkZXIgZmFpbHMgYW5kIG11c3Qgbm90IGJlIGVtcHR5IG9yIGdpdCB3aWxsIHN0YWxsIGluc3RhbGxpbmcgZnJvbSB0aGUgZGVmYXVsdCB3aW5kb3dzXFxzeXN0ZW0zMlxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIEFNSSByZWNpcGUgcGxhdGZvcm06ICR7cHJvcHMucGxhdGZvcm19YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjaXBlID0gbmV3IGltYWdlYnVpbGRlci5DZm5JbWFnZVJlY2lwZSh0aGlzLCAnUmVjaXBlJywge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbignSW1hZ2VSZWNpcGUnLCBuYW1lLCB7XG4gICAgICAgIHBsYXRmb3JtOiBwcm9wcy5wbGF0Zm9ybSxcbiAgICAgICAgY29tcG9uZW50cyxcbiAgICAgICAgcGFyZW50QW1pOiBwcm9wcy5iYXNlQW1pLFxuICAgICAgfSksXG4gICAgICBwYXJlbnRJbWFnZTogcHJvcHMuYmFzZUFtaSxcbiAgICAgIGNvbXBvbmVudHMsXG4gICAgICB3b3JraW5nRGlyZWN0b3J5LFxuICAgIH0pO1xuXG4gICAgdGhpcy5hcm4gPSByZWNpcGUuYXR0ckFybjtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG59XG5cbi8qKlxuICogRGVmYXVsdCBiYXNlIEFNSSBmb3IgZ2l2ZW4gT1MgYW5kIGFyY2hpdGVjdHVyZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRCYXNlQW1pKHNjb3BlOiBDb25zdHJ1Y3QsIG9zOiBPcywgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUpIHtcbiAgY29uc3Qgc3RhY2sgPSBjZGsuU3RhY2sub2Yoc2NvcGUpO1xuXG4gIGxldCBhcmNoO1xuICBpZiAoYXJjaGl0ZWN0dXJlLmlzKEFyY2hpdGVjdHVyZS5YODZfNjQpKSB7XG4gICAgYXJjaCA9ICd4ODYnO1xuICB9IGVsc2UgaWYgKGFyY2hpdGVjdHVyZS5pcyhBcmNoaXRlY3R1cmUuQVJNNjQpKSB7XG4gICAgYXJjaCA9ICdhcm02NCc7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUgZm9yIGJhc2UgQU1JOiAke2FyY2hpdGVjdHVyZS5uYW1lfWApO1xuICB9XG5cbiAgaWYgKG9zLmlzKE9zLkxJTlVYX1VCVU5UVSkgfHwgb3MuaXMoT3MuTElOVVgpKSB7XG4gICAgcmV0dXJuIHN0YWNrLmZvcm1hdEFybih7XG4gICAgICBzZXJ2aWNlOiAnaW1hZ2VidWlsZGVyJyxcbiAgICAgIHJlc291cmNlOiAnaW1hZ2UnLFxuICAgICAgYWNjb3VudDogJ2F3cycsXG4gICAgICByZXNvdXJjZU5hbWU6IGB1YnVudHUtc2VydmVyLTIyLWx0cy0ke2FyY2h9L3gueC54YCxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChvcy5pcyhPcy5MSU5VWF9BTUFaT05fMikpIHtcbiAgICByZXR1cm4gc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdpbWFnZWJ1aWxkZXInLFxuICAgICAgcmVzb3VyY2U6ICdpbWFnZScsXG4gICAgICBhY2NvdW50OiAnYXdzJyxcbiAgICAgIHJlc291cmNlTmFtZTogYGFtYXpvbi1saW51eC0yLSR7YXJjaH0veC54LnhgLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKG9zLmlzKE9zLldJTkRPV1MpKSB7XG4gICAgcmV0dXJuIHN0YWNrLmZvcm1hdEFybih7XG4gICAgICBzZXJ2aWNlOiAnaW1hZ2VidWlsZGVyJyxcbiAgICAgIHJlc291cmNlOiAnaW1hZ2UnLFxuICAgICAgYWNjb3VudDogJ2F3cycsXG4gICAgICByZXNvdXJjZU5hbWU6IGB3aW5kb3dzLXNlcnZlci0yMDIyLWVuZ2xpc2gtZnVsbC1iYXNlLSR7YXJjaH0veC54LnhgLFxuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBPUyAke29zLm5hbWV9IG5vdCBzdXBwb3J0ZWQgZm9yIEFNSSBydW5uZXIgaW1hZ2VgKTtcbn1cblxuIl19
|
|
@@ -2,7 +2,7 @@ import * as cdk from 'aws-cdk-lib';
|
|
|
2
2
|
import { aws_ec2 as ec2, aws_iam as iam, aws_imagebuilder as imagebuilder, aws_logs as logs, aws_s3_assets as s3_assets, aws_sns as sns } from 'aws-cdk-lib';
|
|
3
3
|
import { Construct, IConstruct } from 'constructs';
|
|
4
4
|
import { ImageBuilderObjectBase } from './common';
|
|
5
|
-
import { RunnerAmi, RunnerImage } from '../../
|
|
5
|
+
import { RunnerAmi, RunnerImage } from '../../providers';
|
|
6
6
|
import { RunnerImageBuilderBase, RunnerImageBuilderProps } from '../common';
|
|
7
7
|
export interface AwsImageBuilderRunnerImageBuilderProps {
|
|
8
8
|
/**
|
|
@@ -51,6 +51,12 @@ export interface ImageBuilderComponentProperties {
|
|
|
51
51
|
* Optional assets to add to the built image.
|
|
52
52
|
*/
|
|
53
53
|
readonly assets?: ImageBuilderAsset[];
|
|
54
|
+
/**
|
|
55
|
+
* Require a reboot after installing this component.
|
|
56
|
+
*
|
|
57
|
+
* @default false
|
|
58
|
+
*/
|
|
59
|
+
readonly reboot?: boolean;
|
|
54
60
|
}
|
|
55
61
|
/**
|
|
56
62
|
* Components are a set of commands to run and optional files to add to an image. Components are the building blocks of images built by Image Builder.
|
|
@@ -63,7 +69,8 @@ export interface ImageBuilderComponentProperties {
|
|
|
63
69
|
* displayName: 'AWS CLI',
|
|
64
70
|
* description: 'Install latest version of AWS CLI',
|
|
65
71
|
* commands: [
|
|
66
|
-
* 'Start-Process msiexec.exe -Wait -ArgumentList \'/i https://awscli.amazonaws.com/AWSCLIV2.msi /qn\'',
|
|
72
|
+
* '$p = Start-Process msiexec.exe -PassThru -Wait -ArgumentList \'/i https://awscli.amazonaws.com/AWSCLIV2.msi /qn\'',
|
|
73
|
+
* 'if ($p.ExitCode -ne 0) { throw "Exit code is $p.ExitCode" }',
|
|
67
74
|
* ],
|
|
68
75
|
* }
|
|
69
76
|
* ```
|