@cloudsnorkel/cdk-github-runners 0.5.7 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +1501 -327
- package/API.md +836 -186
- package/README.md +11 -11
- package/lib/index.d.ts +5 -2
- package/lib/index.js +7 -2
- package/lib/lambdas/delete-ami/index.js +130 -0
- package/lib/lambdas/setup/index.html +1 -1
- package/lib/lambdas/status/index.js +11 -1
- package/lib/lambdas/update-lambda/index.js +2420 -429
- package/lib/providers/codebuild.d.ts +6 -4
- package/lib/providers/codebuild.js +20 -3
- package/lib/providers/common.d.ts +137 -9
- package/lib/providers/common.js +53 -4
- package/lib/providers/docker-images/codebuild/linux-arm64/Dockerfile +1 -0
- package/lib/providers/docker-images/codebuild/linux-x64/Dockerfile +1 -0
- package/lib/providers/docker-images/fargate/linux-arm64/Dockerfile +1 -0
- package/lib/providers/docker-images/fargate/linux-x64/Dockerfile +1 -0
- package/lib/providers/docker-images/lambda/linux-arm64/runner.sh +2 -0
- package/lib/providers/docker-images/lambda/linux-x64/runner.sh +2 -0
- package/lib/providers/ec2.d.ts +106 -0
- package/lib/providers/ec2.js +252 -0
- package/lib/providers/fargate.d.ts +5 -3
- package/lib/providers/fargate.js +26 -5
- package/lib/providers/image-builders/ami.d.ts +131 -0
- package/lib/providers/image-builders/ami.js +274 -0
- package/lib/providers/image-builders/codebuild.js +3 -2
- package/lib/providers/image-builders/common.d.ts +196 -0
- package/lib/providers/image-builders/common.js +288 -0
- package/lib/providers/image-builders/container.d.ts +6 -100
- package/lib/providers/image-builders/container.js +41 -304
- package/lib/providers/image-builders/linux-components.d.ts +15 -0
- package/lib/providers/image-builders/linux-components.js +156 -0
- package/lib/providers/image-builders/static.js +3 -2
- package/lib/providers/image-builders/windows-components.d.ts +14 -0
- package/lib/providers/image-builders/windows-components.js +119 -0
- package/lib/providers/lambda.d.ts +5 -3
- package/lib/providers/lambda.js +20 -3
- package/lib/runner.js +8 -18
- package/lib/secrets.js +1 -1
- package/package.json +13 -13
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ImageBuilderBase = exports.ImageBuilderComponent = exports.ImageBuilderObjectBase = exports.uniqueImageBuilderName = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const cdk = require("aws-cdk-lib");
|
|
7
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
8
|
+
const constructs_1 = require("constructs");
|
|
9
|
+
const utils_1 = require("../../utils");
|
|
10
|
+
const common_1 = require("../common");
|
|
11
|
+
/**
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
function uniqueImageBuilderName(scope) {
|
|
15
|
+
return cdk.Names.uniqueResourceName(scope, {
|
|
16
|
+
maxLength: 126,
|
|
17
|
+
separator: '-',
|
|
18
|
+
allowedSpecialCharacters: '_-',
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
exports.uniqueImageBuilderName = uniqueImageBuilderName;
|
|
22
|
+
/**
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
class ImageBuilderObjectBase extends cdk.Resource {
|
|
26
|
+
constructor(scope, id) {
|
|
27
|
+
super(scope, id);
|
|
28
|
+
}
|
|
29
|
+
version(type, name, data) {
|
|
30
|
+
return new aws_cdk_lib_1.CustomResource(this, 'Version', {
|
|
31
|
+
serviceToken: this.versionFunction().functionArn,
|
|
32
|
+
resourceType: `Custom::ImageBuilder-${type}-Version`,
|
|
33
|
+
removalPolicy: cdk.RemovalPolicy.RETAIN,
|
|
34
|
+
properties: {
|
|
35
|
+
ObjectType: type,
|
|
36
|
+
ObjectName: name,
|
|
37
|
+
VersionedData: data,
|
|
38
|
+
},
|
|
39
|
+
}).ref;
|
|
40
|
+
}
|
|
41
|
+
versionFunction() {
|
|
42
|
+
return utils_1.BundledNodejsFunction.singleton(this, 'aws-image-builder-versioner', {
|
|
43
|
+
description: 'Custom resource handler that bumps up Image Builder versions',
|
|
44
|
+
initialPolicy: [
|
|
45
|
+
new aws_cdk_lib_1.aws_iam.PolicyStatement({
|
|
46
|
+
actions: [
|
|
47
|
+
'imagebuilder:ListComponents',
|
|
48
|
+
'imagebuilder:ListContainerRecipes',
|
|
49
|
+
'imagebuilder:ListImageRecipes',
|
|
50
|
+
],
|
|
51
|
+
resources: ['*'],
|
|
52
|
+
}),
|
|
53
|
+
],
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.ImageBuilderObjectBase = ImageBuilderObjectBase;
|
|
58
|
+
/**
|
|
59
|
+
* 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.
|
|
60
|
+
*
|
|
61
|
+
* Example:
|
|
62
|
+
*
|
|
63
|
+
* ```
|
|
64
|
+
* new ImageBuilderComponent(this, 'AWS CLI', {
|
|
65
|
+
* platform: 'Windows',
|
|
66
|
+
* displayName: 'AWS CLI',
|
|
67
|
+
* description: 'Install latest version of AWS CLI',
|
|
68
|
+
* commands: [
|
|
69
|
+
* '$ErrorActionPreference = \'Stop\'',
|
|
70
|
+
* 'Start-Process msiexec.exe -Wait -ArgumentList \'/i https://awscli.amazonaws.com/AWSCLIV2.msi /qn\'',
|
|
71
|
+
* ],
|
|
72
|
+
* }
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
class ImageBuilderComponent extends ImageBuilderObjectBase {
|
|
76
|
+
constructor(scope, id, props) {
|
|
77
|
+
super(scope, id);
|
|
78
|
+
this.assets = [];
|
|
79
|
+
this.platform = props.platform;
|
|
80
|
+
let steps = [];
|
|
81
|
+
if (props.assets) {
|
|
82
|
+
let inputs = [];
|
|
83
|
+
let extractCommands = [];
|
|
84
|
+
for (const asset of props.assets) {
|
|
85
|
+
this.assets.push(asset.asset);
|
|
86
|
+
if (asset.asset.isFile) {
|
|
87
|
+
inputs.push({
|
|
88
|
+
source: asset.asset.s3ObjectUrl,
|
|
89
|
+
destination: asset.path,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
else if (asset.asset.isZipArchive) {
|
|
93
|
+
inputs.push({
|
|
94
|
+
source: asset.asset.s3ObjectUrl,
|
|
95
|
+
destination: `${asset.path}.zip`,
|
|
96
|
+
});
|
|
97
|
+
if (props.platform === 'Windows') {
|
|
98
|
+
extractCommands.push('$ErrorActionPreference = \'Stop\'');
|
|
99
|
+
extractCommands.push(`Expand-Archive "${asset.path}.zip" -DestinationPath "${asset.path}"`);
|
|
100
|
+
extractCommands.push(`del "${asset.path}.zip"`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
extractCommands.push(`unzip "${asset.path}.zip" -d "${asset.path}"`);
|
|
104
|
+
extractCommands.push(`rm "${asset.path}.zip"`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
throw new Error(`Unknown asset type: ${asset.asset}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
steps.push({
|
|
112
|
+
name: 'Download',
|
|
113
|
+
action: 'S3Download',
|
|
114
|
+
inputs,
|
|
115
|
+
});
|
|
116
|
+
if (extractCommands.length > 0) {
|
|
117
|
+
steps.push({
|
|
118
|
+
name: 'Extract',
|
|
119
|
+
action: props.platform === 'Linux' ? 'ExecuteBash' : 'ExecutePowerShell',
|
|
120
|
+
inputs: {
|
|
121
|
+
commands: extractCommands,
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
steps.push({
|
|
127
|
+
name: 'Run',
|
|
128
|
+
action: props.platform === 'Linux' ? 'ExecuteBash' : 'ExecutePowerShell',
|
|
129
|
+
inputs: {
|
|
130
|
+
commands: props.commands,
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
const data = {
|
|
134
|
+
name: props.displayName,
|
|
135
|
+
schemaVersion: '1.0',
|
|
136
|
+
phases: [
|
|
137
|
+
{
|
|
138
|
+
name: 'build',
|
|
139
|
+
steps,
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
};
|
|
143
|
+
const name = uniqueImageBuilderName(this);
|
|
144
|
+
const component = new aws_cdk_lib_1.aws_imagebuilder.CfnComponent(this, 'Component', {
|
|
145
|
+
name: name,
|
|
146
|
+
description: props.description,
|
|
147
|
+
platform: props.platform,
|
|
148
|
+
version: this.version('Component', name, {
|
|
149
|
+
platform: props.platform,
|
|
150
|
+
data,
|
|
151
|
+
description: props.description,
|
|
152
|
+
}),
|
|
153
|
+
data: JSON.stringify(data),
|
|
154
|
+
});
|
|
155
|
+
this.arn = component.attrArn;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Grants read permissions to the principal on the assets buckets.
|
|
159
|
+
*
|
|
160
|
+
* @param grantee
|
|
161
|
+
*/
|
|
162
|
+
grantAssetsRead(grantee) {
|
|
163
|
+
for (const asset of this.assets) {
|
|
164
|
+
asset.grantRead(grantee);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
exports.ImageBuilderComponent = ImageBuilderComponent;
|
|
169
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
170
|
+
ImageBuilderComponent[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.ImageBuilderComponent", version: "0.6.0" };
|
|
171
|
+
/**
|
|
172
|
+
* @internal
|
|
173
|
+
*/
|
|
174
|
+
class ImageBuilderBase extends constructs_1.Construct {
|
|
175
|
+
constructor(scope, id, props) {
|
|
176
|
+
super(scope, id);
|
|
177
|
+
this.components = [];
|
|
178
|
+
// arch
|
|
179
|
+
this.architecture = props?.architecture ?? common_1.Architecture.X86_64;
|
|
180
|
+
if (!this.architecture.isIn(props.supportedArchitectures)) {
|
|
181
|
+
throw new Error(`Unsupported architecture: ${this.architecture.name}. Consider CodeBuild for faster image builds.`);
|
|
182
|
+
}
|
|
183
|
+
// os
|
|
184
|
+
this.os = props?.os ?? common_1.Os.LINUX;
|
|
185
|
+
if (!this.os.isIn(props.supportedOs)) {
|
|
186
|
+
throw new Error(`Unsupported OS: ${this.os.name}.`);
|
|
187
|
+
}
|
|
188
|
+
// platform
|
|
189
|
+
if (this.os.is(common_1.Os.WINDOWS)) {
|
|
190
|
+
this.platform = 'Windows';
|
|
191
|
+
}
|
|
192
|
+
else if (this.os.is(common_1.Os.LINUX)) {
|
|
193
|
+
this.platform = 'Linux';
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
throw new Error(`Unsupported OS: ${this.os.name}.`);
|
|
197
|
+
}
|
|
198
|
+
// builder options
|
|
199
|
+
this.rebuildInterval = props?.rebuildInterval ?? aws_cdk_lib_1.Duration.days(7);
|
|
200
|
+
// vpc settings
|
|
201
|
+
if (props?.vpc && props?.subnetSelection) {
|
|
202
|
+
this.subnetId = props.vpc.selectSubnets(props.subnetSelection).subnetIds[0];
|
|
203
|
+
}
|
|
204
|
+
if (props?.securityGroup) {
|
|
205
|
+
this.securityGroupIds = [props.securityGroup.securityGroupId];
|
|
206
|
+
}
|
|
207
|
+
// instance type
|
|
208
|
+
this.instanceType = props?.instanceType ?? aws_cdk_lib_1.aws_ec2.InstanceType.of(aws_cdk_lib_1.aws_ec2.InstanceClass.M5, aws_cdk_lib_1.aws_ec2.InstanceSize.LARGE);
|
|
209
|
+
if (!this.architecture.instanceTypeMatch(this.instanceType)) {
|
|
210
|
+
throw new Error(`Builder architecture (${this.architecture.name}) doesn't match selected instance type (${this.instanceType} / ${this.instanceType.architecture})`);
|
|
211
|
+
}
|
|
212
|
+
// log settings
|
|
213
|
+
this.logRetention = props?.logRetention ?? aws_cdk_lib_1.aws_logs.RetentionDays.ONE_MONTH;
|
|
214
|
+
this.logRemovalPolicy = props?.logRemovalPolicy ?? aws_cdk_lib_1.RemovalPolicy.DESTROY;
|
|
215
|
+
// runner version
|
|
216
|
+
this.runnerVersion = props?.runnerVersion ?? common_1.RunnerVersion.latest();
|
|
217
|
+
// description
|
|
218
|
+
this.description = `Build ${props.imageTypeName} for GitHub Actions runner ${this.node.path} (${this.os.name}/${this.architecture.name})`;
|
|
219
|
+
}
|
|
220
|
+
createLog(recipeName) {
|
|
221
|
+
return new aws_cdk_lib_1.aws_logs.LogGroup(this, 'Log', {
|
|
222
|
+
logGroupName: `/aws/imagebuilder/${recipeName}`,
|
|
223
|
+
retention: this.logRetention,
|
|
224
|
+
removalPolicy: this.logRemovalPolicy,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
createInfrastructure(managedPolicies) {
|
|
228
|
+
let role = new aws_cdk_lib_1.aws_iam.Role(this, 'Role', {
|
|
229
|
+
assumedBy: new aws_cdk_lib_1.aws_iam.ServicePrincipal('ec2.amazonaws.com'),
|
|
230
|
+
managedPolicies: managedPolicies,
|
|
231
|
+
});
|
|
232
|
+
for (const component of this.components) {
|
|
233
|
+
component.grantAssetsRead(role);
|
|
234
|
+
}
|
|
235
|
+
return new aws_cdk_lib_1.aws_imagebuilder.CfnInfrastructureConfiguration(this, 'Infrastructure', {
|
|
236
|
+
name: uniqueImageBuilderName(this),
|
|
237
|
+
description: this.description,
|
|
238
|
+
subnetId: this.subnetId,
|
|
239
|
+
securityGroupIds: this.securityGroupIds,
|
|
240
|
+
instanceTypes: [this.instanceType.toString()],
|
|
241
|
+
instanceProfileName: new aws_cdk_lib_1.aws_iam.CfnInstanceProfile(this, 'Instance Profile', {
|
|
242
|
+
roles: [
|
|
243
|
+
role.roleName,
|
|
244
|
+
],
|
|
245
|
+
}).ref,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
createImage(infra, dist, log, imageRecipeArn, containerRecipeArn) {
|
|
249
|
+
const image = new aws_cdk_lib_1.aws_imagebuilder.CfnImage(this, 'Image', {
|
|
250
|
+
infrastructureConfigurationArn: infra.attrArn,
|
|
251
|
+
distributionConfigurationArn: dist.attrArn,
|
|
252
|
+
imageRecipeArn,
|
|
253
|
+
containerRecipeArn,
|
|
254
|
+
imageTestsConfiguration: {
|
|
255
|
+
imageTestsEnabled: false,
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
image.node.addDependency(infra);
|
|
259
|
+
image.node.addDependency(log);
|
|
260
|
+
return image;
|
|
261
|
+
}
|
|
262
|
+
createPipeline(infra, dist, log, imageRecipeArn, containerRecipeArn) {
|
|
263
|
+
let scheduleOptions;
|
|
264
|
+
if (this.rebuildInterval.toDays() > 0) {
|
|
265
|
+
scheduleOptions = {
|
|
266
|
+
scheduleExpression: aws_cdk_lib_1.aws_events.Schedule.rate(this.rebuildInterval).expressionString,
|
|
267
|
+
pipelineExecutionStartCondition: 'EXPRESSION_MATCH_ONLY',
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
const pipeline = new aws_cdk_lib_1.aws_imagebuilder.CfnImagePipeline(this, 'Pipeline', {
|
|
271
|
+
name: uniqueImageBuilderName(this),
|
|
272
|
+
description: this.description,
|
|
273
|
+
infrastructureConfigurationArn: infra.attrArn,
|
|
274
|
+
distributionConfigurationArn: dist.attrArn,
|
|
275
|
+
imageRecipeArn,
|
|
276
|
+
containerRecipeArn,
|
|
277
|
+
schedule: scheduleOptions,
|
|
278
|
+
imageTestsConfiguration: {
|
|
279
|
+
imageTestsEnabled: false,
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
pipeline.node.addDependency(infra);
|
|
283
|
+
pipeline.node.addDependency(log);
|
|
284
|
+
return pipeline;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
exports.ImageBuilderBase = ImageBuilderBase;
|
|
288
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9pbWFnZS1idWlsZGVycy9jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBbUM7QUFDbkMsNkNBVXFCO0FBQ3JCLDJDQUF1QztBQUN2Qyx1Q0FBb0Q7QUFDcEQsc0NBQTREO0FBRTVEOztHQUVHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsS0FBZ0I7SUFDckQsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRTtRQUN6QyxTQUFTLEVBQUUsR0FBRztRQUNkLFNBQVMsRUFBRSxHQUFHO1FBQ2Qsd0JBQXdCLEVBQUUsSUFBSTtLQUMvQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBTkQsd0RBTUM7QUFFRDs7R0FFRztBQUNILE1BQXNCLHNCQUF1QixTQUFRLEdBQUcsQ0FBQyxRQUFRO0lBQy9ELFlBQXNCLEtBQWdCLEVBQUUsRUFBVTtRQUNoRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFUyxPQUFPLENBQUMsSUFBcUQsRUFBRSxJQUFZLEVBQUUsSUFBUztRQUM5RixPQUFPLElBQUksNEJBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQ3pDLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsV0FBVztZQUNoRCxZQUFZLEVBQUUsd0JBQXdCLElBQUksVUFBVTtZQUNwRCxhQUFhLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNO1lBQ3ZDLFVBQVUsRUFBRTtnQkFDVixVQUFVLEVBQUUsSUFBSTtnQkFDaEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLGFBQWEsRUFBRSxJQUFJO2FBQ3BCO1NBQ0YsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNULENBQUM7SUFFTyxlQUFlO1FBQ3JCLE9BQU8sNkJBQXFCLENBQUMsU0FBUyxDQUFDLElB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QUFHO2dCQUNoQixrQkFBa0IsRUFBRSx3QkFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLGdCQUFnQjtnQkFDL0UsK0JBQStCLEVBQUUsdUJBQXVCO2FBQ3pELENBQUM7U0FDSDtRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksOEJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ25FLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLENBQUM7WUFDbEMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQzdDLDRCQUE0QixFQUFFLElBQUksQ0FBQyxPQUFPO1lBQzFDLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsUUFBUSxFQUFFLGVBQWU7WUFDekIsdUJBQXVCLEVBQUU7Z0JBQ3ZCLGlCQUFpQixFQUFFLEtBQUs7YUFDekI7U0FDRixDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0Y7QUFuSkQsNENBbUpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7XG4gIGF3c19lYzIgYXMgZWMyLFxuICBhd3NfZXZlbnRzIGFzIGV2ZW50cyxcbiAgYXdzX2lhbSBhcyBpYW0sXG4gIGF3c19pbWFnZWJ1aWxkZXIgYXMgaW1hZ2VidWlsZGVyLFxuICBhd3NfbG9ncyBhcyBsb2dzLFxuICBhd3NfczNfYXNzZXRzIGFzIHMzX2Fzc2V0cyxcbiAgQ3VzdG9tUmVzb3VyY2UsXG4gIER1cmF0aW9uLFxuICBSZW1vdmFsUG9saWN5LFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEJ1bmRsZWROb2RlanNGdW5jdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IEFyY2hpdGVjdHVyZSwgT3MsIFJ1bm5lclZlcnNpb24gfSBmcm9tICcuLi9jb21tb24nO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlSW1hZ2VCdWlsZGVyTmFtZShzY29wZTogQ29uc3RydWN0KTogc3RyaW5nIHtcbiAgcmV0dXJuIGNkay5OYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUoc2NvcGUsIHtcbiAgICBtYXhMZW5ndGg6IDEyNixcbiAgICBzZXBhcmF0b3I6ICctJyxcbiAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6ICdfLScsXG4gIH0pO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW1hZ2VCdWlsZGVyT2JqZWN0QmFzZSBleHRlbmRzIGNkay5SZXNvdXJjZSB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2ZXJzaW9uKHR5cGU6ICdDb21wb25lbnQnIHwgJ0ltYWdlUmVjaXBlJyB8ICdDb250YWluZXJSZWNpcGUnLCBuYW1lOiBzdHJpbmcsIGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCAnVmVyc2lvbicsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogdGhpcy52ZXJzaW9uRnVuY3Rpb24oKS5mdW5jdGlvbkFybixcbiAgICAgIHJlc291cmNlVHlwZTogYEN1c3RvbTo6SW1hZ2VCdWlsZGVyLSR7dHlwZX0tVmVyc2lvbmAsXG4gICAgICByZW1vdmFsUG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeS5SRVRBSU4sIC8vIG5vIHBvaW50IGluIGRlbGV0aW5nIGFzIGl0IGRvZXNuJ3QgZXZlbiBjcmVhdGUgYW55dGhpbmdcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgT2JqZWN0VHlwZTogdHlwZSxcbiAgICAgICAgT2JqZWN0TmFtZTogbmFtZSxcbiAgICAgICAgVmVyc2lvbmVkRGF0YTogZGF0YSwgLy8gZ2V0IGEgbmV3IHZlcnNpb24gZXZlcnkgdGltZSBzb21ldGhpbmcgY2hhbmdlcywgbGlrZSBJbWFnZSBCdWlsZGVyIHdhbnRzXG4gICAgICB9LFxuICAgIH0pLnJlZjtcbiAgfVxuXG4gIHByaXZhdGUgdmVyc2lvbkZ1bmN0aW9uKCk6IEJ1bmRsZWROb2RlanNGdW5jdGlvbiB7XG4gICAgcmV0dXJuIEJ1bmRsZWROb2RlanNGdW5jdGlvbi5zaW5nbGV0b24odGhpcywgJ2F3cy1pbWFnZS1idWlsZGVyLXZlcnNpb25lcicsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ3VzdG9tIHJlc291cmNlIGhhbmRsZXIgdGhhdCBidW1wcyB1cCBJbWFnZSBCdWlsZGVyIHZlcnNpb25zJyxcbiAgICAgIGluaXRpYWxQb2xpY3k6IFtcbiAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICdpbWFnZWJ1aWxkZXI6TGlzdENvbXBvbmVudHMnLFxuICAgICAgICAgICAgJ2ltYWdlYnVpbGRlcjpMaXN0Q29udGFpbmVyUmVjaXBlcycsXG4gICAgICAgICAgICAnaW1hZ2VidWlsZGVyOkxpc3RJbWFnZVJlY2lwZXMnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQW4gYXNzZXQgaW5jbHVkaW5nIGZpbGUgb3IgZGlyZWN0b3J5IHRvIHBsYWNlIGluc2lkZSB0aGUgYnVpbHQgaW1hZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VCdWlsZGVyQXNzZXQge1xuICAvKipcbiAgICogUGF0aCB0byBwbGFjZSBhc3NldCBpbiB0aGUgaW1hZ2UuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFzc2V0IHRvIHBsYWNlIGluIHRoZSBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0OiBzM19hc3NldHMuQXNzZXQ7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgSW1hZ2VCdWlsZGVyQ29tcG9uZW50IGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZUJ1aWxkZXJDb21wb25lbnRQcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIENvbXBvbmVudCBwbGF0Zm9ybS4gTXVzdCBtYXRjaCB0aGUgYnVpbGRlciBwbGF0Zm9ybS5cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtOiAnTGludXgnIHwgJ1dpbmRvd3MnO1xuXG4gIC8qKlxuICAgKiBDb21wb25lbnQgZGlzcGxheSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ29tcG9uZW50IGRlc2NyaXB0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKipcbiAgICogU2hlbGwgY29tbWFuZHMgdG8gcnVuIHdoZW4gYWRkaW5nIHRoaXMgY29tcG9uZW50IHRvIHRoZSBpbWFnZS5cbiAgICpcbiAgICogT24gTGludXgsIHRoZXNlIGFyZSBiYXNoIGNvbW1hbmRzLiBPbiBXaW5kb3dzLCB0aGVyZSBhcmUgUG93ZXJTaGVsbCBjb21tYW5kcy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmRzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgYXNzZXRzIHRvIGFkZCB0byB0aGUgYnVpbHQgaW1hZ2UuXG4gICAqL1xuICByZWFkb25seSBhc3NldHM/OiBJbWFnZUJ1aWxkZXJBc3NldFtdO1xufVxuXG4vKipcbiAqIENvbXBvbmVudHMgYXJlIGEgc2V0IG9mIGNvbW1hbmRzIHRvIHJ1biBhbmQgb3B0aW9uYWwgZmlsZXMgdG8gYWRkIHRvIGFuIGltYWdlLiBDb21wb25lbnRzIGFyZSB0aGUgYnVpbGRpbmcgYmxvY2tzIG9mIGltYWdlcyBidWlsdCBieSBJbWFnZSBCdWlsZGVyLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgXG4gKiBuZXcgSW1hZ2VCdWlsZGVyQ29tcG9uZW50KHRoaXMsICdBV1MgQ0xJJywge1xuICogICBwbGF0Zm9ybTogJ1dpbmRvd3MnLFxuICogICBkaXNwbGF5TmFtZTogJ0FXUyBDTEknLFxuICogICBkZXNjcmlwdGlvbjogJ0luc3RhbGwgbGF0ZXN0IHZlcnNpb24gb2YgQVdTIENMSScsXG4gKiAgIGNvbW1hbmRzOiBbXG4gKiAgICAgJyRFcnJvckFjdGlvblByZWZlcmVuY2UgPSBcXCdTdG9wXFwnJyxcbiAqICAgICAnU3RhcnQtUHJvY2VzcyBtc2lleGVjLmV4ZSAtV2FpdCAtQXJndW1lbnRMaXN0IFxcJy9pIGh0dHBzOi8vYXdzY2xpLmFtYXpvbmF3cy5jb20vQVdTQ0xJVjIubXNpIC9xblxcJycsXG4gKiAgIF0sXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEltYWdlQnVpbGRlckNvbXBvbmVudCBleHRlbmRzIEltYWdlQnVpbGRlck9iamVjdEJhc2Uge1xuICAvKipcbiAgICogQ29tcG9uZW50IEFSTi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcm46IHN0cmluZztcblxuICAvKipcbiAgICogU3VwcG9ydGVkIHBsYXRmb3JtIGZvciB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXRmb3JtOiAnV2luZG93cycgfCAnTGludXgnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXNzZXRzOiBzM19hc3NldHMuQXNzZXRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJbWFnZUJ1aWxkZXJDb21wb25lbnRQcm9wZXJ0aWVzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMucGxhdGZvcm0gPSBwcm9wcy5wbGF0Zm9ybTtcblxuICAgIGxldCBzdGVwczogYW55W10gPSBbXTtcblxuICAgIGlmIChwcm9wcy5hc3NldHMpIHtcbiAgICAgIGxldCBpbnB1dHM6IGFueVtdID0gW107XG4gICAgICBsZXQgZXh0cmFjdENvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhc3NldCBvZiBwcm9wcy5hc3NldHMpIHtcbiAgICAgICAgdGhpcy5hc3NldHMucHVzaChhc3NldC5hc3NldCk7XG5cbiAgICAgICAgaWYgKGFzc2V0LmFzc2V0LmlzRmlsZSkge1xuICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgIHNvdXJjZTogYXNzZXQuYXNzZXQuczNPYmplY3RVcmwsXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogYXNzZXQucGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChhc3NldC5hc3NldC5pc1ppcEFyY2hpdmUpIHtcbiAgICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgICBzb3VyY2U6IGFzc2V0LmFzc2V0LnMzT2JqZWN0VXJsLFxuICAgICAgICAgICAgZGVzdGluYXRpb246IGAke2Fzc2V0LnBhdGh9LnppcGAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHByb3BzLnBsYXRmb3JtID09PSAnV2luZG93cycpIHtcbiAgICAgICAgICAgIGV4dHJhY3RDb21tYW5kcy5wdXNoKCckRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gXFwnU3RvcFxcJycpO1xuICAgICAgICAgICAgZXh0cmFjdENvbW1hbmRzLnB1c2goYEV4cGFuZC1BcmNoaXZlIFwiJHthc3NldC5wYXRofS56aXBcIiAtRGVzdGluYXRpb25QYXRoIFwiJHthc3NldC5wYXRofVwiYCk7XG4gICAgICAgICAgICBleHRyYWN0Q29tbWFuZHMucHVzaChgZGVsIFwiJHthc3NldC5wYXRofS56aXBcImApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHRyYWN0Q29tbWFuZHMucHVzaChgdW56aXAgXCIke2Fzc2V0LnBhdGh9LnppcFwiIC1kIFwiJHthc3NldC5wYXRofVwiYCk7XG4gICAgICAgICAgICBleHRyYWN0Q29tbWFuZHMucHVzaChgcm0gXCIke2Fzc2V0LnBhdGh9LnppcFwiYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhc3NldCB0eXBlOiAke2Fzc2V0LmFzc2V0fWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBuYW1lOiAnRG93bmxvYWQnLFxuICAgICAgICBhY3Rpb246ICdTM0Rvd25sb2FkJyxcbiAgICAgICAgaW5wdXRzLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChleHRyYWN0Q29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBzdGVwcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiAnRXh0cmFjdCcsXG4gICAgICAgICAgYWN0aW9uOiBwcm9wcy5wbGF0Zm9ybSA9PT0gJ0xpbnV4JyA/ICdFeGVjdXRlQmFzaCcgOiAnRXhlY3V0ZVBvd2VyU2hlbGwnLFxuICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgY29tbWFuZHM6IGV4dHJhY3RDb21tYW5kcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGVwcy5wdXNoKHtcbiAgICAgIG5hbWU6ICdSdW4nLFxuICAgICAgYWN0aW9uOiBwcm9wcy5wbGF0Zm9ybSA9PT0gJ0xpbnV4JyA/ICdFeGVjdXRlQmFzaCcgOiAnRXhlY3V0ZVBvd2VyU2hlbGwnLFxuICAgICAgaW5wdXRzOiB7XG4gICAgICAgIGNvbW1hbmRzOiBwcm9wcy5jb21tYW5kcyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbmFtZTogcHJvcHMuZGlzcGxheU5hbWUsXG4gICAgICBzY2hlbWFWZXJzaW9uOiAnMS4wJyxcbiAgICAgIHBoYXNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2J1aWxkJyxcbiAgICAgICAgICBzdGVwcyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGNvbnN0IG5hbWUgPSB1bmlxdWVJbWFnZUJ1aWxkZXJOYW1lKHRoaXMpO1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBpbWFnZWJ1aWxkZXIuQ2ZuQ29tcG9uZW50KHRoaXMsICdDb21wb25lbnQnLCB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgcGxhdGZvcm06IHByb3BzLnBsYXRmb3JtLFxuICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uKCdDb21wb25lbnQnLCBuYW1lLCB7XG4gICAgICAgIHBsYXRmb3JtOiBwcm9wcy5wbGF0Zm9ybSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgfSksXG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICB9KTtcblxuICAgIHRoaXMuYXJuID0gY29tcG9uZW50LmF0dHJBcm47XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIHByaW5jaXBhbCBvbiB0aGUgYXNzZXRzIGJ1Y2tldHMuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlXG4gICAqL1xuICBncmFudEFzc2V0c1JlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpIHtcbiAgICBmb3IgKGNvbnN0IGFzc2V0IG9mIHRoaXMuYXNzZXRzKSB7XG4gICAgICBhc3NldC5ncmFudFJlYWQoZ3JhbnRlZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VCdWlsZGVyQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIEltYWdlIGFyY2hpdGVjdHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXJjaGl0ZWN0dXJlLlg4Nl82NFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHN1cHBvcnRlZCBhcmNoaXRlY3R1cmVzIHRvIGJlIGNoZWNrZWQgYWdhaW5zdCB7QGxpbmsgYXJjaGl0ZWN0dXJlfS5cbiAgICovXG4gIHJlYWRvbmx5IHN1cHBvcnRlZEFyY2hpdGVjdHVyZXM6IEFyY2hpdGVjdHVyZVtdO1xuXG4gIC8qKlxuICAgKiBJbWFnZSBPUy5cbiAgICpcbiAgICogQGRlZmF1bHQgT1MuTElOVVhcbiAgICovXG4gIHJlYWRvbmx5IG9zPzogT3M7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2Ygc3VwcG9ydGVkIE9TIHRvIGJlIGNoZWNrZWQgYWdhaW5zdCB7QGxpbmsgb3N9LlxuICAgKi9cbiAgcmVhZG9ubHkgc3VwcG9ydGVkT3M6IE9zW107XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgR2l0SHViIFJ1bm5lcnMgdG8gaW5zdGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgbGF0ZXN0IHZlcnNpb24gYXZhaWxhYmxlXG4gICAqL1xuICByZWFkb25seSBydW5uZXJWZXJzaW9uPzogUnVubmVyVmVyc2lvbjtcblxuICAvKipcbiAgICogU2NoZWR1bGUgdGhlIEFNSSB0byBiZSByZWJ1aWx0IGV2ZXJ5IGdpdmVuIGludGVydmFsLiBVc2VmdWwgZm9yIGtlZXBpbmcgdGhlIEFNSSB1cC1kby1kYXRlIHdpdGggdGhlIGxhdGVzdCBHaXRIdWIgcnVubmVyIHZlcnNpb24gYW5kIGxhdGVzdCBPUyB1cGRhdGVzLlxuICAgKlxuICAgKiBTZXQgdG8gemVybyB0byBkaXNhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5kYXlzKDcpXG4gICAqL1xuICByZWFkb25seSByZWJ1aWxkSW50ZXJ2YWw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVlBDIHdoZXJlIGJ1aWxkZXIgaW5zdGFuY2VzIHdpbGwgYmUgbGF1bmNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGRlZmF1bHQgYWNjb3VudCBWUENcbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IGVjMi5JVnBjO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBHcm91cCB0byBhc3NpZ24gdG8gbGF1bmNoZWQgYnVpbGRlciBpbnN0YW5jZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGRlZmF1bHQgYWNjb3VudCBzZWN1cml0eSBncm91cFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cD86IGVjMi5JU2VjdXJpdHlHcm91cDtcblxuICAvKipcbiAgICogV2hlcmUgdG8gcGxhY2UgdGhlIG5ldHdvcmsgaW50ZXJmYWNlcyB3aXRoaW4gdGhlIFZQQy5cbiAgICpcbiAgICogQGRlZmF1bHQgZGVmYXVsdCBWUEMgc3VibmV0XG4gICAqL1xuICByZWFkb25seSBzdWJuZXRTZWxlY3Rpb24/OiBlYzIuU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UgdHlwZSB1c2VkIHRvIGJ1aWxkIHRoZSBpbWFnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgbTUubGFyZ2VcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlVHlwZT86IGVjMi5JbnN0YW5jZVR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgZGF5cyBsb2cgZXZlbnRzIGFyZSBrZXB0IGluIENsb3VkV2F0Y2ggTG9ncy4gV2hlbiB1cGRhdGluZ1xuICAgKiB0aGlzIHByb3BlcnR5LCB1bnNldHRpbmcgaXQgZG9lc24ndCByZW1vdmUgdGhlIGxvZyByZXRlbnRpb24gcG9saWN5LiBUb1xuICAgKiByZW1vdmUgdGhlIHJldGVudGlvbiBwb2xpY3ksIHNldCB0aGUgdmFsdWUgdG8gYElORklOSVRFYC5cbiAgICpcbiAgICogQGRlZmF1bHQgbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USFxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmV0ZW50aW9uPzogbG9ncy5SZXRlbnRpb25EYXlzO1xuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgbG9ncyBvZiBpbWFnZSBidWlsZHMuIElmIGRlcGxveW1lbnQgZmFpbHMgb24gdGhlIGN1c3RvbSByZXNvdXJjZSwgdHJ5IHNldHRpbmcgdGhpcyB0byBgUmVtb3ZhbFBvbGljeS5SRVRBSU5gLiBUaGlzIHdheSB0aGUgbG9ncyBjYW4gc3RpbGwgYmUgdmlld2VkLCBhbmQgeW91IGNhbiBzZWUgd2h5IHRoZSBidWlsZCBmYWlsZWQuXG4gICAqXG4gICAqIFdlIHRyeSB0byBub3QgbGVhdmUgYW55dGhpbmcgYmVoaW5kIHdoZW4gcmVtb3ZlZC4gQnV0IHNvbWV0aW1lcyBhIGxvZyBzdGF5aW5nIGJlaGluZCBpcyB1c2VmdWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lIGFuZCBpbmZyYXN0cnVjdHVyZSBkZXNjcmlwdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlVHlwZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEltYWdlQnVpbGRlckJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmU7XG4gIHByb3RlY3RlZCByZWFkb25seSBvczogT3M7XG4gIHByb3RlY3RlZCByZWFkb25seSBwbGF0Zm9ybTogJ1dpbmRvd3MnIHwgJ0xpbnV4JztcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcnVubmVyVmVyc2lvbjogUnVubmVyVmVyc2lvbjtcblxuICBwcm90ZWN0ZWQgY29tcG9uZW50czogSW1hZ2VCdWlsZGVyQ29tcG9uZW50W10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN1Ym5ldElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdXJpdHlHcm91cElkczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VUeXBlOiBlYzIuSW5zdGFuY2VUeXBlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVidWlsZEludGVydmFsOiBEdXJhdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dSZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dSZW1vdmFsUG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEltYWdlQnVpbGRlckJhc2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBhcmNoXG4gICAgdGhpcy5hcmNoaXRlY3R1cmUgPSBwcm9wcz8uYXJjaGl0ZWN0dXJlID8/IEFyY2hpdGVjdHVyZS5YODZfNjQ7XG4gICAgaWYgKCF0aGlzLmFyY2hpdGVjdHVyZS5pc0luKHByb3BzLnN1cHBvcnRlZEFyY2hpdGVjdHVyZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZTogJHt0aGlzLmFyY2hpdGVjdHVyZS5uYW1lfS4gQ29uc2lkZXIgQ29kZUJ1aWxkIGZvciBmYXN0ZXIgaW1hZ2UgYnVpbGRzLmApO1xuICAgIH1cblxuICAgIC8vIG9zXG4gICAgdGhpcy5vcyA9IHByb3BzPy5vcyA/PyBPcy5MSU5VWDtcbiAgICBpZiAoIXRoaXMub3MuaXNJbihwcm9wcy5zdXBwb3J0ZWRPcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgT1M6ICR7dGhpcy5vcy5uYW1lfS5gKTtcbiAgICB9XG5cbiAgICAvLyBwbGF0Zm9ybVxuICAgIGlmICh0aGlzLm9zLmlzKE9zLldJTkRPV1MpKSB7XG4gICAgICB0aGlzLnBsYXRmb3JtID0gJ1dpbmRvd3MnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcy5pcyhPcy5MSU5VWCkpIHtcbiAgICAgIHRoaXMucGxhdGZvcm0gPSAnTGludXgnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIE9TOiAke3RoaXMub3MubmFtZX0uYCk7XG4gICAgfVxuXG4gICAgLy8gYnVpbGRlciBvcHRpb25zXG4gICAgdGhpcy5yZWJ1aWxkSW50ZXJ2YWwgPSBwcm9wcz8ucmVidWlsZEludGVydmFsID8/IER1cmF0aW9uLmRheXMoNyk7XG5cbiAgICAvLyB2cGMgc2V0dGluZ3NcbiAgICBpZiAocHJvcHM/LnZwYyAmJiBwcm9wcz8uc3VibmV0U2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLnN1Ym5ldElkID0gcHJvcHMudnBjLnNlbGVjdFN1Ym5ldHMocHJvcHMuc3VibmV0U2VsZWN0aW9uKS5zdWJuZXRJZHNbMF07XG4gICAgfVxuXG4gICAgaWYgKHByb3BzPy5zZWN1cml0eUdyb3VwKSB7XG4gICAgICB0aGlzLnNlY3VyaXR5R3JvdXBJZHMgPSBbcHJvcHMuc2VjdXJpdHlHcm91cC5zZWN1cml0eUdyb3VwSWRdO1xuICAgIH1cblxuICAgIC8vIGluc3RhbmNlIHR5cGVcbiAgICB0aGlzLmluc3RhbmNlVHlwZSA9IHByb3BzPy5pbnN0YW5jZVR5cGUgPz8gZWMyLkluc3RhbmNlVHlwZS5vZihlYzIuSW5zdGFuY2VDbGFzcy5NNSwgZWMyLkluc3RhbmNlU2l6ZS5MQVJHRSk7XG4gICAgaWYgKCF0aGlzLmFyY2hpdGVjdHVyZS5pbnN0YW5jZVR5cGVNYXRjaCh0aGlzLmluc3RhbmNlVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQnVpbGRlciBhcmNoaXRlY3R1cmUgKCR7dGhpcy5hcmNoaXRlY3R1cmUubmFtZX0pIGRvZXNuJ3QgbWF0Y2ggc2VsZWN0ZWQgaW5zdGFuY2UgdHlwZSAoJHt0aGlzLmluc3RhbmNlVHlwZX0gLyAke3RoaXMuaW5zdGFuY2VUeXBlLmFyY2hpdGVjdHVyZX0pYCk7XG4gICAgfVxuXG4gICAgLy8gbG9nIHNldHRpbmdzXG4gICAgdGhpcy5sb2dSZXRlbnRpb24gPSBwcm9wcz8ubG9nUmV0ZW50aW9uID8/IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEg7XG4gICAgdGhpcy5sb2dSZW1vdmFsUG9saWN5ID0gcHJvcHM/LmxvZ1JlbW92YWxQb2xpY3kgPz8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZO1xuXG4gICAgLy8gcnVubmVyIHZlcnNpb25cbiAgICB0aGlzLnJ1bm5lclZlcnNpb24gPSBwcm9wcz8ucnVubmVyVmVyc2lvbiA/PyBSdW5uZXJWZXJzaW9uLmxhdGVzdCgpO1xuXG4gICAgLy8gZGVzY3JpcHRpb25cbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gYEJ1aWxkICR7cHJvcHMuaW1hZ2VUeXBlTmFtZX0gZm9yIEdpdEh1YiBBY3Rpb25zIHJ1bm5lciAke3RoaXMubm9kZS5wYXRofSAoJHt0aGlzLm9zLm5hbWV9LyR7dGhpcy5hcmNoaXRlY3R1cmUubmFtZX0pYDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVMb2cocmVjaXBlTmFtZTogc3RyaW5nKTogbG9ncy5Mb2dHcm91cCB7XG4gICAgcmV0dXJuIG5ldyBsb2dzLkxvZ0dyb3VwKHRoaXMsICdMb2cnLCB7XG4gICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2ltYWdlYnVpbGRlci8ke3JlY2lwZU5hbWV9YCxcbiAgICAgIHJldGVudGlvbjogdGhpcy5sb2dSZXRlbnRpb24sXG4gICAgICByZW1vdmFsUG9saWN5OiB0aGlzLmxvZ1JlbW92YWxQb2xpY3ksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlSW5mcmFzdHJ1Y3R1cmUobWFuYWdlZFBvbGljaWVzOiBpYW0uSU1hbmFnZWRQb2xpY3lbXSk6IGltYWdlYnVpbGRlci5DZm5JbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb24ge1xuICAgIGxldCByb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2VjMi5hbWF6b25hd3MuY29tJyksXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IG1hbmFnZWRQb2xpY2llcyxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuY29tcG9uZW50cykge1xuICAgICAgY29tcG9uZW50LmdyYW50QXNzZXRzUmVhZChyb2xlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IGltYWdlYnVpbGRlci5DZm5JbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb24odGhpcywgJ0luZnJhc3RydWN0dXJlJywge1xuICAgICAgbmFtZTogdW5pcXVlSW1hZ2VCdWlsZGVyTmFtZSh0aGlzKSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgc3VibmV0SWQ6IHRoaXMuc3VibmV0SWQsXG4gICAgICBzZWN1cml0eUdyb3VwSWRzOiB0aGlzLnNlY3VyaXR5R3JvdXBJZHMsXG4gICAgICBpbnN0YW5jZVR5cGVzOiBbdGhpcy5pbnN0YW5jZVR5cGUudG9TdHJpbmcoKV0sXG4gICAgICBpbnN0YW5jZVByb2ZpbGVOYW1lOiBuZXcgaWFtLkNmbkluc3RhbmNlUHJvZmlsZSh0aGlzLCAnSW5zdGFuY2UgUHJvZmlsZScsIHtcbiAgICAgICAgcm9sZXM6IFtcbiAgICAgICAgICByb2xlLnJvbGVOYW1lLFxuICAgICAgICBdLFxuICAgICAgfSkucmVmLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUltYWdlKGluZnJhOiBpbWFnZWJ1aWxkZXIuQ2ZuSW5mcmFzdHJ1Y3R1cmVDb25maWd1cmF0aW9uLCBkaXN0OiBpbWFnZWJ1aWxkZXIuQ2ZuRGlzdHJpYnV0aW9uQ29uZmlndXJhdGlvbiwgbG9nOiBsb2dzLkxvZ0dyb3VwLFxuICAgIGltYWdlUmVjaXBlQXJuPzogc3RyaW5nLCBjb250YWluZXJSZWNpcGVBcm4/OiBzdHJpbmcpOiBpbWFnZWJ1aWxkZXIuQ2ZuSW1hZ2Uge1xuICAgIGNvbnN0IGltYWdlID0gbmV3IGltYWdlYnVpbGRlci5DZm5JbWFnZSh0aGlzLCAnSW1hZ2UnLCB7XG4gICAgICBpbmZyYXN0cnVjdHVyZUNvbmZpZ3VyYXRpb25Bcm46IGluZnJhLmF0dHJBcm4sXG4gICAgICBkaXN0cmlidXRpb25Db25maWd1cmF0aW9uQXJuOiBkaXN0LmF0dHJBcm4sXG4gICAgICBpbWFnZVJlY2lwZUFybixcbiAgICAgIGNvbnRhaW5lclJlY2lwZUFybixcbiAgICAgIGltYWdlVGVzdHNDb25maWd1cmF0aW9uOiB7XG4gICAgICAgIGltYWdlVGVzdHNFbmFibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaW1hZ2Uubm9kZS5hZGREZXBlbmRlbmN5KGluZnJhKTtcbiAgICBpbWFnZS5ub2RlLmFkZERlcGVuZGVuY3kobG9nKTtcblxuICAgIHJldHVybiBpbWFnZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVQaXBlbGluZShpbmZyYTogaW1hZ2VidWlsZGVyLkNmbkluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbiwgZGlzdDogaW1hZ2VidWlsZGVyLkNmbkRpc3RyaWJ1dGlvbkNvbmZpZ3VyYXRpb24sIGxvZzogbG9ncy5Mb2dHcm91cCxcbiAgICBpbWFnZVJlY2lwZUFybj86IHN0cmluZywgY29udGFpbmVyUmVjaXBlQXJuPzogc3RyaW5nKTogaW1hZ2VidWlsZGVyLkNmbkltYWdlUGlwZWxpbmUge1xuICAgIGxldCBzY2hlZHVsZU9wdGlvbnM6IGltYWdlYnVpbGRlci5DZm5JbWFnZVBpcGVsaW5lLlNjaGVkdWxlUHJvcGVydHkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMucmVidWlsZEludGVydmFsLnRvRGF5cygpID4gMCkge1xuICAgICAgc2NoZWR1bGVPcHRpb25zID0ge1xuICAgICAgICBzY2hlZHVsZUV4cHJlc3Npb246IGV2ZW50cy5TY2hlZHVsZS5yYXRlKHRoaXMucmVidWlsZEludGVydmFsKS5leHByZXNzaW9uU3RyaW5nLFxuICAgICAgICBwaXBlbGluZUV4ZWN1dGlvblN0YXJ0Q29uZGl0aW9uOiAnRVhQUkVTU0lPTl9NQVRDSF9PTkxZJyxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHBpcGVsaW5lID0gbmV3IGltYWdlYnVpbGRlci5DZm5JbWFnZVBpcGVsaW5lKHRoaXMsICdQaXBlbGluZScsIHtcbiAgICAgIG5hbWU6IHVuaXF1ZUltYWdlQnVpbGRlck5hbWUodGhpcyksXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGluZnJhc3RydWN0dXJlQ29uZmlndXJhdGlvbkFybjogaW5mcmEuYXR0ckFybixcbiAgICAgIGRpc3RyaWJ1dGlvbkNvbmZpZ3VyYXRpb25Bcm46IGRpc3QuYXR0ckFybixcbiAgICAgIGltYWdlUmVjaXBlQXJuLFxuICAgICAgY29udGFpbmVyUmVjaXBlQXJuLFxuICAgICAgc2NoZWR1bGU6IHNjaGVkdWxlT3B0aW9ucyxcbiAgICAgIGltYWdlVGVzdHNDb25maWd1cmF0aW9uOiB7XG4gICAgICAgIGltYWdlVGVzdHNFbmFibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcGlwZWxpbmUubm9kZS5hZGREZXBlbmRlbmN5KGluZnJhKTtcbiAgICBwaXBlbGluZS5ub2RlLmFkZERlcGVuZGVuY3kobG9nKTtcblxuICAgIHJldHVybiBwaXBlbGluZTtcbiAgfVxufVxuIl19
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { aws_ec2 as ec2, aws_ecr as ecr, aws_iam as iam, aws_logs as logs, aws_s3_assets as s3_assets, Duration, RemovalPolicy } from 'aws-cdk-lib';
|
|
1
|
+
import { aws_ec2 as ec2, aws_ecr as ecr, aws_logs as logs, Duration, RemovalPolicy } from 'aws-cdk-lib';
|
|
3
2
|
import { Construct } from 'constructs';
|
|
4
3
|
import { Architecture, IImageBuilder, Os, RunnerImage, RunnerVersion } from '../common';
|
|
4
|
+
import { ImageBuilderBase, ImageBuilderComponent } from './common';
|
|
5
5
|
/**
|
|
6
6
|
* Properties for ContainerImageBuilder construct.
|
|
7
7
|
*/
|
|
@@ -79,88 +79,8 @@ export interface ContainerImageBuilderProps {
|
|
|
79
79
|
*/
|
|
80
80
|
readonly logRemovalPolicy?: RemovalPolicy;
|
|
81
81
|
}
|
|
82
|
-
declare abstract class ImageBuilderObjectBase extends cdk.Resource {
|
|
83
|
-
protected constructor(scope: Construct, id: string);
|
|
84
|
-
protected version(type: 'Component' | 'ImageRecipe' | 'ContainerRecipe', name: string, data: any): string;
|
|
85
|
-
private versionFunction;
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* An asset including file or directory to place inside the built image.
|
|
89
|
-
*/
|
|
90
|
-
export interface ImageBuilderAsset {
|
|
91
|
-
/**
|
|
92
|
-
* Path to place asset in the image.
|
|
93
|
-
*/
|
|
94
|
-
readonly path: string;
|
|
95
|
-
/**
|
|
96
|
-
* Asset to place in the image.
|
|
97
|
-
*/
|
|
98
|
-
readonly asset: s3_assets.Asset;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Properties for ImageBuilderComponent construct.
|
|
102
|
-
*/
|
|
103
|
-
export interface ImageBuilderComponentProperties {
|
|
104
|
-
/**
|
|
105
|
-
* Component platform. Must match the builder platform.
|
|
106
|
-
*/
|
|
107
|
-
readonly platform: 'Linux' | 'Windows';
|
|
108
|
-
/**
|
|
109
|
-
* Component display name.
|
|
110
|
-
*/
|
|
111
|
-
readonly displayName: string;
|
|
112
|
-
/**
|
|
113
|
-
* Component description.
|
|
114
|
-
*/
|
|
115
|
-
readonly description: string;
|
|
116
|
-
/**
|
|
117
|
-
* Shell commands to run when adding this component to the image.
|
|
118
|
-
*
|
|
119
|
-
* On Linux, these are bash commands. On Windows, there are PowerShell commands.
|
|
120
|
-
*/
|
|
121
|
-
readonly commands: string[];
|
|
122
|
-
/**
|
|
123
|
-
* Optional assets to add to the built image.
|
|
124
|
-
*/
|
|
125
|
-
readonly assets?: ImageBuilderAsset[];
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* 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.
|
|
129
|
-
*
|
|
130
|
-
* Example:
|
|
131
|
-
*
|
|
132
|
-
* ```
|
|
133
|
-
* new ImageBuilderComponent(this, 'AWS CLI', {
|
|
134
|
-
* platform: 'Windows',
|
|
135
|
-
* displayName: 'AWS CLI',
|
|
136
|
-
* description: 'Install latest version of AWS CLI',
|
|
137
|
-
* commands: [
|
|
138
|
-
* '$ErrorActionPreference = \'Stop\'',
|
|
139
|
-
* 'Start-Process msiexec.exe -Wait -ArgumentList \'/i https://awscli.amazonaws.com/AWSCLIV2.msi /qn\'',
|
|
140
|
-
* ],
|
|
141
|
-
* }
|
|
142
|
-
* ```
|
|
143
|
-
*/
|
|
144
|
-
export declare class ImageBuilderComponent extends ImageBuilderObjectBase {
|
|
145
|
-
/**
|
|
146
|
-
* Component ARN.
|
|
147
|
-
*/
|
|
148
|
-
readonly arn: string;
|
|
149
|
-
/**
|
|
150
|
-
* Supported platform for the component.
|
|
151
|
-
*/
|
|
152
|
-
readonly platform: 'Windows' | 'Linux';
|
|
153
|
-
private readonly assets;
|
|
154
|
-
constructor(scope: Construct, id: string, props: ImageBuilderComponentProperties);
|
|
155
|
-
/**
|
|
156
|
-
* Grants read permissions to the principal on the assets buckets.
|
|
157
|
-
*
|
|
158
|
-
* @param grantee
|
|
159
|
-
*/
|
|
160
|
-
grantAssetsRead(grantee: iam.IGrantable): void;
|
|
161
|
-
}
|
|
162
82
|
/**
|
|
163
|
-
* An image builder that uses Image Builder to build Docker images pre-baked with all the GitHub Actions runner requirements. Builders can be used with runner providers.
|
|
83
|
+
* An image builder that uses AWS Image Builder to build Docker images pre-baked with all the GitHub Actions runner requirements. Builders can be used with runner providers.
|
|
164
84
|
*
|
|
165
85
|
* The CodeBuild builder is better and faster. Only use this one if you have no choice. For example, if you need Windows containers.
|
|
166
86
|
*
|
|
@@ -176,27 +96,15 @@ export declare class ImageBuilderComponent extends ImageBuilderObjectBase {
|
|
|
176
96
|
* rebuildInterval: Duration.days(14),
|
|
177
97
|
* });
|
|
178
98
|
* new CodeBuildRunner(this, 'CodeBuild provider', {
|
|
179
|
-
* label: '
|
|
99
|
+
* label: 'custom-codebuild',
|
|
180
100
|
* imageBuilder: builder,
|
|
181
101
|
* });
|
|
182
102
|
* ```
|
|
183
103
|
*/
|
|
184
|
-
export declare class ContainerImageBuilder extends
|
|
185
|
-
readonly architecture: Architecture;
|
|
186
|
-
readonly os: Os;
|
|
187
|
-
readonly platform: 'Windows' | 'Linux';
|
|
188
|
-
readonly description: string;
|
|
189
|
-
readonly runnerVersion: RunnerVersion;
|
|
104
|
+
export declare class ContainerImageBuilder extends ImageBuilderBase implements IImageBuilder {
|
|
190
105
|
readonly repository: ecr.IRepository;
|
|
191
|
-
private
|
|
192
|
-
private parentImage;
|
|
106
|
+
private readonly parentImage;
|
|
193
107
|
private boundImage?;
|
|
194
|
-
readonly subnetId: string | undefined;
|
|
195
|
-
readonly securityGroupIds: string[] | undefined;
|
|
196
|
-
readonly instanceTypes: string[];
|
|
197
|
-
readonly rebuildInterval: Duration;
|
|
198
|
-
readonly logRetention: logs.RetentionDays;
|
|
199
|
-
readonly logRemovalPolicy: cdk.RemovalPolicy;
|
|
200
108
|
constructor(scope: Construct, id: string, props?: ContainerImageBuilderProps);
|
|
201
109
|
private addBaseWindowsComponents;
|
|
202
110
|
/**
|
|
@@ -221,7 +129,5 @@ export declare class ContainerImageBuilder extends Construct implements IImageBu
|
|
|
221
129
|
* Called by IRunnerProvider to finalize settings and create the image builder.
|
|
222
130
|
*/
|
|
223
131
|
bind(): RunnerImage;
|
|
224
|
-
private infrastructure;
|
|
225
132
|
private imageCleaner;
|
|
226
133
|
}
|
|
227
|
-
export {};
|