@cloudsnorkel/cdk-github-runners 0.1.1 → 0.3.1
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 +6 -1
- package/.jsii +1383 -218
- package/API.md +1199 -101
- package/README.md +57 -42
- package/demo-thumbnail.jpg +0 -0
- package/lib/index.d.ts +3 -2
- package/lib/index.js +7 -1
- package/lib/lambdas/build-image/index.js +121 -0
- package/lib/lambdas/delete-runner/index.js +12 -7
- package/lib/lambdas/setup/index.js +177 -66
- package/lib/lambdas/status/index.js +3 -2
- package/lib/lambdas/token-retriever/index.js +3 -2
- package/lib/lambdas/update-lambda/index.js +55 -0
- package/lib/lambdas/webhook-handler/index.js +1 -0
- package/lib/providers/codebuild.d.ts +32 -3
- package/lib/providers/codebuild.js +58 -13
- package/lib/providers/common.d.ts +87 -7
- package/lib/providers/common.js +64 -4
- package/lib/providers/docker-images/codebuild/linux-arm64/Dockerfile +63 -0
- package/lib/providers/docker-images/codebuild/{Dockerfile → linux-x64/Dockerfile} +14 -5
- package/lib/providers/docker-images/fargate/linux-arm64/Dockerfile +45 -0
- package/lib/providers/docker-images/fargate/{runner.sh → linux-arm64/runner.sh} +0 -0
- package/lib/providers/docker-images/fargate/{Dockerfile → linux-x64/Dockerfile} +14 -5
- package/lib/providers/docker-images/fargate/linux-x64/runner.sh +5 -0
- package/lib/providers/docker-images/lambda/linux-arm64/Dockerfile +36 -0
- package/lib/providers/docker-images/lambda/{runner.js → linux-arm64/runner.js} +0 -0
- package/lib/providers/docker-images/lambda/{runner.sh → linux-arm64/runner.sh} +0 -0
- package/lib/providers/docker-images/lambda/linux-x64/Dockerfile +35 -0
- package/lib/providers/docker-images/lambda/linux-x64/runner.js +29 -0
- package/lib/providers/docker-images/lambda/linux-x64/runner.sh +12 -0
- package/lib/providers/fargate.d.ts +46 -2
- package/lib/providers/fargate.js +65 -10
- package/lib/providers/image-builders/codebuild.d.ts +178 -0
- package/lib/providers/image-builders/codebuild.js +354 -0
- package/lib/providers/image-builders/static.d.ts +29 -0
- package/lib/providers/image-builders/static.js +58 -0
- package/lib/providers/lambda.d.ts +27 -2
- package/lib/providers/lambda.js +88 -9
- package/lib/runner.d.ts +56 -22
- package/lib/runner.js +38 -30
- package/lib/secrets.d.ts +0 -1
- package/lib/secrets.js +1 -1
- package/lib/utils.d.ts +2 -2
- package/lib/utils.js +14 -3
- package/lib/webhook.d.ts +0 -1
- package/lib/webhook.js +2 -1
- package/package.json +10 -9
- package/changelog.md +0 -7
- package/lib/index.d.ts.map +0 -1
- package/lib/providers/codebuild.d.ts.map +0 -1
- package/lib/providers/common.d.ts.map +0 -1
- package/lib/providers/docker-images/lambda/Dockerfile +0 -27
- package/lib/providers/fargate.d.ts.map +0 -1
- package/lib/providers/lambda.d.ts.map +0 -1
- package/lib/runner.d.ts.map +0 -1
- package/lib/secrets.d.ts.map +0 -1
- package/lib/utils.d.ts.map +0 -1
- package/lib/webhook.d.ts.map +0 -1
- package/releasetag.txt +0 -1
- package/version.txt +0 -1
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { aws_codebuild as codebuild, aws_ec2 as ec2, aws_iam as iam, aws_logs as logs, Duration, RemovalPolicy } from 'aws-cdk-lib';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { Architecture, IImageBuilder, Os, RunnerImage, RunnerVersion } from '../common';
|
|
4
|
+
/**
|
|
5
|
+
* Properties for CodeBuildImageBuilder construct.
|
|
6
|
+
*/
|
|
7
|
+
export interface CodeBuildImageBuilderProps {
|
|
8
|
+
/**
|
|
9
|
+
* Image architecture.
|
|
10
|
+
*
|
|
11
|
+
* @default Architecture.X86_64
|
|
12
|
+
*/
|
|
13
|
+
readonly architecture?: Architecture;
|
|
14
|
+
/**
|
|
15
|
+
* Image OS.
|
|
16
|
+
*
|
|
17
|
+
* @default OS.LINUX
|
|
18
|
+
*/
|
|
19
|
+
readonly os?: Os;
|
|
20
|
+
/**
|
|
21
|
+
* Path to Dockerfile to be built. It can be a path to a Dockerfile, a folder containing a Dockerfile, or a zip file containing a Dockerfile.
|
|
22
|
+
*/
|
|
23
|
+
readonly dockerfilePath: string;
|
|
24
|
+
/**
|
|
25
|
+
* Version of GitHub Runners to install.
|
|
26
|
+
*
|
|
27
|
+
* @default latest version available
|
|
28
|
+
*/
|
|
29
|
+
readonly runnerVersion?: RunnerVersion;
|
|
30
|
+
/**
|
|
31
|
+
* Schedule the image to be rebuilt every given interval. Useful for keeping the image up-do-date with the latest GitHub runner version and latest OS updates.
|
|
32
|
+
*
|
|
33
|
+
* Set to zero to disable.
|
|
34
|
+
*
|
|
35
|
+
* @default Duration.days(7)
|
|
36
|
+
*/
|
|
37
|
+
readonly rebuildInterval?: Duration;
|
|
38
|
+
/**
|
|
39
|
+
* VPC to launch the runners in.
|
|
40
|
+
*
|
|
41
|
+
* @default no VPC
|
|
42
|
+
*/
|
|
43
|
+
readonly vpc?: ec2.IVpc;
|
|
44
|
+
/**
|
|
45
|
+
* Security Group to assign to this instance.
|
|
46
|
+
*
|
|
47
|
+
* @default public project with no security group
|
|
48
|
+
*/
|
|
49
|
+
readonly securityGroup?: ec2.ISecurityGroup;
|
|
50
|
+
/**
|
|
51
|
+
* Where to place the network interfaces within the VPC.
|
|
52
|
+
*
|
|
53
|
+
* @default no subnet
|
|
54
|
+
*/
|
|
55
|
+
readonly subnetSelection?: ec2.SubnetSelection;
|
|
56
|
+
/**
|
|
57
|
+
* The type of compute to use for this build.
|
|
58
|
+
* See the {@link ComputeType} enum for the possible values.
|
|
59
|
+
*
|
|
60
|
+
* @default {@link ComputeType#SMALL}
|
|
61
|
+
*/
|
|
62
|
+
readonly computeType?: codebuild.ComputeType;
|
|
63
|
+
/**
|
|
64
|
+
* The number of minutes after which AWS CodeBuild stops the build if it's
|
|
65
|
+
* not complete. For valid values, see the timeoutInMinutes field in the AWS
|
|
66
|
+
* CodeBuild User Guide.
|
|
67
|
+
*
|
|
68
|
+
* @default Duration.hours(1)
|
|
69
|
+
*/
|
|
70
|
+
readonly timeout?: Duration;
|
|
71
|
+
/**
|
|
72
|
+
* The number of days log events are kept in CloudWatch Logs. When updating
|
|
73
|
+
* this property, unsetting it doesn't remove the log retention policy. To
|
|
74
|
+
* remove the retention policy, set the value to `INFINITE`.
|
|
75
|
+
*
|
|
76
|
+
* @default logs.RetentionDays.ONE_MONTH
|
|
77
|
+
*/
|
|
78
|
+
readonly logRetention?: logs.RetentionDays;
|
|
79
|
+
/**
|
|
80
|
+
* Removal policy for logs of image builds. If deployment fails on the custom resource, try setting this to `RemovalPolicy.RETAIN`. This way the CodeBuild logs can still be viewed, and you can see why the build failed.
|
|
81
|
+
*
|
|
82
|
+
* We try to not leave anything behind when removed. But sometimes a log staying behind is useful.
|
|
83
|
+
*
|
|
84
|
+
* @default RemovalPolicy.DESTROY
|
|
85
|
+
*/
|
|
86
|
+
readonly logRemovalPolicy?: RemovalPolicy;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* An image builder that uses CodeBuild to build Docker images pre-baked with all the GitHub Actions runner requirements. Builders can be used with runner providers.
|
|
90
|
+
*
|
|
91
|
+
* Each builder re-runs automatically at a set interval to make sure the images contain the latest versions of everything.
|
|
92
|
+
*
|
|
93
|
+
* You can create an instance of this construct to customize the image used to spin-up runners. Each provider has its own requirements for what an image should do. That's why they each provide their own Dockerfile.
|
|
94
|
+
*
|
|
95
|
+
* For example, to set a specific runner version, rebuild the image every 2 weeks, and add a few packages for the Fargate provider, use:
|
|
96
|
+
*
|
|
97
|
+
* ```
|
|
98
|
+
* const builder = new CodeBuildImageBuilder(this, 'Builder', {
|
|
99
|
+
* dockerfilePath: FargateProvider.LINUX_X64_DOCKERFILE_PATH,
|
|
100
|
+
* runnerVersion: RunnerVersion.specific('2.293.0'),
|
|
101
|
+
* rebuildInterval: Duration.days(14),
|
|
102
|
+
* });
|
|
103
|
+
* builder.setBuildArg('EXTRA_PACKAGES', 'nginx xz-utils');
|
|
104
|
+
* new FargateProvider(this, 'Fargate provider', {
|
|
105
|
+
* label: 'customized-fargate',
|
|
106
|
+
* imageBuilder: builder,
|
|
107
|
+
* });
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export declare class CodeBuildImageBuilder extends Construct implements IImageBuilder {
|
|
111
|
+
readonly props: CodeBuildImageBuilderProps;
|
|
112
|
+
private static BUILDSPEC_VERSION;
|
|
113
|
+
private readonly architecture;
|
|
114
|
+
private readonly os;
|
|
115
|
+
private readonly repository;
|
|
116
|
+
private readonly dockerfile;
|
|
117
|
+
private preBuild;
|
|
118
|
+
private postBuild;
|
|
119
|
+
private buildArgs;
|
|
120
|
+
private policyStatements;
|
|
121
|
+
private secondaryAssets;
|
|
122
|
+
private readonly buildImage;
|
|
123
|
+
private boundImage?;
|
|
124
|
+
constructor(scope: Construct, id: string, props: CodeBuildImageBuilderProps);
|
|
125
|
+
/**
|
|
126
|
+
* Uploads a folder to the build server at a given folder name.
|
|
127
|
+
*
|
|
128
|
+
* @param sourcePath path to source directory
|
|
129
|
+
* @param destName name of destination folder
|
|
130
|
+
*/
|
|
131
|
+
addFiles(sourcePath: string, destName: string): void;
|
|
132
|
+
/**
|
|
133
|
+
* Adds a command that runs before `docker build`.
|
|
134
|
+
*
|
|
135
|
+
* @param command command to add
|
|
136
|
+
*/
|
|
137
|
+
addPreBuildCommand(command: string): void;
|
|
138
|
+
/**
|
|
139
|
+
* Adds a command that runs after `docker build` and `docker push`.
|
|
140
|
+
*
|
|
141
|
+
* @param command command to add
|
|
142
|
+
*/
|
|
143
|
+
addPostBuildCommand(command: string): void;
|
|
144
|
+
/**
|
|
145
|
+
* Adds a build argument for Docker. See the documentation for the Dockerfile you're using for a list of supported build arguments.
|
|
146
|
+
*
|
|
147
|
+
* @param name build argument name
|
|
148
|
+
* @param value build argument value
|
|
149
|
+
*/
|
|
150
|
+
setBuildArg(name: string, value: string): void;
|
|
151
|
+
/**
|
|
152
|
+
* Add a policy statement to the builder to access resources required to the image build.
|
|
153
|
+
*
|
|
154
|
+
* @param statement IAM policy statement
|
|
155
|
+
*/
|
|
156
|
+
addPolicyStatement(statement: iam.PolicyStatement): void;
|
|
157
|
+
/**
|
|
158
|
+
* Add extra trusted certificates. This helps deal with self-signed certificates for GitHub Enterprise Server.
|
|
159
|
+
*
|
|
160
|
+
* All first party Dockerfiles support this. Others may not.
|
|
161
|
+
*
|
|
162
|
+
* @param path path to directory containing a file called certs.pem containing all the required certificates
|
|
163
|
+
*/
|
|
164
|
+
addExtraCertificates(path: string): void;
|
|
165
|
+
/**
|
|
166
|
+
* Called by IRunnerProvider to finalize settings and create the image builder.
|
|
167
|
+
*/
|
|
168
|
+
bind(): RunnerImage;
|
|
169
|
+
private getBuildImage;
|
|
170
|
+
private getBuildSpec;
|
|
171
|
+
private customResource;
|
|
172
|
+
/**
|
|
173
|
+
* Return hash of all settings that can affect the result image so we can trigger the build when it changes.
|
|
174
|
+
* @private
|
|
175
|
+
*/
|
|
176
|
+
private hashBuildSettings;
|
|
177
|
+
private rebuildImageOnSchedule;
|
|
178
|
+
}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.CodeBuildImageBuilder = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const crypto = require("crypto");
|
|
7
|
+
const cdk = require("aws-cdk-lib");
|
|
8
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
9
|
+
const aws_codebuild_1 = require("aws-cdk-lib/aws-codebuild");
|
|
10
|
+
const aws_ecr_1 = require("aws-cdk-lib/aws-ecr");
|
|
11
|
+
const aws_logs_1 = require("aws-cdk-lib/aws-logs");
|
|
12
|
+
const constructs_1 = require("constructs");
|
|
13
|
+
const utils_1 = require("../../utils");
|
|
14
|
+
const common_1 = require("../common");
|
|
15
|
+
/**
|
|
16
|
+
* An image builder that uses CodeBuild to build Docker images pre-baked with all the GitHub Actions runner requirements. Builders can be used with runner providers.
|
|
17
|
+
*
|
|
18
|
+
* Each builder re-runs automatically at a set interval to make sure the images contain the latest versions of everything.
|
|
19
|
+
*
|
|
20
|
+
* You can create an instance of this construct to customize the image used to spin-up runners. Each provider has its own requirements for what an image should do. That's why they each provide their own Dockerfile.
|
|
21
|
+
*
|
|
22
|
+
* For example, to set a specific runner version, rebuild the image every 2 weeks, and add a few packages for the Fargate provider, use:
|
|
23
|
+
*
|
|
24
|
+
* ```
|
|
25
|
+
* const builder = new CodeBuildImageBuilder(this, 'Builder', {
|
|
26
|
+
* dockerfilePath: FargateProvider.LINUX_X64_DOCKERFILE_PATH,
|
|
27
|
+
* runnerVersion: RunnerVersion.specific('2.293.0'),
|
|
28
|
+
* rebuildInterval: Duration.days(14),
|
|
29
|
+
* });
|
|
30
|
+
* builder.setBuildArg('EXTRA_PACKAGES', 'nginx xz-utils');
|
|
31
|
+
* new FargateProvider(this, 'Fargate provider', {
|
|
32
|
+
* label: 'customized-fargate',
|
|
33
|
+
* imageBuilder: builder,
|
|
34
|
+
* });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
class CodeBuildImageBuilder extends constructs_1.Construct {
|
|
38
|
+
constructor(scope, id, props) {
|
|
39
|
+
super(scope, id);
|
|
40
|
+
this.props = props;
|
|
41
|
+
this.preBuild = [];
|
|
42
|
+
this.postBuild = [];
|
|
43
|
+
this.buildArgs = new Map();
|
|
44
|
+
this.policyStatements = [];
|
|
45
|
+
this.secondaryAssets = new Map();
|
|
46
|
+
if (props.subnetSelection?.subnetType == aws_cdk_lib_1.aws_ec2.SubnetType.PRIVATE_ISOLATED) {
|
|
47
|
+
aws_cdk_lib_1.Annotations.of(this).addWarning('Private isolated subnets cannot pull from public ECR and VPC endpoint is not supported yet. ' +
|
|
48
|
+
'See https://github.com/aws/containers-roadmap/issues/1160');
|
|
49
|
+
}
|
|
50
|
+
// set platform
|
|
51
|
+
this.architecture = props.architecture ?? common_1.Architecture.X86_64;
|
|
52
|
+
this.os = props.os ?? common_1.Os.LINUX;
|
|
53
|
+
// create repository that only keeps one tag
|
|
54
|
+
this.repository = new aws_cdk_lib_1.aws_ecr.Repository(this, 'Repository', {
|
|
55
|
+
imageScanOnPush: true,
|
|
56
|
+
imageTagMutability: aws_ecr_1.TagMutability.MUTABLE,
|
|
57
|
+
removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
|
|
58
|
+
lifecycleRules: [
|
|
59
|
+
{
|
|
60
|
+
description: 'Remove untagged images that have been replaced by CodeBuild',
|
|
61
|
+
tagStatus: aws_ecr_1.TagStatus.UNTAGGED,
|
|
62
|
+
maxImageAge: aws_cdk_lib_1.Duration.days(1),
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
});
|
|
66
|
+
// upload Dockerfile to S3 as an asset
|
|
67
|
+
this.dockerfile = new aws_cdk_lib_1.aws_s3_assets.Asset(this, 'Dockerfile', {
|
|
68
|
+
path: props.dockerfilePath,
|
|
69
|
+
});
|
|
70
|
+
// choose build image
|
|
71
|
+
this.buildImage = this.getBuildImage();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Uploads a folder to the build server at a given folder name.
|
|
75
|
+
*
|
|
76
|
+
* @param sourcePath path to source directory
|
|
77
|
+
* @param destName name of destination folder
|
|
78
|
+
*/
|
|
79
|
+
addFiles(sourcePath, destName) {
|
|
80
|
+
if (this.boundImage) {
|
|
81
|
+
throw new Error('Image is already bound. Use this method before passing the builder to a runner provider.');
|
|
82
|
+
}
|
|
83
|
+
const asset = new aws_cdk_lib_1.aws_s3_assets.Asset(this, destName, { path: sourcePath });
|
|
84
|
+
this.secondaryAssets.set(destName, asset);
|
|
85
|
+
this.preBuild.push(`rm -rf "${destName}" && cp -r "$CODEBUILD_SRC_DIR_${destName}" "${destName}"`); // symlinks don't work with docker
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Adds a command that runs before `docker build`.
|
|
89
|
+
*
|
|
90
|
+
* @param command command to add
|
|
91
|
+
*/
|
|
92
|
+
addPreBuildCommand(command) {
|
|
93
|
+
if (this.boundImage) {
|
|
94
|
+
throw new Error('Image is already bound. Use this method before passing the builder to a runner provider.');
|
|
95
|
+
}
|
|
96
|
+
this.preBuild.push(command);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Adds a command that runs after `docker build` and `docker push`.
|
|
100
|
+
*
|
|
101
|
+
* @param command command to add
|
|
102
|
+
*/
|
|
103
|
+
addPostBuildCommand(command) {
|
|
104
|
+
if (this.boundImage) {
|
|
105
|
+
throw new Error('Image is already bound. Use this method before passing the builder to a runner provider.');
|
|
106
|
+
}
|
|
107
|
+
this.postBuild.push(command);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Adds a build argument for Docker. See the documentation for the Dockerfile you're using for a list of supported build arguments.
|
|
111
|
+
*
|
|
112
|
+
* @param name build argument name
|
|
113
|
+
* @param value build argument value
|
|
114
|
+
*/
|
|
115
|
+
setBuildArg(name, value) {
|
|
116
|
+
if (this.boundImage) {
|
|
117
|
+
throw new Error('Image is already bound. Use this method before passing the builder to a runner provider.');
|
|
118
|
+
}
|
|
119
|
+
this.buildArgs.set(name, value);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Add a policy statement to the builder to access resources required to the image build.
|
|
123
|
+
*
|
|
124
|
+
* @param statement IAM policy statement
|
|
125
|
+
*/
|
|
126
|
+
addPolicyStatement(statement) {
|
|
127
|
+
if (this.boundImage) {
|
|
128
|
+
throw new Error('Image is already bound. Use this method before passing the builder to a runner provider.');
|
|
129
|
+
}
|
|
130
|
+
this.policyStatements.push(statement);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Add extra trusted certificates. This helps deal with self-signed certificates for GitHub Enterprise Server.
|
|
134
|
+
*
|
|
135
|
+
* All first party Dockerfiles support this. Others may not.
|
|
136
|
+
*
|
|
137
|
+
* @param path path to directory containing a file called certs.pem containing all the required certificates
|
|
138
|
+
*/
|
|
139
|
+
addExtraCertificates(path) {
|
|
140
|
+
if (this.boundImage) {
|
|
141
|
+
throw new Error('Image is already bound. Use this method before passing the builder to a runner provider.');
|
|
142
|
+
}
|
|
143
|
+
this.addFiles(path, 'extra_certs');
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Called by IRunnerProvider to finalize settings and create the image builder.
|
|
147
|
+
*/
|
|
148
|
+
bind() {
|
|
149
|
+
if (this.boundImage) {
|
|
150
|
+
return this.boundImage;
|
|
151
|
+
}
|
|
152
|
+
// log group for the image builds
|
|
153
|
+
const logGroup = new aws_cdk_lib_1.aws_logs.LogGroup(this, 'Logs', {
|
|
154
|
+
retention: this.props.logRetention ?? aws_logs_1.RetentionDays.ONE_MONTH,
|
|
155
|
+
removalPolicy: this.props.logRemovalPolicy ?? aws_cdk_lib_1.RemovalPolicy.DESTROY,
|
|
156
|
+
});
|
|
157
|
+
// generate buildSpec
|
|
158
|
+
const buildSpec = this.getBuildSpec(this.repository, logGroup, this.props.runnerVersion);
|
|
159
|
+
// create CodeBuild project that builds Dockerfile and pushes to repository
|
|
160
|
+
const project = new aws_cdk_lib_1.aws_codebuild.Project(this, 'CodeBuild', {
|
|
161
|
+
description: `Build docker image for self-hosted GitHub runner ${this.node.path} (${this.os.name}/${this.architecture.name})`,
|
|
162
|
+
buildSpec: aws_cdk_lib_1.aws_codebuild.BuildSpec.fromObject(buildSpec),
|
|
163
|
+
source: aws_cdk_lib_1.aws_codebuild.Source.s3({
|
|
164
|
+
bucket: this.dockerfile.bucket,
|
|
165
|
+
path: this.dockerfile.s3ObjectKey,
|
|
166
|
+
}),
|
|
167
|
+
vpc: this.props.vpc,
|
|
168
|
+
securityGroups: this.props.securityGroup ? [this.props.securityGroup] : undefined,
|
|
169
|
+
subnetSelection: this.props.subnetSelection,
|
|
170
|
+
timeout: this.props.timeout ?? aws_cdk_lib_1.Duration.hours(1),
|
|
171
|
+
environment: {
|
|
172
|
+
buildImage: this.buildImage,
|
|
173
|
+
computeType: this.props.computeType ?? aws_codebuild_1.ComputeType.SMALL,
|
|
174
|
+
privileged: true,
|
|
175
|
+
},
|
|
176
|
+
logging: {
|
|
177
|
+
cloudWatch: {
|
|
178
|
+
logGroup,
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
// permissions
|
|
183
|
+
this.repository.grantPullPush(project);
|
|
184
|
+
this.policyStatements.forEach(project.addToRolePolicy);
|
|
185
|
+
// call CodeBuild during deployment and delete all images from repository during destruction
|
|
186
|
+
const cr = this.customResource(project);
|
|
187
|
+
// rebuild image on a schedule
|
|
188
|
+
this.rebuildImageOnSchedule(project, this.props.rebuildInterval);
|
|
189
|
+
for (const [assetPath, asset] of this.secondaryAssets.entries()) {
|
|
190
|
+
project.addSecondarySource(aws_cdk_lib_1.aws_codebuild.Source.s3({
|
|
191
|
+
identifier: assetPath,
|
|
192
|
+
bucket: asset.bucket,
|
|
193
|
+
path: asset.s3ObjectKey,
|
|
194
|
+
}));
|
|
195
|
+
}
|
|
196
|
+
this.boundImage = {
|
|
197
|
+
imageRepository: aws_cdk_lib_1.aws_ecr.Repository.fromRepositoryAttributes(this, 'Dependable Image', {
|
|
198
|
+
repositoryName: this.repository.repositoryName,
|
|
199
|
+
// There are simpler ways to get the ARN, but we want an image object that depends on the custom resource.
|
|
200
|
+
// We want whoever is using this image to automatically wait for CodeBuild to start and finish through the custom resource.
|
|
201
|
+
repositoryArn: cr.ref,
|
|
202
|
+
}),
|
|
203
|
+
imageTag: 'latest',
|
|
204
|
+
imageDigest: cr.getAtt('Digest').toString(),
|
|
205
|
+
architecture: this.architecture,
|
|
206
|
+
os: this.os,
|
|
207
|
+
};
|
|
208
|
+
return this.boundImage;
|
|
209
|
+
}
|
|
210
|
+
getBuildImage() {
|
|
211
|
+
if (this.os.is(common_1.Os.LINUX)) {
|
|
212
|
+
if (this.architecture.is(common_1.Architecture.X86_64)) {
|
|
213
|
+
return aws_cdk_lib_1.aws_codebuild.LinuxBuildImage.STANDARD_4_0;
|
|
214
|
+
}
|
|
215
|
+
else if (this.architecture.is(common_1.Architecture.ARM64)) {
|
|
216
|
+
return aws_cdk_lib_1.aws_codebuild.LinuxArmBuildImage.AMAZON_LINUX_2_STANDARD_2_0;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (this.os.is(common_1.Os.WINDOWS)) {
|
|
220
|
+
throw new Error('CodeBuild cannot be used to build Windows Docker images https://github.com/docker-library/docker/issues/49');
|
|
221
|
+
}
|
|
222
|
+
throw new Error(`Unable to find CodeBuild image for ${this.os.name}/${this.architecture.name}`);
|
|
223
|
+
}
|
|
224
|
+
getBuildSpec(repository, logGroup, runnerVersion) {
|
|
225
|
+
// don't forget to change BUILDSPEC_VERSION when the buildSpec changes, and you want to trigger a rebuild on deploy
|
|
226
|
+
let buildArgs = '';
|
|
227
|
+
for (const [name, value] of this.buildArgs.entries()) {
|
|
228
|
+
buildArgs += ` --build-arg "${name}"="${value}"`;
|
|
229
|
+
}
|
|
230
|
+
buildArgs += ` --build-arg RUNNER_VERSION="${runnerVersion ? runnerVersion.version : common_1.RunnerVersion.latest().version}"`;
|
|
231
|
+
return {
|
|
232
|
+
version: '0.2',
|
|
233
|
+
env: {
|
|
234
|
+
variables: {
|
|
235
|
+
REPO_ARN: repository.repositoryArn,
|
|
236
|
+
REPO_URI: repository.repositoryUri,
|
|
237
|
+
STACK_ID: 'unspecified',
|
|
238
|
+
REQUEST_ID: 'unspecified',
|
|
239
|
+
LOGICAL_RESOURCE_ID: 'unspecified',
|
|
240
|
+
RESPONSE_URL: 'unspecified',
|
|
241
|
+
RUNNER_VERSION: runnerVersion ? runnerVersion.version : common_1.RunnerVersion.latest().version,
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
phases: {
|
|
245
|
+
pre_build: {
|
|
246
|
+
commands: this.preBuild.concat([
|
|
247
|
+
'mkdir -p extra_certs',
|
|
248
|
+
'$(aws ecr get-login --no-include-email --region "$AWS_DEFAULT_REGION")',
|
|
249
|
+
]),
|
|
250
|
+
},
|
|
251
|
+
build: {
|
|
252
|
+
commands: [
|
|
253
|
+
`docker build . -t "$REPO_URI" ${buildArgs}`,
|
|
254
|
+
'docker push "$REPO_URI"',
|
|
255
|
+
],
|
|
256
|
+
},
|
|
257
|
+
post_build: {
|
|
258
|
+
commands: this.postBuild.concat([
|
|
259
|
+
'STATUS="SUCCESS"',
|
|
260
|
+
'DIGEST="UNKNOWN"',
|
|
261
|
+
'if [ $CODEBUILD_BUILD_SUCCEEDING -ne 1 ]; then STATUS="FAILED"; else DIGEST=`docker inspect "$REPO_URI" | jq -r \'.[0].RepoDigests[0] | split("@")[1] | split(":")[1]\'`; fi',
|
|
262
|
+
'cat <<EOF > /tmp/payload.json\n' +
|
|
263
|
+
'{\n' +
|
|
264
|
+
' "StackId": "$STACK_ID",\n' +
|
|
265
|
+
' "RequestId": "$REQUEST_ID",\n' +
|
|
266
|
+
' "LogicalResourceId": "$LOGICAL_RESOURCE_ID",\n' +
|
|
267
|
+
' "PhysicalResourceId": "$REPO_ARN",\n' +
|
|
268
|
+
' "Status": "$STATUS",\n' +
|
|
269
|
+
` "Reason": "See logs in ${logGroup.logGroupName}/$CODEBUILD_LOG_PATH (deploy again with \'cdk deploy -R\' or logRemovalPolicy=RemovalPolicy.RETAIN if they are already deleted)",\n` +
|
|
270
|
+
' "Data": {"Digest": "$DIGEST"}\n' + // include the digest to mark the resource updated so the runner providers get updated with the latest digest too (specifically Lambda)
|
|
271
|
+
'}\n' +
|
|
272
|
+
'EOF',
|
|
273
|
+
'if [ "$RESPONSE_URL" != "unspecified" ]; then jq . /tmp/payload.json; curl -fsSL -X PUT -H "Content-Type:" -d "@/tmp/payload.json" "$RESPONSE_URL"; fi',
|
|
274
|
+
]),
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
customResource(project) {
|
|
280
|
+
const crHandler = utils_1.BundledNodejsFunction.singleton(this, 'build-image', {
|
|
281
|
+
description: 'Custom resource handler that triggers CodeBuild to build runner images, and cleans-up images on deletion',
|
|
282
|
+
timeout: cdk.Duration.seconds(30),
|
|
283
|
+
});
|
|
284
|
+
const policy = new aws_cdk_lib_1.aws_iam.Policy(this, 'CR Policy', {
|
|
285
|
+
statements: [
|
|
286
|
+
new aws_cdk_lib_1.aws_iam.PolicyStatement({
|
|
287
|
+
actions: ['codebuild:StartBuild'],
|
|
288
|
+
resources: [project.projectArn],
|
|
289
|
+
}),
|
|
290
|
+
new aws_cdk_lib_1.aws_iam.PolicyStatement({
|
|
291
|
+
actions: ['ecr:BatchDeleteImage', 'ecr:ListImages'],
|
|
292
|
+
resources: [this.repository.repositoryArn],
|
|
293
|
+
}),
|
|
294
|
+
],
|
|
295
|
+
});
|
|
296
|
+
crHandler.role?.attachInlinePolicy(policy);
|
|
297
|
+
const cr = new aws_cdk_lib_1.CustomResource(this, 'Builder', {
|
|
298
|
+
serviceToken: crHandler.functionArn,
|
|
299
|
+
resourceType: 'Custom::ImageBuilder',
|
|
300
|
+
properties: {
|
|
301
|
+
RepoName: this.repository.repositoryName,
|
|
302
|
+
ProjectName: project.projectName,
|
|
303
|
+
// We include a hash so the image is built immediately on changes, and we don't have to wait for its scheduled build.
|
|
304
|
+
// This also helps make sure the changes are good. If they have a bug, the deployment will fail instead of just the scheduled build.
|
|
305
|
+
BuildHash: this.hashBuildSettings(),
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
// add dependencies to make sure resources are there when we need them
|
|
309
|
+
cr.node.addDependency(project);
|
|
310
|
+
cr.node.addDependency(policy);
|
|
311
|
+
cr.node.addDependency(crHandler);
|
|
312
|
+
return cr;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Return hash of all settings that can affect the result image so we can trigger the build when it changes.
|
|
316
|
+
* @private
|
|
317
|
+
*/
|
|
318
|
+
hashBuildSettings() {
|
|
319
|
+
// main Dockerfile
|
|
320
|
+
let components = [this.dockerfile.assetHash];
|
|
321
|
+
// all additional files
|
|
322
|
+
for (const [name, asset] of this.secondaryAssets.entries()) {
|
|
323
|
+
components.push(name);
|
|
324
|
+
components.push(asset.assetHash);
|
|
325
|
+
}
|
|
326
|
+
// buildspec.yml version
|
|
327
|
+
components.push(`v${CodeBuildImageBuilder.BUILDSPEC_VERSION}`);
|
|
328
|
+
// user commands
|
|
329
|
+
components = components.concat(this.preBuild);
|
|
330
|
+
components = components.concat(this.postBuild);
|
|
331
|
+
for (const [name, value] of this.buildArgs.entries()) {
|
|
332
|
+
components.push(name);
|
|
333
|
+
components.push(value);
|
|
334
|
+
}
|
|
335
|
+
// hash it
|
|
336
|
+
const all = components.join('-');
|
|
337
|
+
return crypto.createHash('md5').update(all).digest('hex');
|
|
338
|
+
}
|
|
339
|
+
rebuildImageOnSchedule(project, rebuildInterval) {
|
|
340
|
+
rebuildInterval = rebuildInterval ?? aws_cdk_lib_1.Duration.days(7);
|
|
341
|
+
if (rebuildInterval.toMilliseconds() != 0) {
|
|
342
|
+
const scheduleRule = new aws_cdk_lib_1.aws_events.Rule(this, 'Build Schedule', {
|
|
343
|
+
description: `Rebuild runner image for ${this.repository.repositoryName}`,
|
|
344
|
+
schedule: aws_cdk_lib_1.aws_events.Schedule.rate(rebuildInterval),
|
|
345
|
+
});
|
|
346
|
+
scheduleRule.addTarget(new aws_cdk_lib_1.aws_events_targets.CodeBuildProject(project));
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
exports.CodeBuildImageBuilder = CodeBuildImageBuilder;
|
|
351
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
352
|
+
CodeBuildImageBuilder[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.CodeBuildImageBuilder", version: "0.3.1" };
|
|
353
|
+
CodeBuildImageBuilder.BUILDSPEC_VERSION = 1;
|
|
354
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9pbWFnZS1idWlsZGVycy9jb2RlYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBaUM7QUFDakMsbUNBQW1DO0FBQ25DLDZDQWFxQjtBQUNyQiw2REFBd0Q7QUFDeEQsaURBQStEO0FBQy9ELG1EQUFxRDtBQUNyRCwyQ0FBdUM7QUFDdkMsdUNBQW9EO0FBQ3BELHNDQUF3RjtBQXlHeEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQWEscUJBQXNCLFNBQVEsc0JBQVM7SUFlbEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBVyxLQUFpQztRQUNsRixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRGdDLFVBQUssR0FBTCxLQUFLLENBQTRCO1FBUjVFLGFBQVEsR0FBYSxFQUFFLENBQUM7UUFDeEIsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUN6QixjQUFTLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDM0MscUJBQWdCLEdBQTBCLEVBQUUsQ0FBQztRQUM3QyxvQkFBZSxHQUFpQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBT2hFLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxVQUFVLElBQUkscUJBQUcsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUU7WUFDeEUseUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLDhGQUE4RjtnQkFDMUgsMkRBQTJELENBQUMsQ0FBQztTQUNsRTtRQUVELGVBQWU7UUFDZixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUkscUJBQVksQ0FBQyxNQUFNLENBQUM7UUFDOUQsSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxJQUFJLFdBQUUsQ0FBQyxLQUFLLENBQUM7UUFFL0IsNENBQTRD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LENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUN0RTtJQUNILENBQUM7O0FBbFdILHNEQW1XQzs7O0FBbFdnQix1Q0FBaUIsR0FBRyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBBbm5vdGF0aW9ucyxcbiAgYXdzX2NvZGVidWlsZCBhcyBjb2RlYnVpbGQsXG4gIGF3c19lYzIgYXMgZWMyLFxuICBhd3NfZWNyIGFzIGVjcixcbiAgYXdzX2V2ZW50cyBhcyBldmVudHMsXG4gIGF3c19ldmVudHNfdGFyZ2V0cyBhcyBldmVudHNfdGFyZ2V0cyxcbiAgYXdzX2lhbSBhcyBpYW0sXG4gIGF3c19sb2dzIGFzIGxvZ3MsXG4gIGF3c19zM19hc3NldHMgYXMgczNfYXNzZXRzLFxuICBDdXN0b21SZXNvdXJjZSxcbiAgRHVyYXRpb24sXG4gIFJlbW92YWxQb2xpY3ksXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbXB1dGVUeXBlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgeyBUYWdNdXRhYmlsaXR5LCBUYWdTdGF0dXMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyJztcbmltcG9ydCB7IFJldGVudGlvbkRheXMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEJ1bmRsZWROb2RlanNGdW5jdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IEFyY2hpdGVjdHVyZSwgSUltYWdlQnVpbGRlciwgT3MsIFJ1bm5lckltYWdlLCBSdW5uZXJWZXJzaW9uIH0gZnJvbSAnLi4vY29tbW9uJztcblxuLypcbkFXUyBJbWFnZSBCdWlsZGVyIHdhcyBub3QgdXNlZCBiZWNhdXNlOlxuICAxLiBJdCdzIHRvbyBzbG93LiBJdCBoYXMgd2VpcmQgMTUgbWludXRlcyBvdmVyaGVhZCB3aGVyZSBpdCBzZWVtcyB0byBqdXN0IGJlIHdhaXRpbmcuXG4gIDIuIE5vIGVhc3kgbG9nIHZpc2liaWxpdHkuXG4gIDMuIFZlcnNpb25zIG5lZWQgdG8gYmUgYnVtcGVkIG1hbnVhbGx5LlxuICovXG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgQ29kZUJ1aWxkSW1hZ2VCdWlsZGVyIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQnVpbGRJbWFnZUJ1aWxkZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBJbWFnZSBhcmNoaXRlY3R1cmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IEFyY2hpdGVjdHVyZS5YODZfNjRcbiAgICovXG4gIHJlYWRvbmx5IGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZTtcblxuICAvKipcbiAgICogSW1hZ2UgT1MuXG4gICAqXG4gICAqIEBkZWZhdWx0IE9TLkxJTlVYXG4gICAqL1xuICByZWFkb25seSBvcz86IE9zO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIERvY2tlcmZpbGUgdG8gYmUgYnVpbHQuIEl0IGNhbiBiZSBhIHBhdGggdG8gYSBEb2NrZXJmaWxlLCBhIGZvbGRlciBjb250YWluaW5nIGEgRG9ja2VyZmlsZSwgb3IgYSB6aXAgZmlsZSBjb250YWluaW5nIGEgRG9ja2VyZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IGRvY2tlcmZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgR2l0SHViIFJ1bm5lcnMgdG8gaW5zdGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgbGF0ZXN0IHZlcnNpb24gYXZhaWxhYmxlXG4gICAqL1xuICByZWFkb25seSBydW5uZXJWZXJzaW9uPzogUnVubmVyVmVyc2lvbjtcblxuICAvKipcbiAgICogU2NoZWR1bGUgdGhlIGltYWdlIHRvIGJlIHJlYnVpbHQgZXZlcnkgZ2l2ZW4gaW50ZXJ2YWwuIFVzZWZ1bCBmb3Iga2VlcGluZyB0aGUgaW1hZ2UgdXAtZG8tZGF0ZSB3aXRoIHRoZSBsYXRlc3QgR2l0SHViIHJ1bm5lciB2ZXJzaW9uIGFuZCBsYXRlc3QgT1MgdXBkYXRlcy5cbiAgICpcbiAgICogU2V0IHRvIHplcm8gdG8gZGlzYWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uZGF5cyg3KVxuICAgKi9cbiAgcmVhZG9ubHkgcmVidWlsZEludGVydmFsPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFZQQyB0byBsYXVuY2ggdGhlIHJ1bm5lcnMgaW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vIFZQQ1xuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIFNlY3VyaXR5IEdyb3VwIHRvIGFzc2lnbiB0byB0aGlzIGluc3RhbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBwdWJsaWMgcHJvamVjdCB3aXRoIG5vIHNlY3VyaXR5IGdyb3VwXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwPzogZWMyLklTZWN1cml0eUdyb3VwO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBwbGFjZSB0aGUgbmV0d29yayBpbnRlcmZhY2VzIHdpdGhpbiB0aGUgVlBDLlxuICAgKlxuICAgKiBAZGVmYXVsdCBubyBzdWJuZXRcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldFNlbGVjdGlvbj86IGVjMi5TdWJuZXRTZWxlY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGNvbXB1dGUgdG8gdXNlIGZvciB0aGlzIGJ1aWxkLlxuICAgKiBTZWUgdGhlIHtAbGluayBDb21wdXRlVHlwZX0gZW51bSBmb3IgdGhlIHBvc3NpYmxlIHZhbHVlcy5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIENvbXB1dGVUeXBlI1NNQUxMfVxuICAgKi9cbiAgcmVhZG9ubHkgY29tcHV0ZVR5cGU/OiBjb2RlYnVpbGQuQ29tcHV0ZVR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgbWludXRlcyBhZnRlciB3aGljaCBBV1MgQ29kZUJ1aWxkIHN0b3BzIHRoZSBidWlsZCBpZiBpdCdzXG4gICAqIG5vdCBjb21wbGV0ZS4gRm9yIHZhbGlkIHZhbHVlcywgc2VlIHRoZSB0aW1lb3V0SW5NaW51dGVzIGZpZWxkIGluIHRoZSBBV1NcbiAgICogQ29kZUJ1aWxkIFVzZXIgR3VpZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLmhvdXJzKDEpXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgZGF5cyBsb2cgZXZlbnRzIGFyZSBrZXB0IGluIENsb3VkV2F0Y2ggTG9ncy4gV2hlbiB1cGRhdGluZ1xuICAgKiB0aGlzIHByb3BlcnR5LCB1bnNldHRpbmcgaXQgZG9lc24ndCByZW1vdmUgdGhlIGxvZyByZXRlbnRpb24gcG9saWN5LiBUb1xuICAgKiByZW1vdmUgdGhlIHJldGVudGlvbiBwb2xpY3ksIHNldCB0aGUgdmFsdWUgdG8gYElORklOSVRFYC5cbiAgICpcbiAgICogQGRlZmF1bHQgbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USFxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmV0ZW50aW9uPzogbG9ncy5SZXRlbnRpb25EYXlzO1xuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgbG9ncyBvZiBpbWFnZSBidWlsZHMuIElmIGRlcGxveW1lbnQgZmFpbHMgb24gdGhlIGN1c3RvbSByZXNvdXJjZSwgdHJ5IHNldHRpbmcgdGhpcyB0byBgUmVtb3ZhbFBvbGljeS5SRVRBSU5gLiBUaGlzIHdheSB0aGUgQ29kZUJ1aWxkIGxvZ3MgY2FuIHN0aWxsIGJlIHZpZXdlZCwgYW5kIHlvdSBjYW4gc2VlIHdoeSB0aGUgYnVpbGQgZmFpbGVkLlxuICAgKlxuICAgKiBXZSB0cnkgdG8gbm90IGxlYXZlIGFueXRoaW5nIGJlaGluZCB3aGVuIHJlbW92ZWQuIEJ1dCBzb21ldGltZXMgYSBsb2cgc3RheWluZyBiZWhpbmQgaXMgdXNlZnVsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LkRFU1RST1lcbiAgICovXG4gIHJlYWRvbmx5IGxvZ1JlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xufVxuXG4vKipcbiAqIEFuIGltYWdlIGJ1aWxkZXIgdGhhdCB1c2VzIENvZGVCdWlsZCB0byBidWlsZCBEb2NrZXIgaW1hZ2VzIHByZS1iYWtlZCB3aXRoIGFsbCB0aGUgR2l0SHViIEFjdGlvbnMgcnVubmVyIHJlcXVpcmVtZW50cy4gQnVpbGRlcnMgY2FuIGJlIHVzZWQgd2l0aCBydW5uZXIgcHJvdmlkZXJzLlxuICpcbiAqIEVhY2ggYnVpbGRlciByZS1ydW5zIGF1dG9tYXRpY2FsbHkgYXQgYSBzZXQgaW50ZXJ2YWwgdG8gbWFrZSBzdXJlIHRoZSBpbWFnZXMgY29udGFpbiB0aGUgbGF0ZXN0IHZlcnNpb25zIG9mIGV2ZXJ5dGhpbmcuXG4gKlxuICogWW91IGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjb25zdHJ1Y3QgdG8gY3VzdG9taXplIHRoZSBpbWFnZSB1c2VkIHRvIHNwaW4tdXAgcnVubmVycy4gRWFjaCBwcm92aWRlciBoYXMgaXRzIG93biByZXF1aXJlbWVudHMgZm9yIHdoYXQgYW4gaW1hZ2Ugc2hvdWxkIGRvLiBUaGF0J3Mgd2h5IHRoZXkgZWFjaCBwcm92aWRlIHRoZWlyIG93biBEb2NrZXJmaWxlLlxuICpcbiAqIEZvciBleGFtcGxlLCB0byBzZXQgYSBzcGVjaWZpYyBydW5uZXIgdmVyc2lvbiwgcmVidWlsZCB0aGUgaW1hZ2UgZXZlcnkgMiB3ZWVrcywgYW5kIGFkZCBhIGZldyBwYWNrYWdlcyBmb3IgdGhlIEZhcmdhdGUgcHJvdmlkZXIsIHVzZTpcbiAqXG4gKiBgYGBcbiAqIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ29kZUJ1aWxkSW1hZ2VCdWlsZGVyKHRoaXMsICdCdWlsZGVyJywge1xuICogICAgIGRvY2tlcmZpbGVQYXRoOiBGYXJnYXRlUHJvdmlkZXIuTElOVVhfWDY0X0RPQ0tFUkZJTEVfUEFUSCxcbiAqICAgICBydW5uZXJWZXJzaW9uOiBSdW5uZXJWZXJzaW9uLnNwZWNpZmljKCcyLjI5My4wJyksXG4gKiAgICAgcmVidWlsZEludGVydmFsOiBEdXJhdGlvbi5kYXlzKDE0KSxcbiAqIH0pO1xuICogYnVpbGRlci5zZXRCdWlsZEFyZygnRVhUUkFfUEFDS0FHRVMnLCAnbmdpbnggeHotdXRpbHMnKTtcbiAqIG5ldyBGYXJnYXRlUHJvdmlkZXIodGhpcywgJ0ZhcmdhdGUgcHJvdmlkZXInLCB7XG4gKiAgICAgbGFiZWw6ICdjdXN0b21pemVkLWZhcmdhdGUnLFxuICogICAgIGltYWdlQnVpbGRlcjogYnVpbGRlcixcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2RlQnVpbGRJbWFnZUJ1aWxkZXIgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJSW1hZ2VCdWlsZGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgQlVJTERTUEVDX1ZFUlNJT04gPSAxO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmU7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3M6IE9zO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9zaXRvcnk6IGVjci5SZXBvc2l0b3J5O1xuICBwcml2YXRlIHJlYWRvbmx5IGRvY2tlcmZpbGU6IHMzX2Fzc2V0cy5Bc3NldDtcbiAgcHJpdmF0ZSBwcmVCdWlsZDogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBwb3N0QnVpbGQ6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgYnVpbGRBcmdzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHBvbGljeVN0YXRlbWVudHM6IGlhbS5Qb2xpY3lTdGF0ZW1lbnRbXSA9IFtdO1xuICBwcml2YXRlIHNlY29uZGFyeUFzc2V0czogTWFwPHN0cmluZywgczNfYXNzZXRzLkFzc2V0PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBidWlsZEltYWdlOiBjb2RlYnVpbGQuSUJ1aWxkSW1hZ2U7XG4gIHByaXZhdGUgYm91bmRJbWFnZT86IFJ1bm5lckltYWdlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHJlYWRvbmx5IHByb3BzOiBDb2RlQnVpbGRJbWFnZUJ1aWxkZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMuc3VibmV0U2VsZWN0aW9uPy5zdWJuZXRUeXBlID09IGVjMi5TdWJuZXRUeXBlLlBSSVZBVEVfSVNPTEFURUQpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmcoJ1ByaXZhdGUgaXNvbGF0ZWQgc3VibmV0cyBjYW5ub3QgcHVsbCBmcm9tIHB1YmxpYyBFQ1IgYW5kIFZQQyBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIHlldC4gJyArXG4gICAgICAgICAgJ1NlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2NvbnRhaW5lcnMtcm9hZG1hcC9pc3N1ZXMvMTE2MCcpO1xuICAgIH1cblxuICAgIC8vIHNldCBwbGF0Zm9ybVxuICAgIHRoaXMuYXJjaGl0ZWN0dXJlID0gcHJvcHMuYXJjaGl0ZWN0dXJlID8/IEFyY2hpdGVjdHVyZS5YODZfNjQ7XG4gICAgdGhpcy5vcyA9IHByb3BzLm9zID8/IE9zLkxJTlVYO1xuXG4gICAgLy8gY3JlYXRlIHJlcG9zaXRvcnkgdGhhdCBvbmx5IGtlZXBzIG9uZSB0YWdcbiAgICB0aGlzLnJlcG9zaXRvcnkgPSBuZXcgZWNyLlJlcG9zaXRvcnkodGhpcywgJ1JlcG9zaXRvcnknLCB7XG4gICAgICBpbWFnZVNjYW5PblB1c2g6IHRydWUsXG4gICAgICBpbWFnZVRhZ011dGFiaWxpdHk6IFRhZ011dGFiaWxpdHkuTVVUQUJMRSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1JlbW92ZSB1bnRhZ2dlZCBpbWFnZXMgdGhhdCBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgQ29kZUJ1aWxkJyxcbiAgICAgICAgICB0YWdTdGF0dXM6IFRhZ1N0YXR1cy5VTlRBR0dFRCxcbiAgICAgICAgICBtYXhJbWFnZUFnZTogRHVyYXRpb24uZGF5cygxKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICAvLyB1cGxvYWQgRG9ja2VyZmlsZSB0byBTMyBhcyBhbiBhc3NldFxuICAgIHRoaXMuZG9ja2VyZmlsZSA9IG5ldyBzM19hc3NldHMuQXNzZXQodGhpcywgJ0RvY2tlcmZpbGUnLCB7XG4gICAgICBwYXRoOiBwcm9wcy5kb2NrZXJmaWxlUGF0aCxcbiAgICB9KTtcblxuICAgIC8vIGNob29zZSBidWlsZCBpbWFnZVxuICAgIHRoaXMuYnVpbGRJbWFnZSA9IHRoaXMuZ2V0QnVpbGRJbWFnZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgYSBmb2xkZXIgdG8gdGhlIGJ1aWxkIHNlcnZlciBhdCBhIGdpdmVuIGZvbGRlciBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlUGF0aCBwYXRoIHRvIHNvdXJjZSBkaXJlY3RvcnlcbiAgICogQHBhcmFtIGRlc3ROYW1lIG5hbWUgb2YgZGVzdGluYXRpb24gZm9sZGVyXG4gICAqL1xuICBwdWJsaWMgYWRkRmlsZXMoc291cmNlUGF0aDogc3RyaW5nLCBkZXN0TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuYm91bmRJbWFnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbWFnZSBpcyBhbHJlYWR5IGJvdW5kLiBVc2UgdGhpcyBtZXRob2QgYmVmb3JlIHBhc3NpbmcgdGhlIGJ1aWxkZXIgdG8gYSBydW5uZXIgcHJvdmlkZXIuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYXNzZXQgPSBuZXcgczNfYXNzZXRzLkFzc2V0KHRoaXMsIGRlc3ROYW1lLCB7IHBhdGg6IHNvdXJjZVBhdGggfSk7XG4gICAgdGhpcy5zZWNvbmRhcnlBc3NldHMuc2V0KGRlc3ROYW1lLCBhc3NldCk7XG4gICAgdGhpcy5wcmVCdWlsZC5wdXNoKGBybSAtcmYgXCIke2Rlc3ROYW1lfVwiICYmIGNwIC1yIFwiJENPREVCVUlMRF9TUkNfRElSXyR7ZGVzdE5hbWV9XCIgXCIke2Rlc3ROYW1lfVwiYCk7IC8vIHN5bWxpbmtzIGRvbid0IHdvcmsgd2l0aCBkb2NrZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29tbWFuZCB0aGF0IHJ1bnMgYmVmb3JlIGBkb2NrZXIgYnVpbGRgLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCBjb21tYW5kIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIGFkZFByZUJ1aWxkQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5ib3VuZEltYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltYWdlIGlzIGFscmVhZHkgYm91bmQuIFVzZSB0aGlzIG1ldGhvZCBiZWZvcmUgcGFzc2luZyB0aGUgYnVpbGRlciB0byBhIHJ1bm5lciBwcm92aWRlci4nKTtcbiAgICB9XG4gICAgdGhpcy5wcmVCdWlsZC5wdXNoKGNvbW1hbmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb21tYW5kIHRoYXQgcnVucyBhZnRlciBgZG9ja2VyIGJ1aWxkYCBhbmQgYGRvY2tlciBwdXNoYC5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmQgY29tbWFuZCB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhZGRQb3N0QnVpbGRDb21tYW5kKGNvbW1hbmQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmJvdW5kSW1hZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW1hZ2UgaXMgYWxyZWFkeSBib3VuZC4gVXNlIHRoaXMgbWV0aG9kIGJlZm9yZSBwYXNzaW5nIHRoZSBidWlsZGVyIHRvIGEgcnVubmVyIHByb3ZpZGVyLicpO1xuICAgIH1cbiAgICB0aGlzLnBvc3RCdWlsZC5wdXNoKGNvbW1hbmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBidWlsZCBhcmd1bWVudCBmb3IgRG9ja2VyLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBEb2NrZXJmaWxlIHlvdSdyZSB1c2luZyBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCBidWlsZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIGJ1aWxkIGFyZ3VtZW50IG5hbWVcbiAgICogQHBhcmFtIHZhbHVlIGJ1aWxkIGFyZ3VtZW50IHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc2V0QnVpbGRBcmcobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuYm91bmRJbWFnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbWFnZSBpcyBhbHJlYWR5IGJvdW5kLiBVc2UgdGhpcyBtZXRob2QgYmVmb3JlIHBhc3NpbmcgdGhlIGJ1aWxkZXIgdG8gYSBydW5uZXIgcHJvdmlkZXIuJyk7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRBcmdzLnNldChuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcG9saWN5IHN0YXRlbWVudCB0byB0aGUgYnVpbGRlciB0byBhY2Nlc3MgcmVzb3VyY2VzIHJlcXVpcmVkIHRvIHRoZSBpbWFnZSBidWlsZC5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlbWVudCBJQU0gcG9saWN5IHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGFkZFBvbGljeVN0YXRlbWVudChzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpIHtcbiAgICBpZiAodGhpcy5ib3VuZEltYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltYWdlIGlzIGFscmVhZHkgYm91bmQuIFVzZSB0aGlzIG1ldGhvZCBiZWZvcmUgcGFzc2luZyB0aGUgYnVpbGRlciB0byBhIHJ1bm5lciBwcm92aWRlci4nKTtcbiAgICB9XG4gICAgdGhpcy5wb2xpY3lTdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgZXh0cmEgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMuIFRoaXMgaGVscHMgZGVhbCB3aXRoIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlcyBmb3IgR2l0SHViIEVudGVycHJpc2UgU2VydmVyLlxuICAgKlxuICAgKiBBbGwgZmlyc3QgcGFydHkgRG9ja2VyZmlsZXMgc3VwcG9ydCB0aGlzLiBPdGhlcnMgbWF5IG5vdC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggcGF0aCB0byBkaXJlY3RvcnkgY29udGFpbmluZyBhIGZpbGUgY2FsbGVkIGNlcnRzLnBlbSBjb250YWluaW5nIGFsbCB0aGUgcmVxdWlyZWQgY2VydGlmaWNhdGVzXG4gICAqL1xuICBwdWJsaWMgYWRkRXh0cmFDZXJ0aWZpY2F0ZXMocGF0aDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuYm91bmRJbWFnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbWFnZSBpcyBhbHJlYWR5IGJvdW5kLiBVc2UgdGhpcyBtZXRob2QgYmVmb3JlIHBhc3NpbmcgdGhlIGJ1aWxkZXIgdG8gYSBydW5uZXIgcHJvdmlkZXIuJyk7XG4gICAgfVxuICAgIHRoaXMuYWRkRmlsZXMocGF0aCwgJ2V4dHJhX2NlcnRzJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGJ5IElSdW5uZXJQcm92aWRlciB0byBmaW5hbGl6ZSBzZXR0aW5ncyBhbmQgY3JlYXRlIHRoZSBpbWFnZSBidWlsZGVyLlxuICAgKi9cbiAgcHVibGljIGJpbmQoKTogUnVubmVySW1hZ2Uge1xuICAgIGlmICh0aGlzLmJvdW5kSW1hZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmJvdW5kSW1hZ2U7XG4gICAgfVxuXG4gICAgLy8gbG9nIGdyb3VwIGZvciB0aGUgaW1hZ2UgYnVpbGRzXG4gICAgY29uc3QgbG9nR3JvdXAgPSBuZXcgbG9ncy5Mb2dHcm91cChcbiAgICAgIHRoaXMsXG4gICAgICAnTG9ncycsXG4gICAgICB7XG4gICAgICAgIHJldGVudGlvbjogdGhpcy5wcm9wcy5sb2dSZXRlbnRpb24gPz8gUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IHRoaXMucHJvcHMubG9nUmVtb3ZhbFBvbGljeSA/PyBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBnZW5lcmF0ZSBidWlsZFNwZWNcbiAgICBjb25zdCBidWlsZFNwZWMgPSB0aGlzLmdldEJ1aWxkU3BlYyh0aGlzLnJlcG9zaXRvcnksIGxvZ0dyb3VwLCB0aGlzLnByb3BzLnJ1bm5lclZlcnNpb24pO1xuXG4gICAgLy8gY3JlYXRlIENvZGVCdWlsZCBwcm9qZWN0IHRoYXQgYnVpbGRzIERvY2tlcmZpbGUgYW5kIHB1c2hlcyB0byByZXBvc2l0b3J5XG4gICAgY29uc3QgcHJvamVjdCA9IG5ldyBjb2RlYnVpbGQuUHJvamVjdCh0aGlzLCAnQ29kZUJ1aWxkJywge1xuICAgICAgZGVzY3JpcHRpb246IGBCdWlsZCBkb2NrZXIgaW1hZ2UgZm9yIHNlbGYtaG9zdGVkIEdpdEh1YiBydW5uZXIgJHt0aGlzLm5vZGUucGF0aH0gKCR7dGhpcy5vcy5uYW1lfS8ke3RoaXMuYXJjaGl0ZWN0dXJlLm5hbWV9KWAsXG4gICAgICBidWlsZFNwZWM6IGNvZGVidWlsZC5CdWlsZFNwZWMuZnJvbU9iamVjdChidWlsZFNwZWMpLFxuICAgICAgc291cmNlOiBjb2RlYnVpbGQuU291cmNlLnMzKHtcbiAgICAgICAgYnVja2V0OiB0aGlzLmRvY2tlcmZpbGUuYnVja2V0LFxuICAgICAgICBwYXRoOiB0aGlzLmRvY2tlcmZpbGUuczNPYmplY3RLZXksXG4gICAgICB9KSxcbiAgICAgIHZwYzogdGhpcy5wcm9wcy52cGMsXG4gICAgICBzZWN1cml0eUdyb3VwczogdGhpcy5wcm9wcy5zZWN1cml0eUdyb3VwID8gW3RoaXMucHJvcHMuc2VjdXJpdHlHcm91cF0gOiB1bmRlZmluZWQsXG4gICAgICBzdWJuZXRTZWxlY3Rpb246IHRoaXMucHJvcHMuc3VibmV0U2VsZWN0aW9uLFxuICAgICAgdGltZW91dDogdGhpcy5wcm9wcy50aW1lb3V0ID8/IER1cmF0aW9uLmhvdXJzKDEpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgYnVpbGRJbWFnZTogdGhpcy5idWlsZEltYWdlLFxuICAgICAgICBjb21wdXRlVHlwZTogdGhpcy5wcm9wcy5jb21wdXRlVHlwZSA/PyBDb21wdXRlVHlwZS5TTUFMTCxcbiAgICAgICAgcHJpdmlsZWdlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBsb2dnaW5nOiB7XG4gICAgICAgIGNsb3VkV2F0Y2g6IHtcbiAgICAgICAgICBsb2dHcm91cCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBwZXJtaXNzaW9uc1xuICAgIHRoaXMucmVwb3NpdG9yeS5ncmFudFB1bGxQdXNoKHByb2plY3QpO1xuICAgIHRoaXMucG9saWN5U3RhdGVtZW50cy5mb3JFYWNoKHByb2plY3QuYWRkVG9Sb2xlUG9saWN5KTtcblxuICAgIC8vIGNhbGwgQ29kZUJ1aWxkIGR1cmluZyBkZXBsb3ltZW50IGFuZCBkZWxldGUgYWxsIGltYWdlcyBmcm9tIHJlcG9zaXRvcnkgZHVyaW5nIGRlc3RydWN0aW9uXG4gICAgY29uc3QgY3IgPSB0aGlzLmN1c3RvbVJlc291cmNlKHByb2plY3QpO1xuXG4gICAgLy8gcmVidWlsZCBpbWFnZSBvbiBhIHNjaGVkdWxlXG4gICAgdGhpcy5yZWJ1aWxkSW1hZ2VPblNjaGVkdWxlKHByb2plY3QsIHRoaXMucHJvcHMucmVidWlsZEludGVydmFsKTtcblxuICAgIGZvciAoY29uc3QgW2Fzc2V0UGF0aCwgYXNzZXRdIG9mIHRoaXMuc2Vjb25kYXJ5QXNzZXRzLmVudHJpZXMoKSkge1xuICAgICAgcHJvamVjdC5hZGRTZWNvbmRhcnlTb3VyY2UoY29kZWJ1aWxkLlNvdXJjZS5zMyh7XG4gICAgICAgIGlkZW50aWZpZXI6IGFzc2V0UGF0aCxcbiAgICAgICAgYnVja2V0OiBhc3NldC5idWNrZXQsXG4gICAgICAgIHBhdGg6IGFzc2V0LnMzT2JqZWN0S2V5LFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHRoaXMuYm91bmRJbWFnZSA9IHtcbiAgICAgIGltYWdlUmVwb3NpdG9yeTogZWNyLlJlcG9zaXRvcnkuZnJvbVJlcG9zaXRvcnlBdHRyaWJ1dGVzKHRoaXMsICdEZXBlbmRhYmxlIEltYWdlJywge1xuICAgICAgICByZXBvc2l0b3J5TmFtZTogdGhpcy5yZXBvc2l0b3J5LnJlcG9zaXRvcnlOYW1lLFxuICAgICAgICAvLyBUaGVyZSBhcmUgc2ltcGxlciB3YXlzIHRvIGdldCB0aGUgQVJOLCBidXQgd2Ugd2FudCBhbiBpbWFnZSBvYmplY3QgdGhhdCBkZXBlbmRzIG9uIHRoZSBjdXN0b20gcmVzb3VyY2UuXG4gICAgICAgIC8vIFdlIHdhbnQgd2hvZXZlciBpcyB1c2luZyB0aGlzIGltYWdlIHRvIGF1dG9tYXRpY2FsbHkgd2FpdCBmb3IgQ29kZUJ1aWxkIHRvIHN0YXJ0IGFuZCBmaW5pc2ggdGhyb3VnaCB0aGUgY3VzdG9tIHJlc291cmNlLlxuICAgICAgICByZXBvc2l0b3J5QXJuOiBjci5yZWYsXG4gICAgICB9KSxcbiAgICAgIGltYWdlVGFnOiAnbGF0ZXN0JyxcbiAgICAgIGltYWdlRGlnZXN0OiBjci5nZXRBdHQoJ0RpZ2VzdCcpLnRvU3RyaW5nKCksXG4gICAgICBhcmNoaXRlY3R1cmU6IHRoaXMuYXJjaGl0ZWN0dXJlLFxuICAgICAgb3M6IHRoaXMub3MsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5ib3VuZEltYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZEltYWdlKCk6IGNvZGVidWlsZC5JQnVpbGRJbWFnZSB7XG4gICAgaWYgKHRoaXMub3MuaXMoT3MuTElOVVgpKSB7XG4gICAgICBpZiAodGhpcy5hcmNoaXRlY3R1cmUuaXMoQXJjaGl0ZWN0dXJlLlg4Nl82NCkpIHtcbiAgICAgICAgcmV0dXJuIGNvZGVidWlsZC5MaW51eEJ1aWxkSW1hZ2UuU1RBTkRBUkRfNF8wO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmFyY2hpdGVjdHVyZS5pcyhBcmNoaXRlY3R1cmUuQVJNNjQpKSB7XG4gICAgICAgIHJldHVybiBjb2RlYnVpbGQuTGludXhBcm1CdWlsZEltYWdlLkFNQVpPTl9MSU5VWF8yX1NUQU5EQVJEXzJfMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMub3MuaXMoT3MuV0lORE9XUykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29kZUJ1aWxkIGNhbm5vdCBiZSB1c2VkIHRvIGJ1aWxkIFdpbmRvd3MgRG9ja2VyIGltYWdlcyBodHRwczovL2dpdGh1Yi5jb20vZG9ja2VyLWxpYnJhcnkvZG9ja2VyL2lzc3Vlcy80OScpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgQ29kZUJ1aWxkIGltYWdlIGZvciAke3RoaXMub3MubmFtZX0vJHt0aGlzLmFyY2hpdGVjdHVyZS5uYW1lfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZFNwZWMocmVwb3NpdG9yeTogZWNyLlJlcG9zaXRvcnksIGxvZ0dyb3VwOiBsb2dzLkxvZ0dyb3VwLCBydW5uZXJWZXJzaW9uPzogUnVubmVyVmVyc2lvbik6IGFueSB7XG4gICAgLy8gZG9uJ3QgZm9yZ2V0IHRvIGNoYW5nZSBCVUlMRFNQRUNfVkVSU0lPTiB3aGVuIHRoZSBidWlsZFNwZWMgY2hhbmdlcywgYW5kIHlvdSB3YW50IHRvIHRyaWdnZXIgYSByZWJ1aWxkIG9uIGRlcGxveVxuICAgIGxldCBidWlsZEFyZ3MgPSAnJztcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdGhpcy5idWlsZEFyZ3MuZW50cmllcygpKSB7XG4gICAgICBidWlsZEFyZ3MgKz0gYCAtLWJ1aWxkLWFyZyBcIiR7bmFtZX1cIj1cIiR7dmFsdWV9XCJgO1xuICAgIH1cbiAgICBidWlsZEFyZ3MgKz0gYCAtLWJ1aWxkLWFyZyBSVU5ORVJfVkVSU0lPTj1cIiR7cnVubmVyVmVyc2lvbiA/IHJ1bm5lclZlcnNpb24udmVyc2lvbiA6IFJ1bm5lclZlcnNpb24ubGF0ZXN0KCkudmVyc2lvbn1cImA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbjogJzAuMicsXG4gICAgICBlbnY6IHtcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgUkVQT19BUk46IHJlcG9zaXRvcnkucmVwb3NpdG9yeUFybixcbiAgICAgICAgICBSRVBPX1VSSTogcmVwb3NpdG9yeS5yZXBvc2l0b3J5VXJpLFxuICAgICAgICAgIFNUQUNLX0lEOiAndW5zcGVjaWZpZWQnLFxuICAgICAgICAgIFJFUVVFU1RfSUQ6ICd1bnNwZWNpZmllZCcsXG4gICAgICAgICAgTE9HSUNBTF9SRVNPVVJDRV9JRDogJ3Vuc3BlY2lmaWVkJyxcbiAgICAgICAgICBSRVNQT05TRV9VUkw6ICd1bnNwZWNpZmllZCcsXG4gICAgICAgICAgUlVOTkVSX1ZFUlNJT046IHJ1bm5lclZlcnNpb24gPyBydW5uZXJWZXJzaW9uLnZlcnNpb24gOiBSdW5uZXJWZXJzaW9uLmxhdGVzdCgpLnZlcnNpb24sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcGhhc2VzOiB7XG4gICAgICAgIHByZV9idWlsZDoge1xuICAgICAgICAgIGNvbW1hbmRzOiB0aGlzLnByZUJ1aWxkLmNvbmNhdChbXG4gICAgICAgICAgICAnbWtkaXIgLXAgZXh0cmFfY2VydHMnLFxuICAgICAgICAgICAgJyQoYXdzIGVjciBnZXQtbG9naW4gLS1uby1pbmNsdWRlLWVtYWlsIC0tcmVnaW9uIFwiJEFXU19ERUZBVUxUX1JFR0lPTlwiKScsXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIGJ1aWxkOiB7XG4gICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgIGBkb2NrZXIgYnVpbGQgLiAtdCBcIiRSRVBPX1VSSVwiICR7YnVpbGRBcmdzfWAsXG4gICAgICAgICAgICAnZG9ja2VyIHB1c2ggXCIkUkVQT19VUklcIicsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdF9idWlsZDoge1xuICAgICAgICAgIGNvbW1hbmRzOiB0aGlzLnBvc3RCdWlsZC5jb25jYXQoW1xuICAgICAgICAgICAgJ1NUQVRVUz1cIlNVQ0NFU1NcIicsXG4gICAgICAgICAgICAnRElHRVNUPVwiVU5LTk9XTlwiJyxcbiAgICAgICAgICAgICdpZiBbICRDT0RFQlVJTERfQlVJTERfU1VDQ0VFRElORyAtbmUgMSBdOyB0aGVuIFNUQVRVUz1cIkZBSUxFRFwiOyBlbHNlIERJR0VTVD1gZG9ja2VyIGluc3BlY3QgXCIkUkVQT19VUklcIiB8IGpxIC1yIFxcJy5bMF0uUmVwb0RpZ2VzdHNbMF0gfCBzcGxpdChcIkBcIilbMV0gfCBzcGxpdChcIjpcIilbMV1cXCdgOyBmaScsXG4gICAgICAgICAgICAnY2F0IDw8RU9GID4gL3RtcC9wYXlsb2FkLmpzb25cXG4nICtcbiAgICAgICAgICAgICd7XFxuJyArXG4gICAgICAgICAgICAnICBcIlN0YWNrSWRcIjogXCIkU1RBQ0tfSURcIixcXG4nICtcbiAgICAgICAgICAgICcgIFwiUmVxdWVzdElkXCI6IFwiJFJFUVVFU1RfSURcIixcXG4nICtcbiAgICAgICAgICAgICcgIFwiTG9naWNhbFJlc291cmNlSWRcIjogXCIkTE9HSUNBTF9SRVNPVVJDRV9JRFwiLFxcbicgK1xuICAgICAgICAgICAgJyAgXCJQaHlzaWNhbFJlc291cmNlSWRcIjogXCIkUkVQT19BUk5cIixcXG4nICtcbiAgICAgICAgICAgICcgIFwiU3RhdHVzXCI6IFwiJFNUQVRVU1wiLFxcbicgK1xuICAgICAgICAgICAgYCAgXCJSZWFzb25cIjogXCJTZWUgbG9ncyBpbiAke2xvZ0dyb3VwLmxvZ0dyb3VwTmFtZX0vJENPREVCVUlMRF9MT0dfUEFUSCAoZGVwbG95IGFnYWluIHdpdGggXFwnY2RrIGRlcGxveSAtUlxcJyBvciBsb2dSZW1vdmFsUG9saWN5PVJlbW92YWxQb2xpY3kuUkVUQUlOIGlmIHRoZXkgYXJlIGFscmVhZHkgZGVsZXRlZClcIixcXG5gICtcbiAgICAgICAgICAgICcgIFwiRGF0YVwiOiB7XCJEaWdlc3RcIjogXCIkRElHRVNUXCJ9XFxuJyArIC8vIGluY2x1ZGUgdGhlIGRpZ2VzdCB0byBtYXJrIHRoZSByZXNvdXJjZSB1cGRhdGVkIHNvIHRoZSBydW5uZXIgcHJvdmlkZXJzIGdldCB1cGRhdGVkIHdpdGggdGhlIGxhdGVzdCBkaWdlc3QgdG9vIChzcGVjaWZpY2FsbHkgTGFtYmRhKVxuICAgICAgICAgICAgJ31cXG4nICtcbiAgICAgICAgICAgICdFT0YnLFxuICAgICAgICAgICAgJ2lmIFsgXCIkUkVTUE9OU0VfVVJMXCIgIT0gXCJ1bnNwZWNpZmllZFwiIF07IHRoZW4ganEgLiAvdG1wL3BheWxvYWQuanNvbjsgY3VybCAtZnNTTCAtWCBQVVQgLUggXCJDb250ZW50LVR5cGU6XCIgLWQgXCJAL3RtcC9wYXlsb2FkLmpzb25cIiBcIiRSRVNQT05TRV9VUkxcIjsgZmknLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjdXN0b21SZXNvdXJjZShwcm9qZWN0OiBjb2RlYnVpbGQuUHJvamVjdCkge1xuICAgIGNvbnN0IGNySGFuZGxlciA9IEJ1bmRsZWROb2RlanNGdW5jdGlvbi5zaW5nbGV0b24odGhpcywgJ2J1aWxkLWltYWdlJywge1xuICAgICAgZGVzY3JpcHRpb246ICdDdXN0b20gcmVzb3VyY2UgaGFuZGxlciB0aGF0IHRyaWdnZXJzIENvZGVCdWlsZCB0byBidWlsZCBydW5uZXIgaW1hZ2VzLCBhbmQgY2xlYW5zLXVwIGltYWdlcyBvbiBkZWxldGlvbicsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygzMCksXG4gICAgfSk7XG5cbiAgICBjb25zdCBwb2xpY3kgPSBuZXcgaWFtLlBvbGljeSh0aGlzLCAnQ1IgUG9saWN5Jywge1xuICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogWydjb2RlYnVpbGQ6U3RhcnRCdWlsZCddLFxuICAgICAgICAgIHJlc291cmNlczogW3Byb2plY3QucHJvamVjdEFybl0sXG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogWydlY3I6QmF0Y2hEZWxldGVJbWFnZScsICdlY3I6TGlzdEltYWdlcyddLFxuICAgICAgICAgIHJlc291cmNlczogW3RoaXMucmVwb3NpdG9yeS5yZXBvc2l0b3J5QXJuXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGNySGFuZGxlci5yb2xlPy5hdHRhY2hJbmxpbmVQb2xpY3kocG9saWN5KTtcblxuICAgIGNvbnN0IGNyID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsICdCdWlsZGVyJywge1xuICAgICAgc2VydmljZVRva2VuOiBjckhhbmRsZXIuZnVuY3Rpb25Bcm4sXG4gICAgICByZXNvdXJjZVR5cGU6ICdDdXN0b206OkltYWdlQnVpbGRlcicsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFJlcG9OYW1lOiB0aGlzLnJlcG9zaXRvcnkucmVwb3NpdG9yeU5hbWUsXG4gICAgICAgIFByb2plY3ROYW1lOiBwcm9qZWN0LnByb2plY3ROYW1lLFxuICAgICAgICAvLyBXZSBpbmNsdWRlIGEgaGFzaCBzbyB0aGUgaW1hZ2UgaXMgYnVpbHQgaW1tZWRpYXRlbHkgb24gY2hhbmdlcywgYW5kIHdlIGRvbid0IGhhdmUgdG8gd2FpdCBmb3IgaXRzIHNjaGVkdWxlZCBidWlsZC5cbiAgICAgICAgLy8gVGhpcyBhbHNvIGhlbHBzIG1ha2Ugc3VyZSB0aGUgY2hhbmdlcyBhcmUgZ29vZC4gSWYgdGhleSBoYXZlIGEgYnVnLCB0aGUgZGVwbG95bWVudCB3aWxsIGZhaWwgaW5zdGVhZCBvZiBqdXN0IHRoZSBzY2hlZHVsZWQgYnVpbGQuXG4gICAgICAgIEJ1aWxkSGFzaDogdGhpcy5oYXNoQnVpbGRTZXR0aW5ncygpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIGFkZCBkZXBlbmRlbmNpZXMgdG8gbWFrZSBzdXJlIHJlc291cmNlcyBhcmUgdGhlcmUgd2hlbiB3ZSBuZWVkIHRoZW1cbiAgICBjci5ub2RlLmFkZERlcGVuZGVuY3kocHJvamVjdCk7XG4gICAgY3Iubm9kZS5hZGREZXBlbmRlbmN5KHBvbGljeSk7XG4gICAgY3Iubm9kZS5hZGREZXBlbmRlbmN5KGNySGFuZGxlcik7XG5cbiAgICByZXR1cm4gY3I7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGhhc2ggb2YgYWxsIHNldHRpbmdzIHRoYXQgY2FuIGFmZmVjdCB0aGUgcmVzdWx0IGltYWdlIHNvIHdlIGNhbiB0cmlnZ2VyIHRoZSBidWlsZCB3aGVuIGl0IGNoYW5nZXMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGhhc2hCdWlsZFNldHRpbmdzKCk6IHN0cmluZyB7XG4gICAgLy8gbWFpbiBEb2NrZXJmaWxlXG4gICAgbGV0IGNvbXBvbmVudHM6IHN0cmluZ1tdID0gW3RoaXMuZG9ja2VyZmlsZS5hc3NldEhhc2hdO1xuICAgIC8vIGFsbCBhZGRpdGlvbmFsIGZpbGVzXG4gICAgZm9yIChjb25zdCBbbmFtZSwgYXNzZXRdIG9mIHRoaXMuc2Vjb25kYXJ5QXNzZXRzLmVudHJpZXMoKSkge1xuICAgICAgY29tcG9uZW50cy5wdXNoKG5hbWUpO1xuICAgICAgY29tcG9uZW50cy5wdXNoKGFzc2V0LmFzc2V0SGFzaCk7XG4gICAgfVxuICAgIC8vIGJ1aWxkc3BlYy55bWwgdmVyc2lvblxuICAgIGNvbXBvbmVudHMucHVzaChgdiR7Q29kZUJ1aWxkSW1hZ2VCdWlsZGVyLkJVSUxEU1BFQ19WRVJTSU9OfWApO1xuICAgIC8vIHVzZXIgY29tbWFuZHNcbiAgICBjb21wb25lbnRzID0gY29tcG9uZW50cy5jb25jYXQodGhpcy5wcmVCdWlsZCk7XG4gICAgY29tcG9uZW50cyA9IGNvbXBvbmVudHMuY29uY2F0KHRoaXMucG9zdEJ1aWxkKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdGhpcy5idWlsZEFyZ3MuZW50cmllcygpKSB7XG4gICAgICBjb21wb25lbnRzLnB1c2gobmFtZSk7XG4gICAgICBjb21wb25lbnRzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICAvLyBoYXNoIGl0XG4gICAgY29uc3QgYWxsID0gY29tcG9uZW50cy5qb2luKCctJyk7XG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoYWxsKS5kaWdlc3QoJ2hleCcpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWJ1aWxkSW1hZ2VPblNjaGVkdWxlKHByb2plY3Q6IGNvZGVidWlsZC5Qcm9qZWN0LCByZWJ1aWxkSW50ZXJ2YWw/OiBEdXJhdGlvbikge1xuICAgIHJlYnVpbGRJbnRlcnZhbCA9IHJlYnVpbGRJbnRlcnZhbCA/PyBEdXJhdGlvbi5kYXlzKDcpO1xuICAgIGlmIChyZWJ1aWxkSW50ZXJ2YWwudG9NaWxsaXNlY29uZHMoKSAhPSAwKSB7XG4gICAgICBjb25zdCBzY2hlZHVsZVJ1bGUgPSBuZXcgZXZlbnRzLlJ1bGUodGhpcywgJ0J1aWxkIFNjaGVkdWxlJywge1xuICAgICAgICBkZXNjcmlwdGlvbjogYFJlYnVpbGQgcnVubmVyIGltYWdlIGZvciAke3RoaXMucmVwb3NpdG9yeS5yZXBvc2l0b3J5TmFtZX1gLFxuICAgICAgICBzY2hlZHVsZTogZXZlbnRzLlNjaGVkdWxlLnJhdGUocmVidWlsZEludGVydmFsKSxcbiAgICAgIH0pO1xuICAgICAgc2NoZWR1bGVSdWxlLmFkZFRhcmdldChuZXcgZXZlbnRzX3RhcmdldHMuQ29kZUJ1aWxkUHJvamVjdChwcm9qZWN0KSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { aws_ecr as ecr } from 'aws-cdk-lib';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { Architecture, IImageBuilder, Os } from '../common';
|
|
4
|
+
/**
|
|
5
|
+
* Helper class with methods to use static images that are built outside the context of this project.
|
|
6
|
+
*/
|
|
7
|
+
export declare class StaticRunnerImage {
|
|
8
|
+
/**
|
|
9
|
+
* Create a builder (that doesn't actually build anything) from an existing image in an existing repository. The image must already have GitHub Actions runner installed. You are responsible to update it and remove it when done.
|
|
10
|
+
*
|
|
11
|
+
* @param repository ECR repository
|
|
12
|
+
* @param tag image tag
|
|
13
|
+
* @param architecture image architecture
|
|
14
|
+
* @param os image OS
|
|
15
|
+
*/
|
|
16
|
+
static fromEcrRepository(repository: ecr.IRepository, tag?: string, architecture?: Architecture, os?: Os): IImageBuilder;
|
|
17
|
+
/**
|
|
18
|
+
* Create a builder from an existing Docker Hub image. The image must already have GitHub Actions runner installed. You are responsible to update it and remove it when done.
|
|
19
|
+
*
|
|
20
|
+
* We create a CodeBuild image builder behind the scenes to copy the image over to ECR. This helps avoid Docker Hub rate limits and prevent failures.
|
|
21
|
+
*
|
|
22
|
+
* @param scope
|
|
23
|
+
* @param id
|
|
24
|
+
* @param image Docker Hub image with optional tag
|
|
25
|
+
* @param architecture image architecture
|
|
26
|
+
* @param os image OS
|
|
27
|
+
*/
|
|
28
|
+
static fromDockerHub(scope: Construct, id: string, image: string, architecture?: Architecture, os?: Os): IImageBuilder;
|
|
29
|
+
}
|