token-injectable-docker-builder 1.2.7 → 1.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/.jsii +80 -29
- package/API.md +39 -37
- package/isComplete/isComplete.js +91 -68
- package/lib/index.d.ts +48 -35
- package/lib/index.js +86 -62
- package/package.json +6 -4
package/.jsii
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
]
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"aws-cdk-lib": "^2.
|
|
10
|
+
"aws-cdk-lib": "^2.173.2",
|
|
11
11
|
"constructs": "^10.0.5"
|
|
12
12
|
},
|
|
13
13
|
"dependencyClosure": {
|
|
@@ -1019,6 +1019,19 @@
|
|
|
1019
1019
|
}
|
|
1020
1020
|
}
|
|
1021
1021
|
},
|
|
1022
|
+
"aws-cdk-lib.aws_connectcampaignsv2": {
|
|
1023
|
+
"targets": {
|
|
1024
|
+
"dotnet": {
|
|
1025
|
+
"package": "Amazon.CDK.AWS.ConnectCampaignsV2"
|
|
1026
|
+
},
|
|
1027
|
+
"java": {
|
|
1028
|
+
"package": "software.amazon.awscdk.services.connectcampaignsv2"
|
|
1029
|
+
},
|
|
1030
|
+
"python": {
|
|
1031
|
+
"module": "aws_cdk.aws_connectcampaignsv2"
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
},
|
|
1022
1035
|
"aws-cdk-lib.aws_controltower": {
|
|
1023
1036
|
"targets": {
|
|
1024
1037
|
"dotnet": {
|
|
@@ -1838,6 +1851,19 @@
|
|
|
1838
1851
|
}
|
|
1839
1852
|
}
|
|
1840
1853
|
},
|
|
1854
|
+
"aws-cdk-lib.aws_invoicing": {
|
|
1855
|
+
"targets": {
|
|
1856
|
+
"dotnet": {
|
|
1857
|
+
"package": "Amazon.CDK.AWS.Invoicing"
|
|
1858
|
+
},
|
|
1859
|
+
"java": {
|
|
1860
|
+
"package": "software.amazon.awscdk.services.invoicing"
|
|
1861
|
+
},
|
|
1862
|
+
"python": {
|
|
1863
|
+
"module": "aws_cdk.aws_invoicing"
|
|
1864
|
+
}
|
|
1865
|
+
}
|
|
1866
|
+
},
|
|
1841
1867
|
"aws-cdk-lib.aws_iot": {
|
|
1842
1868
|
"targets": {
|
|
1843
1869
|
"dotnet": {
|
|
@@ -2826,6 +2852,19 @@
|
|
|
2826
2852
|
}
|
|
2827
2853
|
}
|
|
2828
2854
|
},
|
|
2855
|
+
"aws-cdk-lib.aws_rbin": {
|
|
2856
|
+
"targets": {
|
|
2857
|
+
"dotnet": {
|
|
2858
|
+
"package": "Amazon.CDK.AWS.Rbin"
|
|
2859
|
+
},
|
|
2860
|
+
"java": {
|
|
2861
|
+
"package": "software.amazon.awscdk.services.rbin"
|
|
2862
|
+
},
|
|
2863
|
+
"python": {
|
|
2864
|
+
"module": "aws_cdk.aws_rbin"
|
|
2865
|
+
}
|
|
2866
|
+
}
|
|
2867
|
+
},
|
|
2829
2868
|
"aws-cdk-lib.aws_rds": {
|
|
2830
2869
|
"targets": {
|
|
2831
2870
|
"dotnet": {
|
|
@@ -3920,31 +3959,41 @@
|
|
|
3920
3959
|
"base": "constructs.Construct",
|
|
3921
3960
|
"docs": {
|
|
3922
3961
|
"stability": "stable",
|
|
3923
|
-
"summary": "A CDK construct to build and push Docker images to an ECR repository using CodeBuild and Lambda custom resources."
|
|
3962
|
+
"summary": "A CDK construct to build and push Docker images to an ECR repository using CodeBuild and Lambda custom resources, **then** retrieve the final image tag so that ECS/Lambda references use the exact digest."
|
|
3924
3963
|
},
|
|
3925
3964
|
"fqn": "token-injectable-docker-builder.TokenInjectableDockerBuilder",
|
|
3926
3965
|
"initializer": {
|
|
3927
3966
|
"docs": {
|
|
3928
|
-
"stability": "stable"
|
|
3967
|
+
"stability": "stable",
|
|
3968
|
+
"summary": "Creates a new `TokenInjectableDockerBuilder`."
|
|
3929
3969
|
},
|
|
3930
3970
|
"locationInModule": {
|
|
3931
3971
|
"filename": "src/index.ts",
|
|
3932
|
-
"line":
|
|
3972
|
+
"line": 138
|
|
3933
3973
|
},
|
|
3934
3974
|
"parameters": [
|
|
3935
3975
|
{
|
|
3976
|
+
"docs": {
|
|
3977
|
+
"summary": "The scope in which to define this construct."
|
|
3978
|
+
},
|
|
3936
3979
|
"name": "scope",
|
|
3937
3980
|
"type": {
|
|
3938
3981
|
"fqn": "constructs.Construct"
|
|
3939
3982
|
}
|
|
3940
3983
|
},
|
|
3941
3984
|
{
|
|
3985
|
+
"docs": {
|
|
3986
|
+
"summary": "The scoped construct ID."
|
|
3987
|
+
},
|
|
3942
3988
|
"name": "id",
|
|
3943
3989
|
"type": {
|
|
3944
3990
|
"primitive": "string"
|
|
3945
3991
|
}
|
|
3946
3992
|
},
|
|
3947
3993
|
{
|
|
3994
|
+
"docs": {
|
|
3995
|
+
"summary": "Configuration for building and pushing the Docker image."
|
|
3996
|
+
},
|
|
3948
3997
|
"name": "props",
|
|
3949
3998
|
"type": {
|
|
3950
3999
|
"fqn": "token-injectable-docker-builder.TokenInjectableDockerBuilderProps"
|
|
@@ -3955,18 +4004,19 @@
|
|
|
3955
4004
|
"kind": "class",
|
|
3956
4005
|
"locationInModule": {
|
|
3957
4006
|
"filename": "src/index.ts",
|
|
3958
|
-
"line":
|
|
4007
|
+
"line": 113
|
|
3959
4008
|
},
|
|
3960
4009
|
"name": "TokenInjectableDockerBuilder",
|
|
3961
4010
|
"properties": [
|
|
3962
4011
|
{
|
|
3963
4012
|
"docs": {
|
|
3964
|
-
"stability": "stable"
|
|
4013
|
+
"stability": "stable",
|
|
4014
|
+
"summary": "An ECS-compatible container image referencing the tag of the built Docker image."
|
|
3965
4015
|
},
|
|
3966
4016
|
"immutable": true,
|
|
3967
4017
|
"locationInModule": {
|
|
3968
4018
|
"filename": "src/index.ts",
|
|
3969
|
-
"line":
|
|
4019
|
+
"line": 123
|
|
3970
4020
|
},
|
|
3971
4021
|
"name": "containerImage",
|
|
3972
4022
|
"type": {
|
|
@@ -3975,12 +4025,13 @@
|
|
|
3975
4025
|
},
|
|
3976
4026
|
{
|
|
3977
4027
|
"docs": {
|
|
3978
|
-
"stability": "stable"
|
|
4028
|
+
"stability": "stable",
|
|
4029
|
+
"summary": "A Lambda-compatible DockerImageCode referencing the the tag of the built Docker image."
|
|
3979
4030
|
},
|
|
3980
4031
|
"immutable": true,
|
|
3981
4032
|
"locationInModule": {
|
|
3982
4033
|
"filename": "src/index.ts",
|
|
3983
|
-
"line":
|
|
4034
|
+
"line": 129
|
|
3984
4035
|
},
|
|
3985
4036
|
"name": "dockerImageCode",
|
|
3986
4037
|
"type": {
|
|
@@ -4001,7 +4052,7 @@
|
|
|
4001
4052
|
"kind": "interface",
|
|
4002
4053
|
"locationInModule": {
|
|
4003
4054
|
"filename": "src/index.ts",
|
|
4004
|
-
"line":
|
|
4055
|
+
"line": 19
|
|
4005
4056
|
},
|
|
4006
4057
|
"name": "TokenInjectableDockerBuilderProps",
|
|
4007
4058
|
"properties": [
|
|
@@ -4014,7 +4065,7 @@
|
|
|
4014
4065
|
"immutable": true,
|
|
4015
4066
|
"locationInModule": {
|
|
4016
4067
|
"filename": "src/index.ts",
|
|
4017
|
-
"line":
|
|
4068
|
+
"line": 23
|
|
4018
4069
|
},
|
|
4019
4070
|
"name": "path",
|
|
4020
4071
|
"type": {
|
|
@@ -4025,14 +4076,14 @@
|
|
|
4025
4076
|
"abstract": true,
|
|
4026
4077
|
"docs": {
|
|
4027
4078
|
"example": "{\n TOKEN: 'my-secret-token',\n ENV: 'production'\n}",
|
|
4028
|
-
"remarks": "These are transformed into `--build-arg` flags.",
|
|
4079
|
+
"remarks": "These are transformed into `--build-arg KEY=VALUE` flags.",
|
|
4029
4080
|
"stability": "stable",
|
|
4030
4081
|
"summary": "Build arguments to pass to the Docker build process."
|
|
4031
4082
|
},
|
|
4032
4083
|
"immutable": true,
|
|
4033
4084
|
"locationInModule": {
|
|
4034
4085
|
"filename": "src/index.ts",
|
|
4035
|
-
"line":
|
|
4086
|
+
"line": 34
|
|
4036
4087
|
},
|
|
4037
4088
|
"name": "buildArgs",
|
|
4038
4089
|
"optional": true,
|
|
@@ -4049,14 +4100,14 @@
|
|
|
4049
4100
|
"abstract": true,
|
|
4050
4101
|
"docs": {
|
|
4051
4102
|
"example": "'arn:aws:secretsmanager:us-east-1:123456789012:secret:DockerLoginSecret'",
|
|
4052
|
-
"remarks": "This secret should store a JSON object with the following structure:\n```json\n{\n \"username\": \"my-docker-username\",\n \"password\": \"my-docker-password\"\n}\n```\nIf not provided, the construct will skip Docker login
|
|
4103
|
+
"remarks": "This secret should store a JSON object with the following structure:\n```json\n{\n \"username\": \"my-docker-username\",\n \"password\": \"my-docker-password\"\n}\n```\nIf not provided (or not needed), the construct will skip Docker Hub login.\n\n**Note**: The secret must be in the same region as the stack.",
|
|
4053
4104
|
"stability": "stable",
|
|
4054
4105
|
"summary": "The ARN of the AWS Secrets Manager secret containing Docker login credentials."
|
|
4055
4106
|
},
|
|
4056
4107
|
"immutable": true,
|
|
4057
4108
|
"locationInModule": {
|
|
4058
4109
|
"filename": "src/index.ts",
|
|
4059
|
-
"line":
|
|
4110
|
+
"line": 51
|
|
4060
4111
|
},
|
|
4061
4112
|
"name": "dockerLoginSecretArn",
|
|
4062
4113
|
"optional": true,
|
|
@@ -4068,9 +4119,9 @@
|
|
|
4068
4119
|
"abstract": true,
|
|
4069
4120
|
"docs": {
|
|
4070
4121
|
"default": "- No additional install commands.",
|
|
4071
|
-
"remarks": "**Example
|
|
4122
|
+
"remarks": "**Example**:\n```ts\ninstallCommands: [\n 'echo \"Updating package lists...\"',\n 'apt-get update -y',\n 'echo \"Installing required packages...\"',\n 'apt-get install -y curl dnsutils',\n],\n```",
|
|
4072
4123
|
"stability": "stable",
|
|
4073
|
-
"summary": "Custom commands to run during the install phase."
|
|
4124
|
+
"summary": "Custom commands to run during the install phase of CodeBuild."
|
|
4074
4125
|
},
|
|
4075
4126
|
"immutable": true,
|
|
4076
4127
|
"locationInModule": {
|
|
@@ -4092,14 +4143,14 @@
|
|
|
4092
4143
|
"abstract": true,
|
|
4093
4144
|
"docs": {
|
|
4094
4145
|
"default": "- No additional pre-build commands.",
|
|
4095
|
-
"remarks": "**Example
|
|
4146
|
+
"remarks": "**Example**:\n```ts\npreBuildCommands: [\n 'echo \"Fetching configuration from private API...\"',\n 'curl -o config.json https://api.example.com/config',\n],\n```",
|
|
4096
4147
|
"stability": "stable",
|
|
4097
|
-
"summary": "Custom commands to run during the pre_build phase."
|
|
4148
|
+
"summary": "Custom commands to run during the pre_build phase of CodeBuild."
|
|
4098
4149
|
},
|
|
4099
4150
|
"immutable": true,
|
|
4100
4151
|
"locationInModule": {
|
|
4101
4152
|
"filename": "src/index.ts",
|
|
4102
|
-
"line":
|
|
4153
|
+
"line": 105
|
|
4103
4154
|
},
|
|
4104
4155
|
"name": "preBuildCommands",
|
|
4105
4156
|
"optional": true,
|
|
@@ -4115,15 +4166,15 @@
|
|
|
4115
4166
|
{
|
|
4116
4167
|
"abstract": true,
|
|
4117
4168
|
"docs": {
|
|
4118
|
-
"default": "No security groups are attached.",
|
|
4119
|
-
"remarks": "These
|
|
4169
|
+
"default": "- No security groups are attached.",
|
|
4170
|
+
"remarks": "These define the network access rules for the CodeBuild project.",
|
|
4120
4171
|
"stability": "stable",
|
|
4121
4172
|
"summary": "The security groups to attach to the CodeBuild project."
|
|
4122
4173
|
},
|
|
4123
4174
|
"immutable": true,
|
|
4124
4175
|
"locationInModule": {
|
|
4125
4176
|
"filename": "src/index.ts",
|
|
4126
|
-
"line":
|
|
4177
|
+
"line": 67
|
|
4127
4178
|
},
|
|
4128
4179
|
"name": "securityGroups",
|
|
4129
4180
|
"optional": true,
|
|
@@ -4139,7 +4190,7 @@
|
|
|
4139
4190
|
{
|
|
4140
4191
|
"abstract": true,
|
|
4141
4192
|
"docs": {
|
|
4142
|
-
"default": "All subnets in the VPC are used.",
|
|
4193
|
+
"default": "- All subnets in the VPC are used.",
|
|
4143
4194
|
"remarks": "Allows the user to select private, public, or isolated subnets.",
|
|
4144
4195
|
"stability": "stable",
|
|
4145
4196
|
"summary": "The subnet selection to specify which subnets to use within the VPC."
|
|
@@ -4147,7 +4198,7 @@
|
|
|
4147
4198
|
"immutable": true,
|
|
4148
4199
|
"locationInModule": {
|
|
4149
4200
|
"filename": "src/index.ts",
|
|
4150
|
-
"line":
|
|
4201
|
+
"line": 75
|
|
4151
4202
|
},
|
|
4152
4203
|
"name": "subnetSelection",
|
|
4153
4204
|
"optional": true,
|
|
@@ -4158,7 +4209,7 @@
|
|
|
4158
4209
|
{
|
|
4159
4210
|
"abstract": true,
|
|
4160
4211
|
"docs": {
|
|
4161
|
-
"default": "No VPC is attached, and the CodeBuild project will use public internet.",
|
|
4212
|
+
"default": "- No VPC is attached, and the CodeBuild project will use public internet.",
|
|
4162
4213
|
"remarks": "If provided, the CodeBuild project will be launched within the specified VPC.",
|
|
4163
4214
|
"stability": "stable",
|
|
4164
4215
|
"summary": "The VPC in which the CodeBuild project will be deployed."
|
|
@@ -4166,7 +4217,7 @@
|
|
|
4166
4217
|
"immutable": true,
|
|
4167
4218
|
"locationInModule": {
|
|
4168
4219
|
"filename": "src/index.ts",
|
|
4169
|
-
"line":
|
|
4220
|
+
"line": 59
|
|
4170
4221
|
},
|
|
4171
4222
|
"name": "vpc",
|
|
4172
4223
|
"optional": true,
|
|
@@ -4178,6 +4229,6 @@
|
|
|
4178
4229
|
"symbolId": "src/index:TokenInjectableDockerBuilderProps"
|
|
4179
4230
|
}
|
|
4180
4231
|
},
|
|
4181
|
-
"version": "1.
|
|
4182
|
-
"fingerprint": "
|
|
4232
|
+
"version": "1.3.1",
|
|
4233
|
+
"fingerprint": "Q9DfzcrA3DzkFuZ3QghI1ZV3uoLI/0611iFI3ZPoifc="
|
|
4183
4234
|
}
|
package/API.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
### TokenInjectableDockerBuilder <a name="TokenInjectableDockerBuilder" id="token-injectable-docker-builder.TokenInjectableDockerBuilder"></a>
|
|
6
6
|
|
|
7
|
-
A CDK construct to build and push Docker images to an ECR repository using CodeBuild and Lambda custom resources.
|
|
7
|
+
A CDK construct to build and push Docker images to an ECR repository using CodeBuild and Lambda custom resources, **then** retrieve the final image tag so that ECS/Lambda references use the exact digest.
|
|
8
8
|
|
|
9
9
|
#### Initializers <a name="Initializers" id="token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer"></a>
|
|
10
10
|
|
|
@@ -16,9 +16,9 @@ new TokenInjectableDockerBuilder(scope: Construct, id: string, props: TokenInjec
|
|
|
16
16
|
|
|
17
17
|
| **Name** | **Type** | **Description** |
|
|
18
18
|
| --- | --- | --- |
|
|
19
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> |
|
|
20
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.id">id</a></code> | <code>string</code> |
|
|
21
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.props">props</a></code> | <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps">TokenInjectableDockerBuilderProps</a></code> |
|
|
19
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | The scope in which to define this construct. |
|
|
20
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.id">id</a></code> | <code>string</code> | The scoped construct ID. |
|
|
21
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.props">props</a></code> | <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps">TokenInjectableDockerBuilderProps</a></code> | Configuration for building and pushing the Docker image. |
|
|
22
22
|
|
|
23
23
|
---
|
|
24
24
|
|
|
@@ -26,18 +26,24 @@ new TokenInjectableDockerBuilder(scope: Construct, id: string, props: TokenInjec
|
|
|
26
26
|
|
|
27
27
|
- *Type:* constructs.Construct
|
|
28
28
|
|
|
29
|
+
The scope in which to define this construct.
|
|
30
|
+
|
|
29
31
|
---
|
|
30
32
|
|
|
31
33
|
##### `id`<sup>Required</sup> <a name="id" id="token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.id"></a>
|
|
32
34
|
|
|
33
35
|
- *Type:* string
|
|
34
36
|
|
|
37
|
+
The scoped construct ID.
|
|
38
|
+
|
|
35
39
|
---
|
|
36
40
|
|
|
37
41
|
##### `props`<sup>Required</sup> <a name="props" id="token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.props"></a>
|
|
38
42
|
|
|
39
43
|
- *Type:* <a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps">TokenInjectableDockerBuilderProps</a>
|
|
40
44
|
|
|
45
|
+
Configuration for building and pushing the Docker image.
|
|
46
|
+
|
|
41
47
|
---
|
|
42
48
|
|
|
43
49
|
#### Methods <a name="Methods" id="Methods"></a>
|
|
@@ -87,8 +93,8 @@ Any object.
|
|
|
87
93
|
| **Name** | **Type** | **Description** |
|
|
88
94
|
| --- | --- | --- |
|
|
89
95
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
|
|
90
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.property.containerImage">containerImage</a></code> | <code>aws-cdk-lib.aws_ecs.ContainerImage</code> |
|
|
91
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.property.dockerImageCode">dockerImageCode</a></code> | <code>aws-cdk-lib.aws_lambda.DockerImageCode</code> |
|
|
96
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.property.containerImage">containerImage</a></code> | <code>aws-cdk-lib.aws_ecs.ContainerImage</code> | An ECS-compatible container image referencing the tag of the built Docker image. |
|
|
97
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.property.dockerImageCode">dockerImageCode</a></code> | <code>aws-cdk-lib.aws_lambda.DockerImageCode</code> | A Lambda-compatible DockerImageCode referencing the the tag of the built Docker image. |
|
|
92
98
|
|
|
93
99
|
---
|
|
94
100
|
|
|
@@ -112,6 +118,8 @@ public readonly containerImage: ContainerImage;
|
|
|
112
118
|
|
|
113
119
|
- *Type:* aws-cdk-lib.aws_ecs.ContainerImage
|
|
114
120
|
|
|
121
|
+
An ECS-compatible container image referencing the tag of the built Docker image.
|
|
122
|
+
|
|
115
123
|
---
|
|
116
124
|
|
|
117
125
|
##### `dockerImageCode`<sup>Required</sup> <a name="dockerImageCode" id="token-injectable-docker-builder.TokenInjectableDockerBuilder.property.dockerImageCode"></a>
|
|
@@ -122,6 +130,8 @@ public readonly dockerImageCode: DockerImageCode;
|
|
|
122
130
|
|
|
123
131
|
- *Type:* aws-cdk-lib.aws_lambda.DockerImageCode
|
|
124
132
|
|
|
133
|
+
A Lambda-compatible DockerImageCode referencing the the tag of the built Docker image.
|
|
134
|
+
|
|
125
135
|
---
|
|
126
136
|
|
|
127
137
|
|
|
@@ -146,8 +156,8 @@ const tokenInjectableDockerBuilderProps: TokenInjectableDockerBuilderProps = { .
|
|
|
146
156
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.path">path</a></code> | <code>string</code> | The path to the directory containing the Dockerfile or source code. |
|
|
147
157
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.buildArgs">buildArgs</a></code> | <code>{[ key: string ]: string}</code> | Build arguments to pass to the Docker build process. |
|
|
148
158
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.dockerLoginSecretArn">dockerLoginSecretArn</a></code> | <code>string</code> | The ARN of the AWS Secrets Manager secret containing Docker login credentials. |
|
|
149
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.installCommands">installCommands</a></code> | <code>string[]</code> | Custom commands to run during the install phase. |
|
|
150
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.preBuildCommands">preBuildCommands</a></code> | <code>string[]</code> | Custom commands to run during the pre_build phase. |
|
|
159
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.installCommands">installCommands</a></code> | <code>string[]</code> | Custom commands to run during the install phase of CodeBuild. |
|
|
160
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.preBuildCommands">preBuildCommands</a></code> | <code>string[]</code> | Custom commands to run during the pre_build phase of CodeBuild. |
|
|
151
161
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.securityGroups">securityGroups</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup[]</code> | The security groups to attach to the CodeBuild project. |
|
|
152
162
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.subnetSelection">subnetSelection</a></code> | <code>aws-cdk-lib.aws_ec2.SubnetSelection</code> | The subnet selection to specify which subnets to use within the VPC. |
|
|
153
163
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.vpc">vpc</a></code> | <code>aws-cdk-lib.aws_ec2.IVpc</code> | The VPC in which the CodeBuild project will be deployed. |
|
|
@@ -176,7 +186,7 @@ public readonly buildArgs: {[ key: string ]: string};
|
|
|
176
186
|
|
|
177
187
|
Build arguments to pass to the Docker build process.
|
|
178
188
|
|
|
179
|
-
These are transformed into `--build-arg` flags.
|
|
189
|
+
These are transformed into `--build-arg KEY=VALUE` flags.
|
|
180
190
|
|
|
181
191
|
---
|
|
182
192
|
|
|
@@ -207,7 +217,9 @@ This secret should store a JSON object with the following structure:
|
|
|
207
217
|
"password": "my-docker-password"
|
|
208
218
|
}
|
|
209
219
|
```
|
|
210
|
-
If not provided, the construct will skip Docker login
|
|
220
|
+
If not provided (or not needed), the construct will skip Docker Hub login.
|
|
221
|
+
|
|
222
|
+
**Note**: The secret must be in the same region as the stack.
|
|
211
223
|
|
|
212
224
|
---
|
|
213
225
|
|
|
@@ -227,22 +239,17 @@ public readonly installCommands: string[];
|
|
|
227
239
|
- *Type:* string[]
|
|
228
240
|
- *Default:* No additional install commands.
|
|
229
241
|
|
|
230
|
-
Custom commands to run during the install phase.
|
|
242
|
+
Custom commands to run during the install phase of CodeBuild.
|
|
231
243
|
|
|
232
|
-
**Example
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
'apt-get install -y curl dnsutils',
|
|
241
|
-
],
|
|
242
|
-
// ... other properties ...
|
|
243
|
-
});
|
|
244
|
+
**Example**:
|
|
245
|
+
```ts
|
|
246
|
+
installCommands: [
|
|
247
|
+
'echo "Updating package lists..."',
|
|
248
|
+
'apt-get update -y',
|
|
249
|
+
'echo "Installing required packages..."',
|
|
250
|
+
'apt-get install -y curl dnsutils',
|
|
251
|
+
],
|
|
244
252
|
```
|
|
245
|
-
*This example demonstrates how to install the `curl` and `dnsutils` packages during the install phase using `apt-get`, the package manager for Ubuntu-based CodeBuild environments.*
|
|
246
253
|
|
|
247
254
|
---
|
|
248
255
|
|
|
@@ -255,20 +262,15 @@ public readonly preBuildCommands: string[];
|
|
|
255
262
|
- *Type:* string[]
|
|
256
263
|
- *Default:* No additional pre-build commands.
|
|
257
264
|
|
|
258
|
-
Custom commands to run during the pre_build phase.
|
|
265
|
+
Custom commands to run during the pre_build phase of CodeBuild.
|
|
259
266
|
|
|
260
|
-
**Example
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
'curl -o config.json https://api.example.com/config',
|
|
267
|
-
],
|
|
268
|
-
// ... other properties ...
|
|
269
|
-
});
|
|
267
|
+
**Example**:
|
|
268
|
+
```ts
|
|
269
|
+
preBuildCommands: [
|
|
270
|
+
'echo "Fetching configuration from private API..."',
|
|
271
|
+
'curl -o config.json https://api.example.com/config',
|
|
272
|
+
],
|
|
270
273
|
```
|
|
271
|
-
*In this example, the builder fetches a configuration file from a private API before starting the Docker build. This config file will be available in the same directory as your Dockerfile during CDK deployment.*
|
|
272
274
|
|
|
273
275
|
---
|
|
274
276
|
|
|
@@ -283,7 +285,7 @@ public readonly securityGroups: ISecurityGroup[];
|
|
|
283
285
|
|
|
284
286
|
The security groups to attach to the CodeBuild project.
|
|
285
287
|
|
|
286
|
-
These
|
|
288
|
+
These define the network access rules for the CodeBuild project.
|
|
287
289
|
|
|
288
290
|
---
|
|
289
291
|
|
package/isComplete/isComplete.js
CHANGED
|
@@ -1,97 +1,120 @@
|
|
|
1
|
-
const {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
const {
|
|
2
|
+
CodeBuildClient,
|
|
3
|
+
ListBuildsForProjectCommand,
|
|
4
|
+
BatchGetBuildsCommand,
|
|
5
|
+
} = require('@aws-sdk/client-codebuild');
|
|
6
|
+
const {
|
|
7
|
+
CloudWatchLogsClient,
|
|
8
|
+
GetLogEventsCommand,
|
|
9
|
+
} = require('@aws-sdk/client-cloudwatch-logs');
|
|
10
|
+
|
|
11
|
+
exports.handler = async (event) => {
|
|
12
|
+
console.log('--- isComplete Handler Invoked ---');
|
|
13
|
+
console.log('AWS_REGION:', process.env.AWS_REGION);
|
|
14
|
+
console.log('Event:', JSON.stringify(event, null, 2));
|
|
15
|
+
|
|
16
|
+
const region = process.env.AWS_REGION;
|
|
17
|
+
const codebuildClient = new CodeBuildClient({ region });
|
|
18
|
+
const logsClient = new CloudWatchLogsClient({ region });
|
|
10
19
|
|
|
11
20
|
try {
|
|
12
|
-
const projectName = event.ResourceProperties
|
|
21
|
+
const projectName = event.ResourceProperties?.ProjectName;
|
|
22
|
+
console.log('ProjectName from ResourceProperties:', projectName);
|
|
13
23
|
|
|
14
24
|
if (!projectName) {
|
|
15
|
-
throw new Error('ProjectName
|
|
25
|
+
throw new Error('Missing ProjectName in ResourceProperties');
|
|
16
26
|
}
|
|
17
27
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
sortOrder: 'DESCENDING',
|
|
24
|
-
maxResults: 1,
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
const listBuildsResp = await codebuildClient.send(listBuildsCommand);
|
|
28
|
-
const buildIds = listBuildsResp.ids;
|
|
28
|
+
// Handle Delete requests gracefully
|
|
29
|
+
if (event.RequestType === 'Delete') {
|
|
30
|
+
console.log('Delete request detected. Marking resource as complete.');
|
|
31
|
+
return { IsComplete: true };
|
|
32
|
+
}
|
|
29
33
|
|
|
30
|
-
|
|
34
|
+
// 1) Retrieve the latest build ID for this project
|
|
35
|
+
console.log('Querying CodeBuild for the most recent build...');
|
|
36
|
+
const listResp = await codebuildClient.send(
|
|
37
|
+
new ListBuildsForProjectCommand({
|
|
38
|
+
projectName,
|
|
39
|
+
sortOrder: 'DESCENDING',
|
|
40
|
+
maxResults: 1,
|
|
41
|
+
})
|
|
42
|
+
);
|
|
43
|
+
console.log('ListBuildsForProjectCommand response:', JSON.stringify(listResp, null, 2));
|
|
44
|
+
|
|
45
|
+
if (!listResp.ids || listResp.ids.length === 0) {
|
|
31
46
|
throw new Error(`No builds found for project: ${projectName}`);
|
|
32
47
|
}
|
|
33
48
|
|
|
34
|
-
const buildId =
|
|
35
|
-
console.log(`
|
|
49
|
+
const buildId = listResp.ids[0];
|
|
50
|
+
console.log(`Identified latest Build ID: ${buildId}`);
|
|
36
51
|
|
|
37
|
-
// Get build
|
|
38
|
-
const
|
|
39
|
-
ids: [buildId]
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const buildDetailsResp = await codebuildClient.send(batchGetBuildsCommand);
|
|
43
|
-
const build = buildDetailsResp.builds[0];
|
|
52
|
+
// 2) Get details about that specific build
|
|
53
|
+
const batchResp = await codebuildClient.send(
|
|
54
|
+
new BatchGetBuildsCommand({ ids: [buildId] })
|
|
55
|
+
);
|
|
56
|
+
console.log('BatchGetBuildsCommand response:', JSON.stringify(batchResp, null, 2));
|
|
44
57
|
|
|
58
|
+
const build = batchResp.builds?.[0];
|
|
45
59
|
if (!build) {
|
|
46
60
|
throw new Error(`Build details not found for Build ID: ${buildId}`);
|
|
47
61
|
}
|
|
48
62
|
|
|
49
63
|
const buildStatus = build.buildStatus;
|
|
50
|
-
console.log(`
|
|
64
|
+
console.log(`The build status for ID ${buildId} is: ${buildStatus}`);
|
|
51
65
|
|
|
66
|
+
// Check for in-progress status
|
|
52
67
|
if (buildStatus === 'IN_PROGRESS') {
|
|
53
|
-
|
|
54
|
-
console.log('Build is still in progress.');
|
|
68
|
+
console.log('Build is still in progress. Requesting more time...');
|
|
55
69
|
return { IsComplete: false };
|
|
56
|
-
}
|
|
57
|
-
// Build succeeded
|
|
58
|
-
console.log('Build succeeded.');
|
|
59
|
-
return { IsComplete: true };
|
|
60
|
-
} else if (['FAILED', 'FAULT', 'STOPPED', 'TIMED_OUT'].includes(buildStatus)) {
|
|
61
|
-
// Build failed; retrieve last 5 log lines
|
|
62
|
-
const logsInfo = build.logs;
|
|
63
|
-
if (logsInfo && logsInfo.groupName && logsInfo.streamName) {
|
|
64
|
-
console.log(`Retrieving logs from CloudWatch Logs Group: ${logsInfo.groupName}, Stream: ${logsInfo.streamName}`);
|
|
65
|
-
|
|
66
|
-
const getLogEventsCommand = new GetLogEventsCommand({
|
|
67
|
-
logGroupName: logsInfo.groupName,
|
|
68
|
-
logStreamName: logsInfo.streamName,
|
|
69
|
-
startFromHead: false, // Start from the end to get latest logs
|
|
70
|
-
limit: 5,
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
const logEventsResp = await cloudwatchlogsClient.send(getLogEventsCommand);
|
|
74
|
-
const logEvents = logEventsResp.events;
|
|
75
|
-
const lastFiveMessages = logEvents.map((event) => event.message).reverse().join('\n');
|
|
70
|
+
}
|
|
76
71
|
|
|
77
|
-
|
|
78
|
-
|
|
72
|
+
// If build succeeded, retrieve the final artifact with the digest
|
|
73
|
+
if (buildStatus === 'SUCCEEDED') {
|
|
74
|
+
return {
|
|
75
|
+
IsComplete: true,
|
|
76
|
+
Data: {
|
|
77
|
+
ImageTag: process.env.IMAGE_TAG,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
79
81
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
// If the build is in a failed status, retrieve CloudWatch logs
|
|
83
|
+
if (['FAILED', 'FAULT', 'STOPPED', 'TIMED_OUT'].includes(buildStatus)) {
|
|
84
|
+
console.log(`Build ended with status: ${buildStatus}. Attempting to retrieve last log lines...`);
|
|
85
|
+
const logsInfo = build.logs;
|
|
86
|
+
console.log('Logs info:', JSON.stringify(logsInfo, null, 2));
|
|
87
|
+
|
|
88
|
+
if (logsInfo?.groupName && logsInfo?.streamName) {
|
|
89
|
+
console.log(`Retrieving up to 5 log events from CloudWatch Logs in group ${logsInfo.groupName} stream ${logsInfo.streamName}`);
|
|
90
|
+
const logResp = await logsClient.send(
|
|
91
|
+
new GetLogEventsCommand({
|
|
92
|
+
logGroupName: logsInfo.groupName,
|
|
93
|
+
logStreamName: logsInfo.streamName,
|
|
94
|
+
startFromHead: false,
|
|
95
|
+
limit: 5,
|
|
96
|
+
})
|
|
97
|
+
);
|
|
98
|
+
console.log('GetLogEventsCommand response:', JSON.stringify(logResp, null, 2));
|
|
99
|
+
|
|
100
|
+
const logEvents = logResp.events || [];
|
|
101
|
+
const lastFive = logEvents.map(e => e.message).reverse().join('\n');
|
|
102
|
+
console.error('Last 5 build log lines:\n', lastFive);
|
|
103
|
+
|
|
104
|
+
throw new Error(`Build failed with status ${buildStatus}. Last logs:\n${lastFive}`);
|
|
82
105
|
} else {
|
|
83
|
-
|
|
84
|
-
console.error(errorMessage);
|
|
85
|
-
throw new Error(errorMessage);
|
|
106
|
+
throw new Error(`Build failed with status: ${buildStatus}, but no logs found.`);
|
|
86
107
|
}
|
|
87
|
-
} else {
|
|
88
|
-
const errorMessage = `Unknown build status: ${buildStatus}`;
|
|
89
|
-
console.error(errorMessage);
|
|
90
|
-
throw new Error(errorMessage);
|
|
91
108
|
}
|
|
109
|
+
|
|
110
|
+
// If we reach here, it's an unexpected status
|
|
111
|
+
console.log(`Encountered unknown build status: ${buildStatus}`);
|
|
112
|
+
throw new Error(`Unknown build status: ${buildStatus}`);
|
|
113
|
+
|
|
92
114
|
} catch (error) {
|
|
93
|
-
console.error('
|
|
94
|
-
|
|
115
|
+
console.error('--- Caught an error in isComplete handler ---');
|
|
116
|
+
console.error('Error details:', error);
|
|
117
|
+
// re-throw for CloudFormation to see the error
|
|
95
118
|
throw error;
|
|
96
119
|
}
|
|
97
120
|
};
|
package/lib/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export interface TokenInjectableDockerBuilderProps {
|
|
|
12
12
|
readonly path: string;
|
|
13
13
|
/**
|
|
14
14
|
* Build arguments to pass to the Docker build process.
|
|
15
|
-
* These are transformed into `--build-arg` flags.
|
|
15
|
+
* These are transformed into `--build-arg KEY=VALUE` flags.
|
|
16
16
|
* @example
|
|
17
17
|
* {
|
|
18
18
|
* TOKEN: 'my-secret-token',
|
|
@@ -31,7 +31,9 @@ export interface TokenInjectableDockerBuilderProps {
|
|
|
31
31
|
* "password": "my-docker-password"
|
|
32
32
|
* }
|
|
33
33
|
* ```
|
|
34
|
-
* If not provided, the construct will skip Docker login
|
|
34
|
+
* If not provided (or not needed), the construct will skip Docker Hub login.
|
|
35
|
+
*
|
|
36
|
+
* **Note**: The secret must be in the same region as the stack.
|
|
35
37
|
*
|
|
36
38
|
* @example 'arn:aws:secretsmanager:us-east-1:123456789012:secret:DockerLoginSecret'
|
|
37
39
|
*/
|
|
@@ -39,68 +41,79 @@ export interface TokenInjectableDockerBuilderProps {
|
|
|
39
41
|
/**
|
|
40
42
|
* The VPC in which the CodeBuild project will be deployed.
|
|
41
43
|
* If provided, the CodeBuild project will be launched within the specified VPC.
|
|
42
|
-
*
|
|
44
|
+
*
|
|
45
|
+
* @default - No VPC is attached, and the CodeBuild project will use public internet.
|
|
43
46
|
*/
|
|
44
47
|
readonly vpc?: IVpc;
|
|
45
48
|
/**
|
|
46
49
|
* The security groups to attach to the CodeBuild project.
|
|
47
|
-
* These
|
|
48
|
-
*
|
|
50
|
+
* These define the network access rules for the CodeBuild project.
|
|
51
|
+
*
|
|
52
|
+
* @default - No security groups are attached.
|
|
49
53
|
*/
|
|
50
54
|
readonly securityGroups?: ISecurityGroup[];
|
|
51
55
|
/**
|
|
52
56
|
* The subnet selection to specify which subnets to use within the VPC.
|
|
53
57
|
* Allows the user to select private, public, or isolated subnets.
|
|
54
|
-
*
|
|
58
|
+
*
|
|
59
|
+
* @default - All subnets in the VPC are used.
|
|
55
60
|
*/
|
|
56
61
|
readonly subnetSelection?: SubnetSelection;
|
|
57
62
|
/**
|
|
58
|
-
* Custom commands to run during the install phase.
|
|
63
|
+
* Custom commands to run during the install phase of CodeBuild.
|
|
59
64
|
*
|
|
60
|
-
* **Example
|
|
61
|
-
* ```
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* 'apt-get install -y curl dnsutils',
|
|
69
|
-
* ],
|
|
70
|
-
* // ... other properties ...
|
|
71
|
-
* });
|
|
65
|
+
* **Example**:
|
|
66
|
+
* ```ts
|
|
67
|
+
* installCommands: [
|
|
68
|
+
* 'echo "Updating package lists..."',
|
|
69
|
+
* 'apt-get update -y',
|
|
70
|
+
* 'echo "Installing required packages..."',
|
|
71
|
+
* 'apt-get install -y curl dnsutils',
|
|
72
|
+
* ],
|
|
72
73
|
* ```
|
|
73
|
-
* *This example demonstrates how to install the `curl` and `dnsutils` packages during the install phase using `apt-get`, the package manager for Ubuntu-based CodeBuild environments.*
|
|
74
|
-
*
|
|
75
74
|
* @default - No additional install commands.
|
|
76
75
|
*/
|
|
77
76
|
readonly installCommands?: string[];
|
|
78
77
|
/**
|
|
79
|
-
* Custom commands to run during the pre_build phase.
|
|
78
|
+
* Custom commands to run during the pre_build phase of CodeBuild.
|
|
80
79
|
*
|
|
81
|
-
* **Example
|
|
82
|
-
* ```
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
* 'curl -o config.json https://api.example.com/config',
|
|
88
|
-
* ],
|
|
89
|
-
* // ... other properties ...
|
|
90
|
-
* });
|
|
80
|
+
* **Example**:
|
|
81
|
+
* ```ts
|
|
82
|
+
* preBuildCommands: [
|
|
83
|
+
* 'echo "Fetching configuration from private API..."',
|
|
84
|
+
* 'curl -o config.json https://api.example.com/config',
|
|
85
|
+
* ],
|
|
91
86
|
* ```
|
|
92
|
-
* *In this example, the builder fetches a configuration file from a private API before starting the Docker build. This config file will be available in the same directory as your Dockerfile during CDK deployment.*
|
|
93
|
-
*
|
|
94
87
|
* @default - No additional pre-build commands.
|
|
95
88
|
*/
|
|
96
89
|
readonly preBuildCommands?: string[];
|
|
97
90
|
}
|
|
98
91
|
/**
|
|
99
|
-
* A CDK construct to build and push Docker images to an ECR repository using
|
|
92
|
+
* A CDK construct to build and push Docker images to an ECR repository using
|
|
93
|
+
* CodeBuild and Lambda custom resources, **then** retrieve the final image tag
|
|
94
|
+
* so that ECS/Lambda references use the exact digest.
|
|
100
95
|
*/
|
|
101
96
|
export declare class TokenInjectableDockerBuilder extends Construct {
|
|
97
|
+
/**
|
|
98
|
+
* The ECR repository that stores the resulting Docker image.
|
|
99
|
+
*/
|
|
102
100
|
private readonly ecrRepository;
|
|
101
|
+
/**
|
|
102
|
+
* An ECS-compatible container image referencing the tag
|
|
103
|
+
* of the built Docker image.
|
|
104
|
+
*/
|
|
103
105
|
readonly containerImage: ContainerImage;
|
|
106
|
+
/**
|
|
107
|
+
* A Lambda-compatible DockerImageCode referencing the the tag
|
|
108
|
+
* of the built Docker image.
|
|
109
|
+
*/
|
|
104
110
|
readonly dockerImageCode: DockerImageCode;
|
|
111
|
+
/**
|
|
112
|
+
* Creates a new `TokenInjectableDockerBuilder`.
|
|
113
|
+
*
|
|
114
|
+
* @param scope The scope in which to define this construct.
|
|
115
|
+
* @param id The scoped construct ID.
|
|
116
|
+
* @param props Configuration for building and pushing the Docker image.
|
|
117
|
+
*/
|
|
105
118
|
constructor(scope: Construct, id: string, props: TokenInjectableDockerBuilderProps);
|
|
106
119
|
}
|
package/lib/index.js
CHANGED
|
@@ -12,21 +12,33 @@ const aws_ecs_1 = require("aws-cdk-lib/aws-ecs");
|
|
|
12
12
|
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
13
13
|
const aws_kms_1 = require("aws-cdk-lib/aws-kms");
|
|
14
14
|
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
15
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
15
16
|
const aws_s3_assets_1 = require("aws-cdk-lib/aws-s3-assets");
|
|
16
17
|
const custom_resources_1 = require("aws-cdk-lib/custom-resources");
|
|
17
18
|
const constructs_1 = require("constructs");
|
|
18
19
|
/**
|
|
19
|
-
* A CDK construct to build and push Docker images to an ECR repository using
|
|
20
|
+
* A CDK construct to build and push Docker images to an ECR repository using
|
|
21
|
+
* CodeBuild and Lambda custom resources, **then** retrieve the final image tag
|
|
22
|
+
* so that ECS/Lambda references use the exact digest.
|
|
20
23
|
*/
|
|
21
24
|
class TokenInjectableDockerBuilder extends constructs_1.Construct {
|
|
25
|
+
/**
|
|
26
|
+
* Creates a new `TokenInjectableDockerBuilder`.
|
|
27
|
+
*
|
|
28
|
+
* @param scope The scope in which to define this construct.
|
|
29
|
+
* @param id The scoped construct ID.
|
|
30
|
+
* @param props Configuration for building and pushing the Docker image.
|
|
31
|
+
*/
|
|
22
32
|
constructor(scope, id, props) {
|
|
23
33
|
super(scope, id);
|
|
24
34
|
const { path: sourcePath, buildArgs, dockerLoginSecretArn, vpc, securityGroups, subnetSelection, installCommands, preBuildCommands, } = props;
|
|
35
|
+
// Generate an ephemeral tag for CodeBuild
|
|
36
|
+
const imageTag = crypto.randomUUID();
|
|
25
37
|
// Define a KMS key for ECR encryption
|
|
26
38
|
const encryptionKey = new aws_kms_1.Key(this, 'EcrEncryptionKey', {
|
|
27
39
|
enableKeyRotation: true,
|
|
28
40
|
});
|
|
29
|
-
// Create an ECR repository with lifecycle rules,
|
|
41
|
+
// Create an ECR repository with encryption, lifecycle rules, and image scanning
|
|
30
42
|
this.ecrRepository = new aws_ecr_1.Repository(this, 'ECRRepository', {
|
|
31
43
|
lifecycleRules: [
|
|
32
44
|
{
|
|
@@ -37,31 +49,71 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
|
|
|
37
49
|
},
|
|
38
50
|
],
|
|
39
51
|
encryption: aws_ecr_1.RepositoryEncryption.KMS,
|
|
40
|
-
encryptionKey
|
|
52
|
+
encryptionKey,
|
|
41
53
|
imageScanOnPush: true,
|
|
42
54
|
});
|
|
43
|
-
//
|
|
55
|
+
// Wrap the source folder as an S3 asset for CodeBuild to use
|
|
44
56
|
const sourceAsset = new aws_s3_assets_1.Asset(this, 'SourceAsset', {
|
|
45
57
|
path: sourcePath,
|
|
46
58
|
});
|
|
47
|
-
//
|
|
59
|
+
// Create an S3 bucket to store the CodeBuild artifacts
|
|
60
|
+
const artifactBucket = new aws_s3_1.Bucket(this, 'ArtifactBucket', {
|
|
61
|
+
removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
|
|
62
|
+
autoDeleteObjects: true,
|
|
63
|
+
blockPublicAccess: aws_s3_1.BlockPublicAccess.BLOCK_ALL,
|
|
64
|
+
});
|
|
65
|
+
// Convert buildArgs to a CLI-friendly string
|
|
48
66
|
const buildArgsString = buildArgs
|
|
49
67
|
? Object.entries(buildArgs)
|
|
50
|
-
.map(([
|
|
68
|
+
.map(([k, v]) => `--build-arg ${k}=${v}`)
|
|
51
69
|
.join(' ')
|
|
52
70
|
: '';
|
|
53
|
-
//
|
|
71
|
+
// Optional DockerHub login, if a secret ARN is provided
|
|
54
72
|
const dockerLoginCommands = dockerLoginSecretArn
|
|
55
73
|
? [
|
|
56
|
-
'echo "Retrieving Docker credentials
|
|
74
|
+
'echo "Retrieving Docker credentials..."',
|
|
75
|
+
'apt-get update -y && apt-get install -y jq',
|
|
57
76
|
`DOCKER_USERNAME=$(aws secretsmanager get-secret-value --secret-id ${dockerLoginSecretArn} --query SecretString --output text | jq -r .username)`,
|
|
58
77
|
`DOCKER_PASSWORD=$(aws secretsmanager get-secret-value --secret-id ${dockerLoginSecretArn} --query SecretString --output text | jq -r .password)`,
|
|
59
|
-
'echo "Logging in to Docker..."',
|
|
78
|
+
'echo "Logging in to Docker Hub..."',
|
|
60
79
|
'echo $DOCKER_PASSWORD | docker login --username $DOCKER_USERNAME --password-stdin',
|
|
61
80
|
]
|
|
62
|
-
: ['echo "No Docker credentials
|
|
63
|
-
|
|
64
|
-
|
|
81
|
+
: ['echo "No Docker credentials. Skipping Docker Hub login."'];
|
|
82
|
+
const buildSpecObj = {
|
|
83
|
+
version: '0.2',
|
|
84
|
+
phases: {
|
|
85
|
+
install: {
|
|
86
|
+
commands: [
|
|
87
|
+
'echo "Beginning install phase..."',
|
|
88
|
+
...(installCommands ?? []),
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
pre_build: {
|
|
92
|
+
commands: [
|
|
93
|
+
...(preBuildCommands ?? []),
|
|
94
|
+
...dockerLoginCommands,
|
|
95
|
+
'echo "Retrieving AWS Account ID..."',
|
|
96
|
+
'export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)',
|
|
97
|
+
'echo "Logging into Amazon ECR..."',
|
|
98
|
+
'aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com',
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
build: {
|
|
102
|
+
commands: [
|
|
103
|
+
`echo "Building Docker image with tag ${imageTag}..."`,
|
|
104
|
+
`docker build ${buildArgsString} -t $ECR_REPO_URI:${imageTag} $CODEBUILD_SRC_DIR`,
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
post_build: {
|
|
108
|
+
commands: [
|
|
109
|
+
`echo "Pushing Docker image with tag ${imageTag}..."`,
|
|
110
|
+
`docker push $ECR_REPO_URI:${imageTag}`,
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
// Create the CodeBuild project
|
|
116
|
+
const codeBuildProject = new aws_codebuild_1.Project(this, 'CodeBuildProject', {
|
|
65
117
|
source: aws_codebuild_1.Source.s3({
|
|
66
118
|
bucket: sourceAsset.bucket,
|
|
67
119
|
path: sourceAsset.s3ObjectKey,
|
|
@@ -72,51 +124,15 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
|
|
|
72
124
|
},
|
|
73
125
|
environmentVariables: {
|
|
74
126
|
ECR_REPO_URI: { value: this.ecrRepository.repositoryUri },
|
|
75
|
-
BUILD_ARGS: { value: buildArgsString },
|
|
76
|
-
// Include build arguments as environment variables if needed
|
|
77
|
-
...(buildArgs &&
|
|
78
|
-
Object.fromEntries(Object.entries(buildArgs).map(([key, value]) => [key, { value }]))),
|
|
79
127
|
},
|
|
128
|
+
buildSpec: aws_codebuild_1.BuildSpec.fromObject(buildSpecObj),
|
|
80
129
|
vpc,
|
|
81
130
|
securityGroups,
|
|
82
131
|
subnetSelection,
|
|
83
|
-
buildSpec: aws_codebuild_1.BuildSpec.fromObject({
|
|
84
|
-
version: '0.2',
|
|
85
|
-
phases: {
|
|
86
|
-
install: {
|
|
87
|
-
commands: [
|
|
88
|
-
'echo "Beginning install phase..."',
|
|
89
|
-
...(installCommands || []),
|
|
90
|
-
],
|
|
91
|
-
},
|
|
92
|
-
pre_build: {
|
|
93
|
-
commands: [
|
|
94
|
-
...(preBuildCommands || []),
|
|
95
|
-
...dockerLoginCommands,
|
|
96
|
-
'echo "Retrieving AWS Account ID..."',
|
|
97
|
-
'export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)',
|
|
98
|
-
'echo "Logging in to Amazon ECR..."',
|
|
99
|
-
'aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com',
|
|
100
|
-
],
|
|
101
|
-
},
|
|
102
|
-
build: {
|
|
103
|
-
commands: [
|
|
104
|
-
'echo Build phase: Building the Docker image...',
|
|
105
|
-
'docker build $BUILD_ARGS -t $ECR_REPO_URI:latest $CODEBUILD_SRC_DIR',
|
|
106
|
-
],
|
|
107
|
-
},
|
|
108
|
-
post_build: {
|
|
109
|
-
commands: [
|
|
110
|
-
'echo Post-build phase: Pushing the Docker image...',
|
|
111
|
-
'docker push $ECR_REPO_URI:latest',
|
|
112
|
-
],
|
|
113
|
-
},
|
|
114
|
-
},
|
|
115
|
-
}),
|
|
116
132
|
});
|
|
117
|
-
// Grant
|
|
133
|
+
// Grant CodeBuild the ability to interact with ECR
|
|
118
134
|
this.ecrRepository.grantPullPush(codeBuildProject);
|
|
119
|
-
codeBuildProject.role
|
|
135
|
+
codeBuildProject.role?.addToPrincipalPolicy(new aws_iam_1.PolicyStatement({
|
|
120
136
|
actions: [
|
|
121
137
|
'ecr:GetAuthorizationToken',
|
|
122
138
|
'ecr:GetDownloadUrlForLayer',
|
|
@@ -125,14 +141,13 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
|
|
|
125
141
|
resources: [this.ecrRepository.repositoryArn],
|
|
126
142
|
}));
|
|
127
143
|
if (dockerLoginSecretArn) {
|
|
128
|
-
codeBuildProject.role
|
|
144
|
+
codeBuildProject.role?.addToPrincipalPolicy(new aws_iam_1.PolicyStatement({
|
|
129
145
|
actions: ['secretsmanager:GetSecretValue'],
|
|
130
146
|
resources: [dockerLoginSecretArn],
|
|
131
147
|
}));
|
|
132
148
|
}
|
|
133
|
-
// Grant CodeBuild access to the KMS key
|
|
134
149
|
encryptionKey.grantEncryptDecrypt(codeBuildProject.role);
|
|
135
|
-
//
|
|
150
|
+
// Define the Lambda functions for custom resource event and completion handling
|
|
136
151
|
const onEventHandlerFunction = new aws_lambda_1.Function(this, 'OnEventHandlerFunction', {
|
|
137
152
|
runtime: aws_lambda_1.Runtime.NODEJS_18_X,
|
|
138
153
|
code: aws_lambda_1.Code.fromAsset(path.resolve(__dirname, '../onEvent')),
|
|
@@ -141,11 +156,14 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
|
|
|
141
156
|
});
|
|
142
157
|
onEventHandlerFunction.addToRolePolicy(new aws_iam_1.PolicyStatement({
|
|
143
158
|
actions: ['codebuild:StartBuild'],
|
|
144
|
-
resources: [codeBuildProject.projectArn],
|
|
159
|
+
resources: [codeBuildProject.projectArn],
|
|
145
160
|
}));
|
|
146
161
|
const isCompleteHandlerFunction = new aws_lambda_1.Function(this, 'IsCompleteHandlerFunction', {
|
|
147
162
|
runtime: aws_lambda_1.Runtime.NODEJS_18_X,
|
|
148
163
|
code: aws_lambda_1.Code.fromAsset(path.resolve(__dirname, '../isComplete')),
|
|
164
|
+
environment: {
|
|
165
|
+
IMAGE_TAG: imageTag,
|
|
166
|
+
},
|
|
149
167
|
handler: 'isComplete.handler',
|
|
150
168
|
timeout: aws_cdk_lib_1.Duration.minutes(15),
|
|
151
169
|
});
|
|
@@ -159,31 +177,37 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
|
|
|
159
177
|
],
|
|
160
178
|
resources: ['*'],
|
|
161
179
|
}));
|
|
162
|
-
|
|
180
|
+
artifactBucket.grantReadWrite(isCompleteHandlerFunction);
|
|
163
181
|
encryptionKey.grantEncryptDecrypt(onEventHandlerFunction);
|
|
164
182
|
encryptionKey.grantEncryptDecrypt(isCompleteHandlerFunction);
|
|
165
183
|
this.ecrRepository.grantPullPush(onEventHandlerFunction);
|
|
166
184
|
this.ecrRepository.grantPullPush(isCompleteHandlerFunction);
|
|
167
|
-
// Create a custom resource provider
|
|
185
|
+
// Create a custom resource provider that uses the above Lambdas
|
|
168
186
|
const provider = new custom_resources_1.Provider(this, 'CustomResourceProvider', {
|
|
169
187
|
onEventHandler: onEventHandlerFunction,
|
|
170
188
|
isCompleteHandler: isCompleteHandlerFunction,
|
|
171
189
|
queryInterval: aws_cdk_lib_1.Duration.seconds(30),
|
|
172
190
|
});
|
|
173
|
-
//
|
|
191
|
+
// Custom Resource that triggers the CodeBuild and waits for completion
|
|
174
192
|
const buildTriggerResource = new aws_cdk_lib_1.CustomResource(this, 'BuildTriggerResource', {
|
|
175
193
|
serviceToken: provider.serviceToken,
|
|
176
194
|
properties: {
|
|
177
195
|
ProjectName: codeBuildProject.projectName,
|
|
196
|
+
ImageTag: imageTag,
|
|
178
197
|
Trigger: crypto.randomUUID(),
|
|
179
198
|
},
|
|
180
199
|
});
|
|
181
200
|
buildTriggerResource.node.addDependency(codeBuildProject);
|
|
182
|
-
|
|
183
|
-
|
|
201
|
+
// Retrieve the final Docker image tag from Data.ImageTag
|
|
202
|
+
// This creates a dependency on the Custom Resource...
|
|
203
|
+
const imageTagRef = buildTriggerResource.getAttString('ImageTag');
|
|
204
|
+
this.containerImage = aws_ecs_1.ContainerImage.fromEcrRepository(this.ecrRepository, imageTagRef);
|
|
205
|
+
this.dockerImageCode = aws_lambda_1.DockerImageCode.fromEcr(this.ecrRepository, {
|
|
206
|
+
tagOrDigest: imageTagRef,
|
|
207
|
+
});
|
|
184
208
|
}
|
|
185
209
|
}
|
|
186
210
|
exports.TokenInjectableDockerBuilder = TokenInjectableDockerBuilder;
|
|
187
211
|
_a = JSII_RTTI_SYMBOL_1;
|
|
188
|
-
TokenInjectableDockerBuilder[_a] = { fqn: "token-injectable-docker-builder.TokenInjectableDockerBuilder", version: "1.
|
|
189
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBaUM7QUFDakMsNkJBQTZCO0FBQzdCLDZDQUF1RDtBQUN2RCw2REFBd0Y7QUFFeEYsaURBQWtGO0FBQ2xGLGlEQUFxRDtBQUNyRCxpREFBc0Q7QUFDdEQsaURBQTBDO0FBQzFDLHVEQUFrRjtBQUNsRiw2REFBa0Q7QUFDbEQsbUVBQXdEO0FBQ3hELDJDQUF1QztBQXNHdkM7O0dBRUc7QUFDSCxNQUFhLDRCQUE2QixTQUFRLHNCQUFTO0lBS3pELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBd0M7UUFDaEYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLEVBQ0osSUFBSSxFQUFFLFVBQVUsRUFDaEIsU0FBUyxFQUNULG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsY0FBYyxFQUNkLGVBQWUsRUFDZixlQUFlLEVBQ2YsZ0JBQWdCLEdBQ2pCLEdBQUcsS0FBSyxDQUFDO1FBRVYsc0NBQXNDO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBRyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUN0RCxpQkFBaUIsRUFBRSxJQUFJO1NBQ3hCLENBQUMsQ0FBQztRQUVILHdGQUF3RjtRQUN4RixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksb0JBQVUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ3pELGNBQWMsRUFBRTtnQkFDZDtvQkFDRSxZQUFZLEVBQUUsQ0FBQztvQkFDZixXQUFXLEVBQUUsb0NBQW9DO29CQUNqRCxTQUFTLEVBQUUsbUJBQVMsQ0FBQyxRQUFRO29CQUM3QixXQUFXLEVBQUUsc0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2lCQUM5QjthQUNGO1lBQ0QsVUFBVSxFQUFFLDhCQUFvQixDQUFDLEdBQUc7WUFDcEMsYUFBYSxFQUFFLGFB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LGdCQUFnQixDQUFDLFdBQVc7Z0JBQ3pDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFO2FBQzdCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxjQUFjLEdBQUcsd0JBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLGVBQWUsR0FBRyw0QkFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDckUsQ0FBQzs7QUE3TUgsb0VBOE1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgUHJvamVjdCwgU291cmNlLCBMaW51eEJ1aWxkSW1hZ2UsIEJ1aWxkU3BlYyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0IHsgSVZwYywgSVNlY3VyaXR5R3JvdXAsIFN1Ym5ldFNlbGVjdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSwgUmVwb3NpdG9yeUVuY3J5cHRpb24sIFRhZ1N0YXR1cyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xuaW1wb3J0IHsgQ29udGFpbmVySW1hZ2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgS2V5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgeyBSdW50aW1lLCBDb2RlLCBEb2NrZXJJbWFnZUNvZGUsIEZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBgVG9rZW5JbmplY3RhYmxlRG9ja2VyQnVpbGRlcmAgY29uc3RydWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuSW5qZWN0YWJsZURvY2tlckJ1aWxkZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIERvY2tlcmZpbGUgb3Igc291cmNlIGNvZGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBEb2NrZXIgYnVpbGQgcHJvY2Vzcy5cbiAgICogVGhlc2UgYXJlIHRyYW5zZm9ybWVkIGludG8gYC0tYnVpbGQtYXJnYCBmbGFncy5cbiAgICogQGV4YW1wbGVcbiAgICoge1xuICAgKiAgIFRPS0VOOiAnbXktc2VjcmV0LXRva2VuJyxcbiAgICogICBFTlY6ICdwcm9kdWN0aW9uJ1xuICAgKiB9XG4gICAqL1xuICByZWFkb25seSBidWlsZEFyZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBBV1MgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIERvY2tlciBsb2dpbiBjcmVkZW50aWFscy5cbiAgICogVGhpcyBzZWNyZXQgc2hvdWxkIHN0b3JlIGEgSlNPTiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAgICogYGBganNvblxuICAgKiB7XG4gICAqICAgXCJ1c2VybmFtZVwiOiBcIm15LWRvY2tlci11c2VybmFtZVwiLFxuICAgKiAgIFwicGFzc3dvcmRcIjogXCJteS1kb2NrZXItcGFzc3dvcmRcIlxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3Qgd2lsbCBza2lwIERvY2tlciBsb2dpbiBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuXG4gICAqXG4gICAqIEBleGFtcGxlICdhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6c2VjcmV0OkRvY2tlckxvZ2luU2VjcmV0J1xuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyTG9naW5TZWNyZXRBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgaW4gd2hpY2ggdGhlIENvZGVCdWlsZCBwcm9qZWN0IHdpbGwgYmUgZGVwbG95ZWQuXG4gICAqIElmIHByb3ZpZGVkLCB0aGUgQ29kZUJ1aWxkIHByb2plY3Qgd2lsbCBiZSBsYXVuY2hlZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBWUEMuXG4gICAqIEBkZWZhdWx0IE5vIFZQQyBpcyBhdHRhY2hlZCwgYW5kIHRoZSBDb2RlQnVpbGQgcHJvamVjdCB3aWxsIHVzZSBwdWJsaWMgaW50ZXJuZXQuXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBJVnBjO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VjdXJpdHkgZ3JvdXBzIHRvIGF0dGFjaCB0byB0aGUgQ29kZUJ1aWxkIHByb2plY3QuXG4gICAqIFRoZXNlIHNob3VsZCBkZWZpbmUgdGhlIG5ldHdvcmsgYWNjZXNzIHJ1bGVzIGZvciB0aGUgQ29kZUJ1aWxkIHByb2plY3QuXG4gICAqIEBkZWZhdWx0IE5vIHNlY3VyaXR5IGdyb3VwcyBhcmUgYXR0YWNoZWQuXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IElTZWN1cml0eUdyb3VwW107XG5cbiAgLyoqXG4gICAqIFRoZSBzdWJuZXQgc2VsZWN0aW9uIHRvIHNwZWNpZnkgd2hpY2ggc3VibmV0cyB0byB1c2Ugd2l0aGluIHRoZSBWUEMuXG4gICAqIEFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QgcHJpdmF0ZSwgcHVibGljLCBvciBpc29sYXRlZCBzdWJuZXRzLlxuICAgKiBAZGVmYXVsdCBBbGwgc3VibmV0cyBpbiB0aGUgVlBDIGFyZSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0U2VsZWN0aW9uPzogU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gY29tbWFuZHMgdG8gcnVuIGR1cmluZyB0aGUgaW5zdGFsbCBwaGFzZS5cbiAgICpcbiAgICogKipFeGFtcGxlIFVzYWdlOioqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IFRva2VuSW5qZWN0YWJsZURvY2tlckJ1aWxkZXIodGhpcywgJ015RG9ja2VyQnVpbGRlcicsIHtcbiAgICogICBwYXRoOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4vYXBwJyksXG4gICAqICAgaW5zdGFsbENvbW1hbmRzOiBbXG4gICAqICAgICAnZWNobyBcIlVwZGF0aW5nIHBhY2thZ2UgbGlzdHMuLi5cIicsXG4gICAqICAgICAnYXB0LWdldCB1cGRhdGUgLXknLFxuICAgKiAgICAgJ2VjaG8gXCJJbnN0YWxsaW5nIHJlcXVpcmVkIHBhY2thZ2VzLi4uXCInLFxuICAgKiAgICAgJ2FwdC1nZXQgaW5zdGFsbCAteSBjdXJsIGRuc3V0aWxzJyxcbiAgICogICBdLFxuICAgKiAgIC8vIC4uLiBvdGhlciBwcm9wZXJ0aWVzIC4uLlxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqICpUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBpbnN0YWxsIHRoZSBgY3VybGAgYW5kIGBkbnN1dGlsc2AgcGFja2FnZXMgZHVyaW5nIHRoZSBpbnN0YWxsIHBoYXNlIHVzaW5nIGBhcHQtZ2V0YCwgdGhlIHBhY2thZ2UgbWFuYWdlciBmb3IgVWJ1bnR1LWJhc2VkIENvZGVCdWlsZCBlbnZpcm9ubWVudHMuKlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGFkZGl0aW9uYWwgaW5zdGFsbCBjb21tYW5kcy5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbGxDb21tYW5kcz86IHN0cmluZ1tdO1xuXG5cbiAgLyoqXG4gICAqIEN1c3RvbSBjb21tYW5kcyB0byBydW4gZHVyaW5nIHRoZSBwcmVfYnVpbGQgcGhhc2UuXG4gICAqXG4gICAqICoqRXhhbXBsZSBVc2FnZToqKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBUb2tlbkluamVjdGFibGVEb2NrZXJCdWlsZGVyKHRoaXMsICdNeURvY2tlckJ1aWxkZXInLCB7XG4gICAqICAgcGF0aDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uL2FwcCcpLFxuICAgKiAgIHByZUJ1aWxkQ29tbWFuZHM6IFtcbiAgICogICAgICdlY2hvIFwiRmV0Y2hpbmcgY29uZmlndXJhdGlvbiBmcm9tIHByaXZhdGUgQVBJLi4uXCInLFxuICAgKiAgICAgJ2N1cmwgLW8gY29uZmlnLmpzb24gaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vY29uZmlnJyxcbiAgICogICBdLFxuICAgKiAgIC8vIC4uLiBvdGhlciBwcm9wZXJ0aWVzIC4uLlxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqICpJbiB0aGlzIGV4YW1wbGUsIHRoZSBidWlsZGVyIGZldGNoZXMgYSBjb25maWd1cmF0aW9uIGZpbGUgZnJvbSBhIHByaXZhdGUgQVBJIGJlZm9yZSBzdGFydGluZyB0aGUgRG9ja2VyIGJ1aWxkLiBUaGlzIGNvbmZpZyBmaWxlIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB5b3VyIERvY2tlcmZpbGUgZHVyaW5nIENESyBkZXBsb3ltZW50LipcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBhZGRpdGlvbmFsIHByZS1idWlsZCBjb21tYW5kcy5cbiAgICovXG4gIHJlYWRvbmx5IHByZUJ1aWxkQ29tbWFuZHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIENESyBjb25zdHJ1Y3QgdG8gYnVpbGQgYW5kIHB1c2ggRG9ja2VyIGltYWdlcyB0byBhbiBFQ1IgcmVwb3NpdG9yeSB1c2luZyBDb2RlQnVpbGQgYW5kIExhbWJkYSBjdXN0b20gcmVzb3VyY2VzLlxuICovXG5leHBvcnQgY2xhc3MgVG9rZW5JbmplY3RhYmxlRG9ja2VyQnVpbGRlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWNyUmVwb3NpdG9yeTogUmVwb3NpdG9yeTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lckltYWdlOiBDb250YWluZXJJbWFnZTtcbiAgcHVibGljIHJlYWRvbmx5IGRvY2tlckltYWdlQ29kZTogRG9ja2VySW1hZ2VDb2RlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUb2tlbkluamVjdGFibGVEb2NrZXJCdWlsZGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3Qge1xuICAgICAgcGF0aDogc291cmNlUGF0aCxcbiAgICAgIGJ1aWxkQXJncyxcbiAgICAgIGRvY2tlckxvZ2luU2VjcmV0QXJuLFxuICAgICAgdnBjLFxuICAgICAgc2VjdXJpdHlHcm91cHMsXG4gICAgICBzdWJuZXRTZWxlY3Rpb24sXG4gICAgICBpbnN0YWxsQ29tbWFuZHMsXG4gICAgICBwcmVCdWlsZENvbW1hbmRzLFxuICAgIH0gPSBwcm9wcztcblxuICAgIC8vIERlZmluZSBhIEtNUyBrZXkgZm9yIEVDUiBlbmNyeXB0aW9uXG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IG5ldyBLZXkodGhpcywgJ0VjckVuY3J5cHRpb25LZXknLCB7XG4gICAgICBlbmFibGVLZXlSb3RhdGlvbjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBhbiBFQ1IgcmVwb3NpdG9yeSB3aXRoIGxpZmVjeWNsZSBydWxlcywgZW5jcnlwdGlvbiwgYW5kIGltYWdlIHNjYW5uaW5nIGVuYWJsZWRcbiAgICB0aGlzLmVjclJlcG9zaXRvcnkgPSBuZXcgUmVwb3NpdG9yeSh0aGlzLCAnRUNSUmVwb3NpdG9yeScsIHtcbiAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBydWxlUHJpb3JpdHk6IDEsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdSZW1vdmUgdW50YWdnZWQgaW1hZ2VzIGFmdGVyIDEgZGF5JyxcbiAgICAgICAgICB0YWdTdGF0dXM6IFRhZ1N0YXR1cy5VTlRBR0dFRCxcbiAgICAgICAgICBtYXhJbWFnZUFnZTogRHVyYXRpb24uZGF5cygxKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBlbmNyeXB0aW9uOiBSZXBvc2l0b3J5RW5jcnlwdGlvbi5LTVMsXG4gICAgICBlbmNyeXB0aW9uS2V5OiBlbmNyeXB0aW9uS2V5LFxuICAgICAgaW1hZ2VTY2FuT25QdXNoOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gUGFja2FnZSB0aGUgc291cmNlIGNvZGUgYXMgYW4gYXNzZXRcbiAgICBjb25zdCBzb3VyY2VBc3NldCA9IG5ldyBBc3NldCh0aGlzLCAnU291cmNlQXNzZXQnLCB7XG4gICAgICBwYXRoOiBzb3VyY2VQYXRoLFxuICAgIH0pO1xuXG4gICAgLy8gVHJhbnNmb3JtIGJ1aWxkQXJncyBpbnRvIGEgc3RyaW5nIG9mIC0tYnVpbGQtYXJnIEtFWT1WQUxVRVxuICAgIGNvbnN0IGJ1aWxkQXJnc1N0cmluZyA9IGJ1aWxkQXJnc1xuICAgICAgPyBPYmplY3QuZW50cmllcyhidWlsZEFyZ3MpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYC0tYnVpbGQtYXJnICR7a2V5fT0ke3ZhbHVlfWApXG4gICAgICAgIC5qb2luKCcgJylcbiAgICAgIDogJyc7XG5cbiAgICAvLyBDb25kaXRpb25hbCBEb2NrZXJodWIgbG9naW4gY29tbWFuZHNcbiAgICBjb25zdCBkb2NrZXJMb2dpbkNvbW1hbmRzID0gZG9ja2VyTG9naW5TZWNyZXRBcm5cbiAgICAgID8gW1xuICAgICAgICAnZWNobyBcIlJldHJpZXZpbmcgRG9ja2VyIGNyZWRlbnRpYWxzIGZyb20gU2VjcmV0cyBNYW5hZ2VyLi4uXCInLFxuICAgICAgICBgRE9DS0VSX1VTRVJOQU1FPSQoYXdzIHNlY3JldHNtYW5hZ2VyIGdldC1zZWNyZXQtdmFsdWUgLS1zZWNyZXQtaWQgJHtkb2NrZXJMb2dpblNlY3JldEFybn0gLS1xdWVyeSBTZWNyZXRTdHJpbmcgLS1vdXRwdXQgdGV4dCB8IGpxIC1yIC51c2VybmFtZSlgLFxuICAgICAgICBgRE9DS0VSX1BBU1NXT1JEPSQoYXdzIHNlY3JldHNtYW5hZ2VyIGdldC1zZWNyZXQtdmFsdWUgLS1zZWNyZXQtaWQgJHtkb2NrZXJMb2dpblNlY3JldEFybn0gLS1xdWVyeSBTZWNyZXRTdHJpbmcgLS1vdXRwdXQgdGV4dCB8IGpxIC1yIC5wYXNzd29yZClgLFxuICAgICAgICAnZWNobyBcIkxvZ2dpbmcgaW4gdG8gRG9ja2VyLi4uXCInLFxuICAgICAgICAnZWNobyAkRE9DS0VSX1BBU1NXT1JEIHwgZG9ja2VyIGxvZ2luIC0tdXNlcm5hbWUgJERPQ0tFUl9VU0VSTkFNRSAtLXBhc3N3b3JkLXN0ZGluJyxcbiAgICAgIF1cbiAgICAgIDogWydlY2hvIFwiTm8gRG9ja2VyIGNyZWRlbnRpYWxzIHByb3ZpZGVkLiBTa2lwcGluZyBsb2dpbiBzdGVwLlwiJ107XG5cbiAgICAvLyBDcmVhdGUgYSBDb2RlQnVpbGQgcHJvamVjdFxuICAgIGNvbnN0IGNvZGVCdWlsZFByb2plY3QgPSBuZXcgUHJvamVjdCh0aGlzLCAnVUlDb2RlQnVpbGRQcm9qZWN0Jywge1xuICAgICAgc291cmNlOiBTb3VyY2UuczMoe1xuICAgICAgICBidWNrZXQ6IHNvdXJjZUFzc2V0LmJ1Y2tldCxcbiAgICAgICAgcGF0aDogc291cmNlQXNzZXQuczNPYmplY3RLZXksXG4gICAgICB9KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIGJ1aWxkSW1hZ2U6IExpbnV4QnVpbGRJbWFnZS5TVEFOREFSRF83XzAsXG4gICAgICAgIHByaXZpbGVnZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHtcbiAgICAgICAgRUNSX1JFUE9fVVJJOiB7IHZhbHVlOiB0aGlzLmVjclJlcG9zaXRvcnkucmVwb3NpdG9yeVVyaSB9LFxuICAgICAgICBCVUlMRF9BUkdTOiB7IHZhbHVlOiBidWlsZEFyZ3NTdHJpbmcgfSxcbiAgICAgICAgLy8gSW5jbHVkZSBidWlsZCBhcmd1bWVudHMgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGlmIG5lZWRlZFxuICAgICAgICAuLi4oYnVpbGRBcmdzICYmXG4gICAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoYnVpbGRBcmdzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgeyB2YWx1ZSB9XSksXG4gICAgICAgICAgKSksXG4gICAgICB9LFxuICAgICAgdnBjLFxuICAgICAgc2VjdXJpdHlHcm91cHMsXG4gICAgICBzdWJuZXRTZWxlY3Rpb24sXG4gICAgICBidWlsZFNwZWM6IEJ1aWxkU3BlYy5mcm9tT2JqZWN0KHtcbiAgICAgICAgdmVyc2lvbjogJzAuMicsXG4gICAgICAgIHBoYXNlczoge1xuICAgICAgICAgIGluc3RhbGw6IHtcbiAgICAgICAgICAgIGNvbW1hbmRzOiBbXG4gICAgICAgICAgICAgICdlY2hvIFwiQmVnaW5uaW5nIGluc3RhbGwgcGhhc2UuLi5cIicsXG4gICAgICAgICAgICAgIC4uLihpbnN0YWxsQ29tbWFuZHMgfHwgW10pLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByZV9idWlsZDoge1xuICAgICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICAgLi4uKHByZUJ1aWxkQ29tbWFuZHMgfHwgW10pLFxuICAgICAgICAgICAgICAuLi5kb2NrZXJMb2dpbkNvbW1hbmRzLFxuICAgICAgICAgICAgICAnZWNobyBcIlJldHJpZXZpbmcgQVdTIEFjY291bnQgSUQuLi5cIicsXG4gICAgICAgICAgICAgICdleHBvcnQgQUNDT1VOVF9JRD0kKGF3cyBzdHMgZ2V0LWNhbGxlci1pZGVudGl0eSAtLXF1ZXJ5IEFjY291bnQgLS1vdXRwdXQgdGV4dCknLFxuICAgICAgICAgICAgICAnZWNobyBcIkxvZ2dpbmcgaW4gdG8gQW1hem9uIEVDUi4uLlwiJyxcbiAgICAgICAgICAgICAgJ2F3cyBlY3IgZ2V0LWxvZ2luLXBhc3N3b3JkIC0tcmVnaW9uICRBV1NfREVGQVVMVF9SRUdJT04gfCBkb2NrZXIgbG9naW4gLS11c2VybmFtZSBBV1MgLS1wYXNzd29yZC1zdGRpbiAkQUNDT1VOVF9JRC5ka3IuZWNyLiRBV1NfREVGQVVMVF9SRUdJT04uYW1hem9uYXdzLmNvbScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYnVpbGQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmRzOiBbXG4gICAgICAgICAgICAgICdlY2hvIEJ1aWxkIHBoYXNlOiBCdWlsZGluZyB0aGUgRG9ja2VyIGltYWdlLi4uJyxcbiAgICAgICAgICAgICAgJ2RvY2tlciBidWlsZCAkQlVJTERfQVJHUyAtdCAkRUNSX1JFUE9fVVJJOmxhdGVzdCAkQ09ERUJVSUxEX1NSQ19ESVInLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBvc3RfYnVpbGQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmRzOiBbXG4gICAgICAgICAgICAgICdlY2hvIFBvc3QtYnVpbGQgcGhhc2U6IFB1c2hpbmcgdGhlIERvY2tlciBpbWFnZS4uLicsXG4gICAgICAgICAgICAgICdkb2NrZXIgcHVzaCAkRUNSX1JFUE9fVVJJOmxhdGVzdCcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIC8vIEdyYW50IHBlcm1pc3Npb25zIHRvIENvZGVCdWlsZFxuICAgIHRoaXMuZWNyUmVwb3NpdG9yeS5ncmFudFB1bGxQdXNoKGNvZGVCdWlsZFByb2plY3QpO1xuXG4gICAgY29kZUJ1aWxkUHJvamVjdC5yb2xlIS5hZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2VjcjpHZXRBdXRob3JpemF0aW9uVG9rZW4nLFxuICAgICAgICAgICdlY3I6R2V0RG93bmxvYWRVcmxGb3JMYXllcicsXG4gICAgICAgICAgJ2VjcjpCYXRjaENoZWNrTGF5ZXJBdmFpbGFiaWxpdHknLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmVjclJlcG9zaXRvcnkucmVwb3NpdG9yeUFybl0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgaWYgKGRvY2tlckxvZ2luU2VjcmV0QXJuKSB7XG4gICAgICBjb2RlQnVpbGRQcm9qZWN0LnJvbGUhLmFkZFRvUHJpbmNpcGFsUG9saWN5KFxuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ3NlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbZG9ja2VyTG9naW5TZWNyZXRBcm5dLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gR3JhbnQgQ29kZUJ1aWxkIGFjY2VzcyB0byB0aGUgS01TIGtleVxuICAgIGVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChjb2RlQnVpbGRQcm9qZWN0LnJvbGUhKTtcblxuICAgIC8vIENyZWF0ZSBMYW1iZGEgZnVuY3Rpb25zIGZvciBvbkV2ZW50IGFuZCBpc0NvbXBsZXRlIGhhbmRsZXJzXG4gICAgY29uc3Qgb25FdmVudEhhbmRsZXJGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnT25FdmVudEhhbmRsZXJGdW5jdGlvbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4vb25FdmVudCcpKSxcbiAgICAgIGhhbmRsZXI6ICdvbkV2ZW50LmhhbmRsZXInLFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxNSksXG4gICAgfSk7XG5cbiAgICBvbkV2ZW50SGFuZGxlckZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbJ2NvZGVidWlsZDpTdGFydEJ1aWxkJ10sXG4gICAgICAgIHJlc291cmNlczogW2NvZGVCdWlsZFByb2plY3QucHJvamVjdEFybl0sIC8vIFJlc3RyaWN0IHRvIHNwZWNpZmljIHByb2plY3RcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBpc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdJc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMThfWCxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLi9pc0NvbXBsZXRlJykpLFxuICAgICAgaGFuZGxlcjogJ2lzQ29tcGxldGUuaGFuZGxlcicsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICB9KTtcblxuICAgIGlzQ29tcGxldGVIYW5kbGVyRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnY29kZWJ1aWxkOkJhdGNoR2V0QnVpbGRzJyxcbiAgICAgICAgICAnY29kZWJ1aWxkOkxpc3RCdWlsZHNGb3JQcm9qZWN0JyxcbiAgICAgICAgICAnbG9nczpHZXRMb2dFdmVudHMnLFxuICAgICAgICAgICdsb2dzOkRlc2NyaWJlTG9nU3RyZWFtcycsXG4gICAgICAgICAgJ2xvZ3M6RGVzY3JpYmVMb2dHcm91cHMnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEdyYW50IExhbWJkYSBmdW5jdGlvbnMgYWNjZXNzIHRvIEtNUyBrZXkgYW5kIEVDUlxuICAgIGVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChvbkV2ZW50SGFuZGxlckZ1bmN0aW9uKTtcbiAgICBlbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQoaXNDb21wbGV0ZUhhbmRsZXJGdW5jdGlvbik7XG4gICAgdGhpcy5lY3JSZXBvc2l0b3J5LmdyYW50UHVsbFB1c2gob25FdmVudEhhbmRsZXJGdW5jdGlvbik7XG4gICAgdGhpcy5lY3JSZXBvc2l0b3J5LmdyYW50UHVsbFB1c2goaXNDb21wbGV0ZUhhbmRsZXJGdW5jdGlvbik7XG5cbiAgICAvLyBDcmVhdGUgYSBjdXN0b20gcmVzb3VyY2UgcHJvdmlkZXJcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCAnQ3VzdG9tUmVzb3VyY2VQcm92aWRlcicsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBvbkV2ZW50SGFuZGxlckZ1bmN0aW9uLFxuICAgICAgaXNDb21wbGV0ZUhhbmRsZXI6IGlzQ29tcGxldGVIYW5kbGVyRnVuY3Rpb24sXG4gICAgICBxdWVyeUludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICB9KTtcblxuICAgIC8vIERlZmluZSB0aGUgY3VzdG9tIHJlc291cmNlXG4gICAgY29uc3QgYnVpbGRUcmlnZ2VyUmVzb3VyY2UgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ0J1aWxkVHJpZ2dlclJlc291cmNlJywge1xuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFByb2plY3ROYW1lOiBjb2RlQnVpbGRQcm9qZWN0LnByb2plY3ROYW1lLFxuICAgICAgICBUcmlnZ2VyOiBjcnlwdG8ucmFuZG9tVVVJRCgpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGJ1aWxkVHJpZ2dlclJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShjb2RlQnVpbGRQcm9qZWN0KTtcbiAgICB0aGlzLmNvbnRhaW5lckltYWdlID0gQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkodGhpcy5lY3JSZXBvc2l0b3J5KTtcbiAgICB0aGlzLmRvY2tlckltYWdlQ29kZSA9IERvY2tlckltYWdlQ29kZS5mcm9tRWNyKHRoaXMuZWNyUmVwb3NpdG9yeSk7XG4gIH1cbn1cbiJdfQ==
|
|
212
|
+
TokenInjectableDockerBuilder[_a] = { fqn: "token-injectable-docker-builder.TokenInjectableDockerBuilder", version: "1.3.1" };
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBaUM7QUFDakMsNkJBQTZCO0FBQzdCLDZDQUFzRTtBQUN0RSw2REFBd0Y7QUFFeEYsaURBQWtGO0FBQ2xGLGlEQUFxRDtBQUNyRCxpREFBc0Q7QUFDdEQsaURBQTBDO0FBQzFDLHVEQUFrRjtBQUNsRiwrQ0FBK0Q7QUFDL0QsNkRBQWtEO0FBQ2xELG1FQUF3RDtBQUN4RCwyQ0FBdUM7QUE4RnZDOzs7O0dBSUc7QUFDSCxNQUFhLDRCQUE2QixTQUFRLHNCQUFTO0lBa0J6RDs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXdDO1FBQ2hGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxFQUNKLElBQUksRUFBRSxVQUFVLEVBQ2hCLFNBQVMsRUFDVCxvQkFBb0IsRUFDcEIsR0FBRyxFQUNILGNBQWMsRUFDZCxlQUFlLEVBQ2YsZUFBZSxFQUNmLGdCQUFnQixHQUNqQixHQUFHLEtBQUssQ0FBQztRQUVWLDBDQUEwQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFckMsc0NBQXNDO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBRyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUN0RCxpQkFBaUIsRUFBRSxJQUFJO1NBQ3hCLENBQUMsQ0FBQztRQUVILGdGQUFnRjtRQUNoRixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksb0JBQVUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ3pELGNBQWMsRUFBRTtnQkFDZDtvQkFDRSxZQUFZLEVBQUUsQ0FBQztvQkFDZixXQUFXLEVBQUUsb0NBQW9DO29CQUNqRCxTQUFTLEVBQUUsbUJBQVMsQ0FBQyxRQUFRO29CQUM3QixXQUFXLEVBQUUsc0JB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QUNwQyxDQUFDLENBQUM7UUFFSCx1RUFBdUU7UUFDdkUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLDRCQUFjLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQzVFLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtZQUNuQyxVQUFVLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFdBQVc7Z0JBQ3pDLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTthQUM3QjtTQUNGLENBQUMsQ0FBQztRQUNILG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUxRCx5REFBeUQ7UUFDekQsc0RBQXNEO1FBQ3RELE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsY0FBYyxHQUFHLHdCQUFjLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsZUFBZSxHQUFHLDRCQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDakUsV0FBVyxFQUFFLFdBQVc7U0FDekIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFyT0gsb0VBc09DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uLCBSZW1vdmFsUG9saWN5IH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgUHJvamVjdCwgU291cmNlLCBMaW51eEJ1aWxkSW1hZ2UsIEJ1aWxkU3BlYyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0IHsgSVZwYywgSVNlY3VyaXR5R3JvdXAsIFN1Ym5ldFNlbGVjdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSwgUmVwb3NpdG9yeUVuY3J5cHRpb24sIFRhZ1N0YXR1cyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xuaW1wb3J0IHsgQ29udGFpbmVySW1hZ2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgS2V5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgeyBSdW50aW1lLCBDb2RlLCBEb2NrZXJJbWFnZUNvZGUsIEZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBCdWNrZXQsIEJsb2NrUHVibGljQWNjZXNzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIGBUb2tlbkluamVjdGFibGVEb2NrZXJCdWlsZGVyYCBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5JbmplY3RhYmxlRG9ja2VyQnVpbGRlclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgRG9ja2VyZmlsZSBvciBzb3VyY2UgY29kZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQnVpbGQgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIERvY2tlciBidWlsZCBwcm9jZXNzLlxuICAgKiBUaGVzZSBhcmUgdHJhbnNmb3JtZWQgaW50byBgLS1idWlsZC1hcmcgS0VZPVZBTFVFYCBmbGFncy5cbiAgICogQGV4YW1wbGVcbiAgICoge1xuICAgKiAgIFRPS0VOOiAnbXktc2VjcmV0LXRva2VuJyxcbiAgICogICBFTlY6ICdwcm9kdWN0aW9uJ1xuICAgKiB9XG4gICAqL1xuICByZWFkb25seSBidWlsZEFyZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBBV1MgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIERvY2tlciBsb2dpbiBjcmVkZW50aWFscy5cbiAgICogVGhpcyBzZWNyZXQgc2hvdWxkIHN0b3JlIGEgSlNPTiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAgICogYGBganNvblxuICAgKiB7XG4gICAqICAgXCJ1c2VybmFtZVwiOiBcIm15LWRvY2tlci11c2VybmFtZVwiLFxuICAgKiAgIFwicGFzc3dvcmRcIjogXCJteS1kb2NrZXItcGFzc3dvcmRcIlxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBJZiBub3QgcHJvdmlkZWQgKG9yIG5vdCBuZWVkZWQpLCB0aGUgY29uc3RydWN0IHdpbGwgc2tpcCBEb2NrZXIgSHViIGxvZ2luLlxuICAgKlxuICAgKiAqKk5vdGUqKjogVGhlIHNlY3JldCBtdXN0IGJlIGluIHRoZSBzYW1lIHJlZ2lvbiBhcyB0aGUgc3RhY2suXG4gICAqXG4gICAqIEBleGFtcGxlICdhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6c2VjcmV0OkRvY2tlckxvZ2luU2VjcmV0J1xuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyTG9naW5TZWNyZXRBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgaW4gd2hpY2ggdGhlIENvZGVCdWlsZCBwcm9qZWN0IHdpbGwgYmUgZGVwbG95ZWQuXG4gICAqIElmIHByb3ZpZGVkLCB0aGUgQ29kZUJ1aWxkIHByb2plY3Qgd2lsbCBiZSBsYXVuY2hlZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBWUEMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gVlBDIGlzIGF0dGFjaGVkLCBhbmQgdGhlIENvZGVCdWlsZCBwcm9qZWN0IHdpbGwgdXNlIHB1YmxpYyBpbnRlcm5ldC5cbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IElWcGM7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWN1cml0eSBncm91cHMgdG8gYXR0YWNoIHRvIHRoZSBDb2RlQnVpbGQgcHJvamVjdC5cbiAgICogVGhlc2UgZGVmaW5lIHRoZSBuZXR3b3JrIGFjY2VzcyBydWxlcyBmb3IgdGhlIENvZGVCdWlsZCBwcm9qZWN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHNlY3VyaXR5IGdyb3VwcyBhcmUgYXR0YWNoZWQuXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IElTZWN1cml0eUdyb3VwW107XG5cbiAgLyoqXG4gICAqIFRoZSBzdWJuZXQgc2VsZWN0aW9uIHRvIHNwZWNpZnkgd2hpY2ggc3VibmV0cyB0byB1c2Ugd2l0aGluIHRoZSBWUEMuXG4gICAqIEFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QgcHJpdmF0ZSwgcHVibGljLCBvciBpc29sYXRlZCBzdWJuZXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEFsbCBzdWJuZXRzIGluIHRoZSBWUEMgYXJlIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRTZWxlY3Rpb24/OiBTdWJuZXRTZWxlY3Rpb247XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBjb21tYW5kcyB0byBydW4gZHVyaW5nIHRoZSBpbnN0YWxsIHBoYXNlIG9mIENvZGVCdWlsZC5cbiAgICpcbiAgICogKipFeGFtcGxlKio6XG4gICAqIGBgYHRzXG4gICAqIGluc3RhbGxDb21tYW5kczogW1xuICAgKiAgICdlY2hvIFwiVXBkYXRpbmcgcGFja2FnZSBsaXN0cy4uLlwiJyxcbiAgICogICAnYXB0LWdldCB1cGRhdGUgLXknLFxuICAgKiAgICdlY2hvIFwiSW5zdGFsbGluZyByZXF1aXJlZCBwYWNrYWdlcy4uLlwiJyxcbiAgICogICAnYXB0LWdldCBpbnN0YWxsIC15IGN1cmwgZG5zdXRpbHMnLFxuICAgKiBdLFxuICAgKiBgYGBcbiAgICogQGRlZmF1bHQgLSBObyBhZGRpdGlvbmFsIGluc3RhbGwgY29tbWFuZHMuXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsQ29tbWFuZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ3VzdG9tIGNvbW1hbmRzIHRvIHJ1biBkdXJpbmcgdGhlIHByZV9idWlsZCBwaGFzZSBvZiBDb2RlQnVpbGQuXG4gICAqXG4gICAqICoqRXhhbXBsZSoqOlxuICAgKiBgYGB0c1xuICAgKiBwcmVCdWlsZENvbW1hbmRzOiBbXG4gICAqICAgJ2VjaG8gXCJGZXRjaGluZyBjb25maWd1cmF0aW9uIGZyb20gcHJpdmF0ZSBBUEkuLi5cIicsXG4gICAqICAgJ2N1cmwgLW8gY29uZmlnLmpzb24gaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vY29uZmlnJyxcbiAgICogXSxcbiAgICogYGBgXG4gICAqIEBkZWZhdWx0IC0gTm8gYWRkaXRpb25hbCBwcmUtYnVpbGQgY29tbWFuZHMuXG4gICAqL1xuICByZWFkb25seSBwcmVCdWlsZENvbW1hbmRzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBDREsgY29uc3RydWN0IHRvIGJ1aWxkIGFuZCBwdXNoIERvY2tlciBpbWFnZXMgdG8gYW4gRUNSIHJlcG9zaXRvcnkgdXNpbmdcbiAqIENvZGVCdWlsZCBhbmQgTGFtYmRhIGN1c3RvbSByZXNvdXJjZXMsICoqdGhlbioqIHJldHJpZXZlIHRoZSBmaW5hbCBpbWFnZSB0YWdcbiAqIHNvIHRoYXQgRUNTL0xhbWJkYSByZWZlcmVuY2VzIHVzZSB0aGUgZXhhY3QgZGlnZXN0LlxuICovXG5leHBvcnQgY2xhc3MgVG9rZW5JbmplY3RhYmxlRG9ja2VyQnVpbGRlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgRUNSIHJlcG9zaXRvcnkgdGhhdCBzdG9yZXMgdGhlIHJlc3VsdGluZyBEb2NrZXIgaW1hZ2UuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVjclJlcG9zaXRvcnk6IFJlcG9zaXRvcnk7XG5cbiAgLyoqXG4gICAqIEFuIEVDUy1jb21wYXRpYmxlIGNvbnRhaW5lciBpbWFnZSByZWZlcmVuY2luZyB0aGUgdGFnXG4gICAqIG9mIHRoZSBidWlsdCBEb2NrZXIgaW1hZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVySW1hZ2U6IENvbnRhaW5lckltYWdlO1xuXG4gIC8qKlxuICAgKiBBIExhbWJkYS1jb21wYXRpYmxlIERvY2tlckltYWdlQ29kZSByZWZlcmVuY2luZyB0aGUgdGhlIHRhZ1xuICAgKiBvZiB0aGUgYnVpbHQgRG9ja2VyIGltYWdlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvY2tlckltYWdlQ29kZTogRG9ja2VySW1hZ2VDb2RlO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGBUb2tlbkluamVjdGFibGVEb2NrZXJCdWlsZGVyYC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3QuXG4gICAqIEBwYXJhbSBpZCBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC5cbiAgICogQHBhcmFtIHByb3BzIENvbmZpZ3VyYXRpb24gZm9yIGJ1aWxkaW5nIGFuZCBwdXNoaW5nIHRoZSBEb2NrZXIgaW1hZ2UuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVG9rZW5JbmplY3RhYmxlRG9ja2VyQnVpbGRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHBhdGg6IHNvdXJjZVBhdGgsXG4gICAgICBidWlsZEFyZ3MsXG4gICAgICBkb2NrZXJMb2dpblNlY3JldEFybixcbiAgICAgIHZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBzLFxuICAgICAgc3VibmV0U2VsZWN0aW9uLFxuICAgICAgaW5zdGFsbENvbW1hbmRzLFxuICAgICAgcHJlQnVpbGRDb21tYW5kcyxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICAvLyBHZW5lcmF0ZSBhbiBlcGhlbWVyYWwgdGFnIGZvciBDb2RlQnVpbGRcbiAgICBjb25zdCBpbWFnZVRhZyA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG5cbiAgICAvLyBEZWZpbmUgYSBLTVMga2V5IGZvciBFQ1IgZW5jcnlwdGlvblxuICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBuZXcgS2V5KHRoaXMsICdFY3JFbmNyeXB0aW9uS2V5Jywge1xuICAgICAgZW5hYmxlS2V5Um90YXRpb246IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgYW4gRUNSIHJlcG9zaXRvcnkgd2l0aCBlbmNyeXB0aW9uLCBsaWZlY3ljbGUgcnVsZXMsIGFuZCBpbWFnZSBzY2FubmluZ1xuICAgIHRoaXMuZWNyUmVwb3NpdG9yeSA9IG5ldyBSZXBvc2l0b3J5KHRoaXMsICdFQ1JSZXBvc2l0b3J5Jywge1xuICAgICAgbGlmZWN5Y2xlUnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHJ1bGVQcmlvcml0eTogMSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1JlbW92ZSB1bnRhZ2dlZCBpbWFnZXMgYWZ0ZXIgMSBkYXknLFxuICAgICAgICAgIHRhZ1N0YXR1czogVGFnU3RhdHVzLlVOVEFHR0VELFxuICAgICAgICAgIG1heEltYWdlQWdlOiBEdXJhdGlvbi5kYXlzKDEpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVuY3J5cHRpb246IFJlcG9zaXRvcnlFbmNyeXB0aW9uLktNUyxcbiAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICBpbWFnZVNjYW5PblB1c2g6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBXcmFwIHRoZSBzb3VyY2UgZm9sZGVyIGFzIGFuIFMzIGFzc2V0IGZvciBDb2RlQnVpbGQgdG8gdXNlXG4gICAgY29uc3Qgc291cmNlQXNzZXQgPSBuZXcgQXNzZXQodGhpcywgJ1NvdXJjZUFzc2V0Jywge1xuICAgICAgcGF0aDogc291cmNlUGF0aCxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBhbiBTMyBidWNrZXQgdG8gc3RvcmUgdGhlIENvZGVCdWlsZCBhcnRpZmFjdHNcbiAgICBjb25zdCBhcnRpZmFjdEJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgJ0FydGlmYWN0QnVja2V0Jywge1xuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgIH0pO1xuXG4gICAgLy8gQ29udmVydCBidWlsZEFyZ3MgdG8gYSBDTEktZnJpZW5kbHkgc3RyaW5nXG4gICAgY29uc3QgYnVpbGRBcmdzU3RyaW5nID0gYnVpbGRBcmdzXG4gICAgICA/IE9iamVjdC5lbnRyaWVzKGJ1aWxkQXJncylcbiAgICAgICAgLm1hcCgoW2ssIHZdKSA9PiBgLS1idWlsZC1hcmcgJHtrfT0ke3Z9YClcbiAgICAgICAgLmpvaW4oJyAnKVxuICAgICAgOiAnJztcblxuICAgIC8vIE9wdGlvbmFsIERvY2tlckh1YiBsb2dpbiwgaWYgYSBzZWNyZXQgQVJOIGlzIHByb3ZpZGVkXG4gICAgY29uc3QgZG9ja2VyTG9naW5Db21tYW5kcyA9IGRvY2tlckxvZ2luU2VjcmV0QXJuXG4gICAgICA/IFtcbiAgICAgICAgJ2VjaG8gXCJSZXRyaWV2aW5nIERvY2tlciBjcmVkZW50aWFscy4uLlwiJyxcbiAgICAgICAgJ2FwdC1nZXQgdXBkYXRlIC15ICYmIGFwdC1nZXQgaW5zdGFsbCAteSBqcScsXG4gICAgICAgIGBET0NLRVJfVVNFUk5BTUU9JChhd3Mgc2VjcmV0c21hbmFnZXIgZ2V0LXNlY3JldC12YWx1ZSAtLXNlY3JldC1pZCAke2RvY2tlckxvZ2luU2VjcmV0QXJufSAtLXF1ZXJ5IFNlY3JldFN0cmluZyAtLW91dHB1dCB0ZXh0IHwganEgLXIgLnVzZXJuYW1lKWAsXG4gICAgICAgIGBET0NLRVJfUEFTU1dPUkQ9JChhd3Mgc2VjcmV0c21hbmFnZXIgZ2V0LXNlY3JldC12YWx1ZSAtLXNlY3JldC1pZCAke2RvY2tlckxvZ2luU2VjcmV0QXJufSAtLXF1ZXJ5IFNlY3JldFN0cmluZyAtLW91dHB1dCB0ZXh0IHwganEgLXIgLnBhc3N3b3JkKWAsXG4gICAgICAgICdlY2hvIFwiTG9nZ2luZyBpbiB0byBEb2NrZXIgSHViLi4uXCInLFxuICAgICAgICAnZWNobyAkRE9DS0VSX1BBU1NXT1JEIHwgZG9ja2VyIGxvZ2luIC0tdXNlcm5hbWUgJERPQ0tFUl9VU0VSTkFNRSAtLXBhc3N3b3JkLXN0ZGluJyxcbiAgICAgIF1cbiAgICAgIDogWydlY2hvIFwiTm8gRG9ja2VyIGNyZWRlbnRpYWxzLiBTa2lwcGluZyBEb2NrZXIgSHViIGxvZ2luLlwiJ107XG5cbiAgICBjb25zdCBidWlsZFNwZWNPYmogPSB7XG4gICAgICB2ZXJzaW9uOiAnMC4yJyxcbiAgICAgIHBoYXNlczoge1xuICAgICAgICBpbnN0YWxsOiB7XG4gICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICdlY2hvIFwiQmVnaW5uaW5nIGluc3RhbGwgcGhhc2UuLi5cIicsXG4gICAgICAgICAgICAuLi4oaW5zdGFsbENvbW1hbmRzID8/IFtdKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBwcmVfYnVpbGQ6IHtcbiAgICAgICAgICBjb21tYW5kczogW1xuICAgICAgICAgICAgLi4uKHByZUJ1aWxkQ29tbWFuZHMgPz8gW10pLFxuICAgICAgICAgICAgLi4uZG9ja2VyTG9naW5Db21tYW5kcyxcbiAgICAgICAgICAgICdlY2hvIFwiUmV0cmlldmluZyBBV1MgQWNjb3VudCBJRC4uLlwiJyxcbiAgICAgICAgICAgICdleHBvcnQgQUNDT1VOVF9JRD0kKGF3cyBzdHMgZ2V0LWNhbGxlci1pZGVudGl0eSAtLXF1ZXJ5IEFjY291bnQgLS1vdXRwdXQgdGV4dCknLFxuICAgICAgICAgICAgJ2VjaG8gXCJMb2dnaW5nIGludG8gQW1hem9uIEVDUi4uLlwiJyxcbiAgICAgICAgICAgICdhd3MgZWNyIGdldC1sb2dpbi1wYXNzd29yZCAtLXJlZ2lvbiAkQVdTX0RFRkFVTFRfUkVHSU9OIHwgZG9ja2VyIGxvZ2luIC0tdXNlcm5hbWUgQVdTIC0tcGFzc3dvcmQtc3RkaW4gJEFDQ09VTlRfSUQuZGtyLmVjci4kQVdTX0RFRkFVTFRfUkVHSU9OLmFtYXpvbmF3cy5jb20nLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGJ1aWxkOiB7XG4gICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgIGBlY2hvIFwiQnVpbGRpbmcgRG9ja2VyIGltYWdlIHdpdGggdGFnICR7aW1hZ2VUYWd9Li4uXCJgLFxuICAgICAgICAgICAgYGRvY2tlciBidWlsZCAke2J1aWxkQXJnc1N0cmluZ30gLXQgJEVDUl9SRVBPX1VSSToke2ltYWdlVGFnfSAkQ09ERUJVSUxEX1NSQ19ESVJgLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHBvc3RfYnVpbGQ6IHtcbiAgICAgICAgICBjb21tYW5kczogW1xuICAgICAgICAgICAgYGVjaG8gXCJQdXNoaW5nIERvY2tlciBpbWFnZSB3aXRoIHRhZyAke2ltYWdlVGFnfS4uLlwiYCxcbiAgICAgICAgICAgIGBkb2NrZXIgcHVzaCAkRUNSX1JFUE9fVVJJOiR7aW1hZ2VUYWd9YCxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuXG5cbiAgICAvLyBDcmVhdGUgdGhlIENvZGVCdWlsZCBwcm9qZWN0XG4gICAgY29uc3QgY29kZUJ1aWxkUHJvamVjdCA9IG5ldyBQcm9qZWN0KHRoaXMsICdDb2RlQnVpbGRQcm9qZWN0Jywge1xuICAgICAgc291cmNlOiBTb3VyY2UuczMoe1xuICAgICAgICBidWNrZXQ6IHNvdXJjZUFzc2V0LmJ1Y2tldCxcbiAgICAgICAgcGF0aDogc291cmNlQXNzZXQuczNPYmplY3RLZXksXG4gICAgICB9KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIGJ1aWxkSW1hZ2U6IExpbnV4QnVpbGRJbWFnZS5TVEFOREFSRF83XzAsXG4gICAgICAgIHByaXZpbGVnZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHtcbiAgICAgICAgRUNSX1JFUE9fVVJJOiB7IHZhbHVlOiB0aGlzLmVjclJlcG9zaXRvcnkucmVwb3NpdG9yeVVyaSB9LFxuICAgICAgfSxcbiAgICAgIGJ1aWxkU3BlYzogQnVpbGRTcGVjLmZyb21PYmplY3QoYnVpbGRTcGVjT2JqKSxcbiAgICAgIHZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBzLFxuICAgICAgc3VibmV0U2VsZWN0aW9uLFxuICAgIH0pO1xuXG4gICAgLy8gR3JhbnQgQ29kZUJ1aWxkIHRoZSBhYmlsaXR5IHRvIGludGVyYWN0IHdpdGggRUNSXG4gICAgdGhpcy5lY3JSZXBvc2l0b3J5LmdyYW50UHVsbFB1c2goY29kZUJ1aWxkUHJvamVjdCk7XG4gICAgY29kZUJ1aWxkUHJvamVjdC5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ2VjcjpHZXRBdXRob3JpemF0aW9uVG9rZW4nLFxuICAgICAgICAnZWNyOkdldERvd25sb2FkVXJsRm9yTGF5ZXInLFxuICAgICAgICAnZWNyOkJhdGNoQ2hlY2tMYXllckF2YWlsYWJpbGl0eScsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbdGhpcy5lY3JSZXBvc2l0b3J5LnJlcG9zaXRvcnlBcm5dLFxuICAgIH0pKTtcbiAgICBpZiAoZG9ja2VyTG9naW5TZWNyZXRBcm4pIHtcbiAgICAgIGNvZGVCdWlsZFByb2plY3Qucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFsnc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbZG9ja2VyTG9naW5TZWNyZXRBcm5dLFxuICAgICAgfSkpO1xuICAgIH1cbiAgICBlbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQoY29kZUJ1aWxkUHJvamVjdC5yb2xlISk7XG5cbiAgICAvLyBEZWZpbmUgdGhlIExhbWJkYSBmdW5jdGlvbnMgZm9yIGN1c3RvbSByZXNvdXJjZSBldmVudCBhbmQgY29tcGxldGlvbiBoYW5kbGluZ1xuICAgIGNvbnN0IG9uRXZlbnRIYW5kbGVyRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24odGhpcywgJ09uRXZlbnRIYW5kbGVyRnVuY3Rpb24nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uL29uRXZlbnQnKSksXG4gICAgICBoYW5kbGVyOiAnb25FdmVudC5oYW5kbGVyJyxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgIH0pO1xuICAgIG9uRXZlbnRIYW5kbGVyRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogWydjb2RlYnVpbGQ6U3RhcnRCdWlsZCddLFxuICAgICAgcmVzb3VyY2VzOiBbY29kZUJ1aWxkUHJvamVjdC5wcm9qZWN0QXJuXSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBpc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdJc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMThfWCxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLi9pc0NvbXBsZXRlJykpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgSU1BR0VfVEFHOiBpbWFnZVRhZyxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiAnaXNDb21wbGV0ZS5oYW5kbGVyJyxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgIH0pO1xuXG4gICAgaXNDb21wbGV0ZUhhbmRsZXJGdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdjb2RlYnVpbGQ6QmF0Y2hHZXRCdWlsZHMnLFxuICAgICAgICAnY29kZWJ1aWxkOkxpc3RCdWlsZHNGb3JQcm9qZWN0JyxcbiAgICAgICAgJ2xvZ3M6R2V0TG9nRXZlbnRzJyxcbiAgICAgICAgJ2xvZ3M6RGVzY3JpYmVMb2dTdHJlYW1zJyxcbiAgICAgICAgJ2xvZ3M6RGVzY3JpYmVMb2dHcm91cHMnLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuXG4gICAgYXJ0aWZhY3RCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoaXNDb21wbGV0ZUhhbmRsZXJGdW5jdGlvbik7XG4gICAgZW5jcnlwdGlvbktleS5ncmFudEVuY3J5cHREZWNyeXB0KG9uRXZlbnRIYW5kbGVyRnVuY3Rpb24pO1xuICAgIGVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChpc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uKTtcbiAgICB0aGlzLmVjclJlcG9zaXRvcnkuZ3JhbnRQdWxsUHVzaChvbkV2ZW50SGFuZGxlckZ1bmN0aW9uKTtcbiAgICB0aGlzLmVjclJlcG9zaXRvcnkuZ3JhbnRQdWxsUHVzaChpc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uKTtcblxuICAgIC8vIENyZWF0ZSBhIGN1c3RvbSByZXNvdXJjZSBwcm92aWRlciB0aGF0IHVzZXMgdGhlIGFib3ZlIExhbWJkYXNcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCAnQ3VzdG9tUmVzb3VyY2VQcm92aWRlcicsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBvbkV2ZW50SGFuZGxlckZ1bmN0aW9uLFxuICAgICAgaXNDb21wbGV0ZUhhbmRsZXI6IGlzQ29tcGxldGVIYW5kbGVyRnVuY3Rpb24sXG4gICAgICBxdWVyeUludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICB9KTtcblxuICAgIC8vIEN1c3RvbSBSZXNvdXJjZSB0aGF0IHRyaWdnZXJzIHRoZSBDb2RlQnVpbGQgYW5kIHdhaXRzIGZvciBjb21wbGV0aW9uXG4gICAgY29uc3QgYnVpbGRUcmlnZ2VyUmVzb3VyY2UgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ0J1aWxkVHJpZ2dlclJlc291cmNlJywge1xuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFByb2plY3ROYW1lOiBjb2RlQnVpbGRQcm9qZWN0LnByb2plY3ROYW1lLFxuICAgICAgICBJbWFnZVRhZzogaW1hZ2VUYWcsXG4gICAgICAgIFRyaWdnZXI6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGJ1aWxkVHJpZ2dlclJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShjb2RlQnVpbGRQcm9qZWN0KTtcblxuICAgIC8vIFJldHJpZXZlIHRoZSBmaW5hbCBEb2NrZXIgaW1hZ2UgdGFnIGZyb20gRGF0YS5JbWFnZVRhZ1xuICAgIC8vIFRoaXMgY3JlYXRlcyBhIGRlcGVuZGVuY3kgb24gdGhlIEN1c3RvbSBSZXNvdXJjZS4uLlxuICAgIGNvbnN0IGltYWdlVGFnUmVmID0gYnVpbGRUcmlnZ2VyUmVzb3VyY2UuZ2V0QXR0U3RyaW5nKCdJbWFnZVRhZycpO1xuICAgIHRoaXMuY29udGFpbmVySW1hZ2UgPSBDb250YWluZXJJbWFnZS5mcm9tRWNyUmVwb3NpdG9yeSh0aGlzLmVjclJlcG9zaXRvcnksIGltYWdlVGFnUmVmKTtcbiAgICB0aGlzLmRvY2tlckltYWdlQ29kZSA9IERvY2tlckltYWdlQ29kZS5mcm9tRWNyKHRoaXMuZWNyUmVwb3NpdG9yeSwge1xuICAgICAgdGFnT3JEaWdlc3Q6IGltYWdlVGFnUmVmLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -30,7 +30,9 @@
|
|
|
30
30
|
"watch": "npx projen watch",
|
|
31
31
|
"projen": "npx projen",
|
|
32
32
|
"local-deploy": "cdk deploy --app \"npx ts-node src/integ.default.ts\"",
|
|
33
|
-
"local-
|
|
33
|
+
"local-deploy-no-rollback": "cdk deploy --no-rollback --app \"npx ts-node src/integ.default.ts\"",
|
|
34
|
+
"local-destroy": "cdk destroy --app \"npx ts-node src/integ.default.ts\"",
|
|
35
|
+
"local-synth": "cdk synth --app \"npx ts-node src/integ.default.ts\""
|
|
34
36
|
},
|
|
35
37
|
"author": {
|
|
36
38
|
"name": "AlexTech314",
|
|
@@ -43,7 +45,7 @@
|
|
|
43
45
|
"@types/node": "^22.10.2",
|
|
44
46
|
"@typescript-eslint/eslint-plugin": "^8",
|
|
45
47
|
"@typescript-eslint/parser": "^8",
|
|
46
|
-
"aws-cdk-lib": "2.
|
|
48
|
+
"aws-cdk-lib": "2.173.2",
|
|
47
49
|
"commit-and-tag-version": "^12",
|
|
48
50
|
"constructs": "10.0.5",
|
|
49
51
|
"eslint": "^9",
|
|
@@ -62,7 +64,7 @@
|
|
|
62
64
|
"typescript": "^5.7.2"
|
|
63
65
|
},
|
|
64
66
|
"peerDependencies": {
|
|
65
|
-
"aws-cdk-lib": "^2.
|
|
67
|
+
"aws-cdk-lib": "^2.173.2",
|
|
66
68
|
"constructs": "^10.0.5"
|
|
67
69
|
},
|
|
68
70
|
"keywords": [
|
|
@@ -96,7 +98,7 @@
|
|
|
96
98
|
"publishConfig": {
|
|
97
99
|
"access": "public"
|
|
98
100
|
},
|
|
99
|
-
"version": "1.
|
|
101
|
+
"version": "1.3.1",
|
|
100
102
|
"jest": {
|
|
101
103
|
"coverageProvider": "v8",
|
|
102
104
|
"testMatch": [
|