From f8a832b3ba36a11d97920656164ddce8b265719a Mon Sep 17 00:00:00 2001 From: Ian Kerins Date: Fri, 3 Oct 2025 01:09:33 -0400 Subject: [PATCH] fix(pipelines): propagate CodeBuild `fleet` and `certificate` These properties were simply overlooked. I added a TypeScript `satisfies` assertion to ensure that newly added properties are not missed here. --- .../VariablePipelineStack.assets.json | 6 +- .../VariablePipelineStack.template.json | 74 +++++++++++++++++++ .../manifest.json | 18 ++++- .../tree.json | 2 +- .../test/integ.pipeline-with-variables.ts | 13 ++++ .../codepipeline/private/codebuild-factory.ts | 18 ++++- .../pipelines/test/compliance/synths.test.ts | 12 +++ 7 files changed, 134 insertions(+), 9 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/VariablePipelineStack.assets.json b/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/VariablePipelineStack.assets.json index 88829c2883dc3..c766c4082fef7 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/VariablePipelineStack.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/VariablePipelineStack.assets.json @@ -15,16 +15,16 @@ } } }, - "9bd1ee704a5c0d1d0b6575dbddd0fe891c54e3436761c70c8c1a02495a5b0922": { + "fc054a37581575e192c18e7007908d0e6477d17982d174ac541a64307d39c9a1": { "displayName": "VariablePipelineStack Template", "source": { "path": "VariablePipelineStack.template.json", "packaging": "file" }, "destinations": { - "current_account-current_region-298cfe31": { + "current_account-current_region-78d4fac3": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "9bd1ee704a5c0d1d0b6575dbddd0fe891c54e3436761c70c8c1a02495a5b0922.json", + "objectKey": "fc054a37581575e192c18e7007908d0e6477d17982d174ac541a64307d39c9a1.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/VariablePipelineStack.template.json b/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/VariablePipelineStack.template.json index ff62391f6915f..b3a5b4e727922 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/VariablePipelineStack.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/VariablePipelineStack.template.json @@ -150,6 +150,14 @@ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" ] }, + "Fleet30813DF3": { + "Type": "AWS::CodeBuild::Fleet", + "Properties": { + "BaseCapacity": 1, + "ComputeType": "BUILD_GENERAL1_SMALL", + "EnvironmentType": "LINUX_CONTAINER" + } + }, "PipelineArtifactsBucketAEA9A052": { "Type": "AWS::S3::Bucket", "Properties": { @@ -736,7 +744,29 @@ "Description": "Pipeline step VariablePipelineStack/Pipeline/Build/Synth", "EncryptionKey": "alias/aws/s3", "Environment": { + "Certificate": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "SourceBucketDDD2130A", + "Arn" + ] + }, + "/my-certificate.pem" + ] + ] + }, "ComputeType": "BUILD_GENERAL1_SMALL", + "Fleet": { + "FleetArn": { + "Fn::GetAtt": [ + "Fleet30813DF3", + "Arn" + ] + } + }, "Image": "aws/codebuild/standard:7.0", "ImagePullCredentialsType": "CODEBUILD", "PrivilegedMode": false, @@ -970,7 +1000,29 @@ "Description": "Pipeline step VariablePipelineStack/Pipeline/MyWave/Produce", "EncryptionKey": "alias/aws/s3", "Environment": { + "Certificate": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "SourceBucketDDD2130A", + "Arn" + ] + }, + "/my-certificate.pem" + ] + ] + }, "ComputeType": "BUILD_GENERAL1_SMALL", + "Fleet": { + "FleetArn": { + "Fn::GetAtt": [ + "Fleet30813DF3", + "Arn" + ] + } + }, "Image": "aws/codebuild/standard:7.0", "ImagePullCredentialsType": "CODEBUILD", "PrivilegedMode": false, @@ -1204,7 +1256,29 @@ "Description": "Pipeline step VariablePipelineStack/Pipeline/MyWave/Consume", "EncryptionKey": "alias/aws/s3", "Environment": { + "Certificate": { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "SourceBucketDDD2130A", + "Arn" + ] + }, + "/my-certificate.pem" + ] + ] + }, "ComputeType": "BUILD_GENERAL1_SMALL", + "Fleet": { + "FleetArn": { + "Fn::GetAtt": [ + "Fleet30813DF3", + "Arn" + ] + } + }, "Image": "aws/codebuild/standard:7.0", "ImagePullCredentialsType": "CODEBUILD", "PrivilegedMode": false, diff --git a/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/manifest.json index 4840eb32c1384..825b328d84bfc 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/manifest.json @@ -18,7 +18,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/9bd1ee704a5c0d1d0b6575dbddd0fe891c54e3436761c70c8c1a02495a5b0922.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/fc054a37581575e192c18e7007908d0e6477d17982d174ac541a64307d39c9a1.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -99,6 +99,22 @@ "data": "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F" } ], + "/VariablePipelineStack/Fleet": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "baseCapacity": "*", + "computeType": "BUILD_GENERAL1_SMALL", + "environmentType": "LINUX_CONTAINER" + } + } + ], + "/VariablePipelineStack/Fleet/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "Fleet30813DF3" + } + ], "/VariablePipelineStack/Pipeline": [ { "type": "aws:cdk:warning", diff --git a/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/tree.json index 9cd5a30bd092f..488399cf53b16 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.js.snapshot/tree.json @@ -1 +1 @@ -{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"},"children":{"VariablePipelineStack":{"id":"VariablePipelineStack","path":"VariablePipelineStack","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"SourceBucket":{"id":"SourceBucket","path":"VariablePipelineStack/SourceBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"0.0.0","metadata":[{"removalPolicy":"destroy","autoDeleteObjects":true}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/SourceBucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"tags":[{"key":"aws-cdk:auto-delete-objects","value":"true"}]}}},"Policy":{"id":"Policy","path":"VariablePipelineStack/SourceBucket/Policy","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketPolicy","version":"0.0.0","metadata":[{"bucket":"*"}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/SourceBucket/Policy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucketPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"SourceBucketDDD2130A"},"policyDocument":{"Statement":[{"Action":["s3:DeleteObject*","s3:GetBucket*","s3:List*","s3:PutBucketPolicy"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}}}}},"AutoDeleteObjectsCustomResource":{"id":"AutoDeleteObjectsCustomResource","path":"VariablePipelineStack/SourceBucket/AutoDeleteObjectsCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"VariablePipelineStack/SourceBucket/AutoDeleteObjectsCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"VariablePipelineStack/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","version":"0.0.0"}},"Custom::S3AutoDeleteObjectsCustomResourceProvider":{"id":"Custom::S3AutoDeleteObjectsCustomResourceProvider","path":"VariablePipelineStack/Custom::S3AutoDeleteObjectsCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"VariablePipelineStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"VariablePipelineStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"VariablePipelineStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Pipeline":{"id":"Pipeline","path":"VariablePipelineStack/Pipeline","constructInfo":{"fqn":"aws-cdk-lib.pipelines.CodePipeline","version":"0.0.0"},"children":{"Pipeline":{"id":"Pipeline","path":"VariablePipelineStack/Pipeline/Pipeline","constructInfo":{"fqn":"aws-cdk-lib.aws_codepipeline.Pipeline","version":"0.0.0","metadata":[{"pipelineName":"*","pipelineType":"V1","crossAccountKeys":false,"crossRegionReplicationBuckets":"*","reuseCrossRegionSupportStacks":"*","restartExecutionOnUpdate":true,"role":"*","enableKeyRotation":"*","artifactBucket":"*","usePipelineRoleForActions":false},{"addStage":[{"stageName":"*"}]},{"addStage":[{"stageName":"*"}]},{"addStage":[{"stageName":"*"}]}]},"children":{"ArtifactsBucket":{"id":"ArtifactsBucket","path":"VariablePipelineStack/Pipeline/Pipeline/ArtifactsBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"0.0.0","metadata":[{"bucketName":"*","encryptionKey":"*","encryption":"KMS_MANAGED","enforceSSL":true,"blockPublicAccess":"*","removalPolicy":"retain"}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/ArtifactsBucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"bucketEncryption":{"serverSideEncryptionConfiguration":[{"serverSideEncryptionByDefault":{"sseAlgorithm":"aws:kms"}}]},"publicAccessBlockConfiguration":{"blockPublicAcls":true,"blockPublicPolicy":true,"ignorePublicAcls":true,"restrictPublicBuckets":true}}}},"Policy":{"id":"Policy","path":"VariablePipelineStack/Pipeline/Pipeline/ArtifactsBucket/Policy","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketPolicy","version":"0.0.0","metadata":[{"bucket":"*"}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/ArtifactsBucket/Policy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucketPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"PipelineArtifactsBucketAEA9A052"},"policyDocument":{"Statement":[{"Action":"s3:*","Condition":{"Bool":{"aws:SecureTransport":"false"}},"Effect":"Deny","Principal":{"AWS":"*"},"Resource":[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}}}}}}},"Role":{"id":"Role","path":"VariablePipelineStack/Pipeline/Pipeline/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportRole":{"id":"ImportRole","path":"VariablePipelineStack/Pipeline/Pipeline/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"codepipeline.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"VariablePipelineStack/Pipeline/Pipeline/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:Abort*","s3:DeleteObject*","s3:GetBucket*","s3:GetObject*","s3:List*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},"/*"]]}]},{"Action":"sts:AssumeRole","Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineCodeBuildActionRole226DB0CB","Arn"]},{"Fn::GetAtt":["PipelineSourceS3CodePipelineActionRole83895A58","Arn"]}]}],"Version":"2012-10-17"},"policyName":"PipelineRoleDefaultPolicy7BDC1ABB","roles":[{"Ref":"PipelineRoleB27FAA37"}]}}}}}}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_codepipeline.CfnPipeline","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CodePipeline::Pipeline","aws:cdk:cloudformation:props":{"artifactStore":{"type":"S3","location":{"Ref":"PipelineArtifactsBucketAEA9A052"}},"pipelineType":"V1","restartExecutionOnUpdate":true,"roleArn":{"Fn::GetAtt":["PipelineRoleB27FAA37","Arn"]},"stages":[{"name":"Source","actions":[{"name":{"Ref":"SourceBucketDDD2130A"},"outputArtifacts":[{"name":"c8afb86a650460a8cc607cf72a0827e7c93d0d6d5c_Source"}],"actionTypeId":{"category":"Source","version":"1","owner":"AWS","provider":"S3"},"configuration":{"S3Bucket":{"Ref":"SourceBucketDDD2130A"},"S3ObjectKey":"key"},"runOrder":1,"roleArn":{"Fn::GetAtt":["PipelineSourceS3CodePipelineActionRole83895A58","Arn"]}}]},{"name":"Build","actions":[{"name":"Synth","inputArtifacts":[{"name":"c8afb86a650460a8cc607cf72a0827e7c93d0d6d5c_Source"}],"outputArtifacts":[{"name":"Synth_Output"}],"actionTypeId":{"category":"Build","version":"1","owner":"AWS","provider":"CodeBuild"},"configuration":{"ProjectName":{"Ref":"PipelineBuildSynthCdkBuildProject6BEFA8E6"}},"runOrder":1,"roleArn":{"Fn::GetAtt":["PipelineCodeBuildActionRole226DB0CB","Arn"]}}]},{"name":"MyWave","actions":[{"name":"Produce","inputArtifacts":[{"name":"c8afb86a650460a8cc607cf72a0827e7c93d0d6d5c_Source"}],"actionTypeId":{"category":"Build","version":"1","owner":"AWS","provider":"CodeBuild"},"configuration":{"ProjectName":{"Ref":"PipelineMyWaveProduce884410D6"}},"runOrder":1,"roleArn":{"Fn::GetAtt":["PipelineCodeBuildActionRole226DB0CB","Arn"]},"namespace":"MyWave@Produce"},{"name":"Consume","inputArtifacts":[{"name":"c8afb86a650460a8cc607cf72a0827e7c93d0d6d5c_Source"}],"actionTypeId":{"category":"Build","version":"1","owner":"AWS","provider":"CodeBuild"},"configuration":{"ProjectName":{"Ref":"PipelineMyWaveConsumeC5D5CCD7"},"EnvironmentVariables":"[{\"name\":\"THE_VAR\",\"type\":\"PLAINTEXT\",\"value\":\"#{MyWave@Produce.MY_VAR}\"}]"},"runOrder":2,"roleArn":{"Fn::GetAtt":["PipelineCodeBuildActionRole226DB0CB","Arn"]}}]}]}}},"Source":{"id":"Source","path":"VariablePipelineStack/Pipeline/Pipeline/Source","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"S3":{"id":"S3","path":"VariablePipelineStack/Pipeline/Pipeline/Source/S3","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"CodePipelineActionRole":{"id":"CodePipelineActionRole","path":"VariablePipelineStack/Pipeline/Pipeline/Source/S3/CodePipelineActionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"grantAssumeRole":["*"]},{"grant":["*","*"]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportCodePipelineActionRole":{"id":"ImportCodePipelineActionRole","path":"VariablePipelineStack/Pipeline/Pipeline/Source/S3/CodePipelineActionRole/ImportCodePipelineActionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Source/S3/CodePipelineActionRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["PipelineRoleB27FAA37","Arn"]}}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"VariablePipelineStack/Pipeline/Pipeline/Source/S3/CodePipelineActionRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Source/S3/CodePipelineActionRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:GetBucket*","s3:GetObject*","s3:List*"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},"/key"]]}]},{"Action":["s3:Abort*","s3:DeleteObject*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"PipelineSourceS3CodePipelineActionRoleDefaultPolicyB176A07F","roles":[{"Ref":"PipelineSourceS3CodePipelineActionRole83895A58"}]}}}}}}}}}}},"Build":{"id":"Build","path":"VariablePipelineStack/Pipeline/Pipeline/Build","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Synth":{"id":"Synth","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"CdkBuildProject":{"id":"CdkBuildProject","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.PipelineProject","version":"0.0.0","metadata":[{},{},{}]},"children":{"Role":{"id":"Role","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportRole":{"id":"ImportRole","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"codebuild.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/codebuild/",{"Ref":"PipelineBuildSynthCdkBuildProject6BEFA8E6"},":*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/codebuild/",{"Ref":"PipelineBuildSynthCdkBuildProject6BEFA8E6"}]]}]},{"Action":["codebuild:BatchPutCodeCoverages","codebuild:BatchPutTestCases","codebuild:CreateReport","codebuild:CreateReportGroup","codebuild:UpdateReport"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":codebuild:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":report-group/",{"Ref":"PipelineBuildSynthCdkBuildProject6BEFA8E6"},"-*"]]}},{"Action":["s3:Abort*","s3:DeleteObject*","s3:GetBucket*","s3:GetObject*","s3:List*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"PipelineBuildSynthCdkBuildProjectRoleDefaultPolicyFB6C941C","roles":[{"Ref":"PipelineBuildSynthCdkBuildProjectRole231EEA2A"}]}}}}}}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.CfnProject","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CodeBuild::Project","aws:cdk:cloudformation:props":{"artifacts":{"type":"CODEPIPELINE"},"cache":{"type":"NO_CACHE"},"description":"Pipeline step VariablePipelineStack/Pipeline/Build/Synth","encryptionKey":"alias/aws/s3","environment":{"type":"LINUX_CONTAINER","image":"aws/codebuild/standard:7.0","imagePullCredentialsType":"CODEBUILD","privilegedMode":false,"computeType":"BUILD_GENERAL1_SMALL"},"serviceRole":{"Fn::GetAtt":["PipelineBuildSynthCdkBuildProjectRole231EEA2A","Arn"]},"source":{"type":"CODEPIPELINE","buildSpec":"{\n \"version\": \"0.2\",\n \"phases\": {\n \"build\": {\n \"commands\": [\n \"mkdir cdk.out\",\n \"touch cdk.out/dummy\"\n ]\n }\n },\n \"artifacts\": {\n \"base-directory\": \"cdk.out\",\n \"files\": \"**/*\"\n }\n}"}}}}}}}}}},"MyWave":{"id":"MyWave","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Produce":{"id":"Produce","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Produce":{"id":"Produce","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.PipelineProject","version":"0.0.0","metadata":[{},{},{}]},"children":{"Role":{"id":"Role","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportRole":{"id":"ImportRole","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"codebuild.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:Abort*","s3:DeleteObject*","s3:GetBucket*","s3:GetObject*","s3:List*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["TestCacheBucketA6BDC126","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["TestCacheBucketA6BDC126","Arn"]},"/*"]]}]},{"Action":["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/codebuild/",{"Ref":"PipelineMyWaveProduce884410D6"},":*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/codebuild/",{"Ref":"PipelineMyWaveProduce884410D6"}]]}]},{"Action":["codebuild:BatchPutCodeCoverages","codebuild:BatchPutTestCases","codebuild:CreateReport","codebuild:CreateReportGroup","codebuild:UpdateReport"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":codebuild:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":report-group/",{"Ref":"PipelineMyWaveProduce884410D6"},"-*"]]}},{"Action":["s3:GetBucket*","s3:GetObject*","s3:List*"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"PipelineMyWaveProduceRoleDefaultPolicy209239D4","roles":[{"Ref":"PipelineMyWaveProduceRole24E3565D"}]}}}}}}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.CfnProject","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CodeBuild::Project","aws:cdk:cloudformation:props":{"artifacts":{"type":"CODEPIPELINE"},"cache":{"type":"S3","location":{"Fn::Join":["/",[{"Ref":"TestCacheBucketA6BDC126"},{"Ref":"AWS::NoValue"}]]}},"description":"Pipeline step VariablePipelineStack/Pipeline/MyWave/Produce","encryptionKey":"alias/aws/s3","environment":{"type":"LINUX_CONTAINER","image":"aws/codebuild/standard:7.0","imagePullCredentialsType":"CODEBUILD","privilegedMode":false,"computeType":"BUILD_GENERAL1_SMALL"},"serviceRole":{"Fn::GetAtt":["PipelineMyWaveProduceRole24E3565D","Arn"]},"source":{"type":"CODEPIPELINE","buildSpec":"{\n \"version\": \"0.2\",\n \"env\": {\n \"exported-variables\": [\n \"MY_VAR\"\n ]\n },\n \"phases\": {\n \"build\": {\n \"commands\": [\n \"export MY_VAR=hello\"\n ]\n }\n }\n}"}}}}}}}},"Consume":{"id":"Consume","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Consume":{"id":"Consume","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.PipelineProject","version":"0.0.0","metadata":[{},{},{}]},"children":{"Role":{"id":"Role","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportRole":{"id":"ImportRole","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"codebuild.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:Abort*","s3:DeleteObject*","s3:GetBucket*","s3:GetObject*","s3:List*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["TestCacheBucketA6BDC126","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["TestCacheBucketA6BDC126","Arn"]},"/*"]]}]},{"Action":["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/codebuild/",{"Ref":"PipelineMyWaveConsumeC5D5CCD7"},":*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/codebuild/",{"Ref":"PipelineMyWaveConsumeC5D5CCD7"}]]}]},{"Action":["codebuild:BatchPutCodeCoverages","codebuild:BatchPutTestCases","codebuild:CreateReport","codebuild:CreateReportGroup","codebuild:UpdateReport"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":codebuild:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":report-group/",{"Ref":"PipelineMyWaveConsumeC5D5CCD7"},"-*"]]}},{"Action":["s3:GetBucket*","s3:GetObject*","s3:List*"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"PipelineMyWaveConsumeRoleDefaultPolicyC80F0194","roles":[{"Ref":"PipelineMyWaveConsumeRole2A96FF33"}]}}}}}}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.CfnProject","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CodeBuild::Project","aws:cdk:cloudformation:props":{"artifacts":{"type":"CODEPIPELINE"},"cache":{"type":"S3","location":{"Fn::Join":["/",[{"Ref":"TestCacheBucketA6BDC126"},{"Ref":"AWS::NoValue"}]]}},"description":"Pipeline step VariablePipelineStack/Pipeline/MyWave/Consume","encryptionKey":"alias/aws/s3","environment":{"type":"LINUX_CONTAINER","image":"aws/codebuild/standard:7.0","imagePullCredentialsType":"CODEBUILD","privilegedMode":false,"computeType":"BUILD_GENERAL1_SMALL"},"serviceRole":{"Fn::GetAtt":["PipelineMyWaveConsumeRole2A96FF33","Arn"]},"source":{"type":"CODEPIPELINE","buildSpec":"{\n \"version\": \"0.2\",\n \"phases\": {\n \"build\": {\n \"commands\": [\n \"echo \\\"The variable was: $THE_VAR\\\"\"\n ]\n }\n }\n}"}}}}}}}}}}}},"CodeBuildActionRole":{"id":"CodeBuildActionRole","path":"VariablePipelineStack/Pipeline/CodeBuildActionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":"*"},{"grantAssumeRole":["*"]},{"grant":["*","*"]},{"addToPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"grantAssumeRole":["*"]},{"grant":["*","*"]},{"addToPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"grantAssumeRole":["*"]},{"grant":["*","*"]},{"addToPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportCodeBuildActionRole":{"id":"ImportCodeBuildActionRole","path":"VariablePipelineStack/Pipeline/CodeBuildActionRole/ImportCodeBuildActionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/CodeBuildActionRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["PipelineRoleB27FAA37","Arn"]}}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"VariablePipelineStack/Pipeline/CodeBuildActionRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/CodeBuildActionRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["codebuild:BatchGetBuilds","codebuild:StartBuild","codebuild:StopBuild"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineBuildSynthCdkBuildProject6BEFA8E6","Arn"]},{"Fn::GetAtt":["PipelineMyWaveConsumeC5D5CCD7","Arn"]},{"Fn::GetAtt":["PipelineMyWaveProduce884410D6","Arn"]}]}],"Version":"2012-10-17"},"policyName":"PipelineCodeBuildActionRoleDefaultPolicy1D62A6FE","roles":[{"Ref":"PipelineCodeBuildActionRole226DB0CB"}]}}}}}}}}},"TestCacheBucket":{"id":"TestCacheBucket","path":"VariablePipelineStack/TestCacheBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"0.0.0","metadata":["*"]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/TestCacheBucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"VariablePipelineStack/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"VariablePipelineStack/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"VariablePipelineTest":{"id":"VariablePipelineTest","path":"VariablePipelineTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"VariablePipelineTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"VariablePipelineTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"VariablePipelineTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"VariablePipelineTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"VariablePipelineTest/DefaultTest/DeployAssert/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}}}}}},"Tree":{"id":"Tree","path":"Tree","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}}} \ No newline at end of file +{"version":"tree-0.1","tree":{"id":"App","path":"","constructInfo":{"fqn":"aws-cdk-lib.App","version":"0.0.0"},"children":{"VariablePipelineStack":{"id":"VariablePipelineStack","path":"VariablePipelineStack","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"SourceBucket":{"id":"SourceBucket","path":"VariablePipelineStack/SourceBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"0.0.0","metadata":[{"removalPolicy":"destroy","autoDeleteObjects":true}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/SourceBucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"tags":[{"key":"aws-cdk:auto-delete-objects","value":"true"}]}}},"Policy":{"id":"Policy","path":"VariablePipelineStack/SourceBucket/Policy","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketPolicy","version":"0.0.0","metadata":[{"bucket":"*"}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/SourceBucket/Policy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucketPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"SourceBucketDDD2130A"},"policyDocument":{"Statement":[{"Action":["s3:DeleteObject*","s3:GetBucket*","s3:List*","s3:PutBucketPolicy"],"Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092","Arn"]}},"Resource":[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}}}}},"AutoDeleteObjectsCustomResource":{"id":"AutoDeleteObjectsCustomResource","path":"VariablePipelineStack/SourceBucket/AutoDeleteObjectsCustomResource","constructInfo":{"fqn":"aws-cdk-lib.CustomResource","version":"0.0.0","metadata":["*"]},"children":{"Default":{"id":"Default","path":"VariablePipelineStack/SourceBucket/AutoDeleteObjectsCustomResource/Default","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}}}},"LatestNodeRuntimeMap":{"id":"LatestNodeRuntimeMap","path":"VariablePipelineStack/LatestNodeRuntimeMap","constructInfo":{"fqn":"aws-cdk-lib.CfnMapping","version":"0.0.0"}},"Custom::S3AutoDeleteObjectsCustomResourceProvider":{"id":"Custom::S3AutoDeleteObjectsCustomResourceProvider","path":"VariablePipelineStack/Custom::S3AutoDeleteObjectsCustomResourceProvider","constructInfo":{"fqn":"aws-cdk-lib.CustomResourceProviderBase","version":"0.0.0"},"children":{"Staging":{"id":"Staging","path":"VariablePipelineStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Staging","constructInfo":{"fqn":"aws-cdk-lib.AssetStaging","version":"0.0.0"}},"Role":{"id":"Role","path":"VariablePipelineStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}},"Handler":{"id":"Handler","path":"VariablePipelineStack/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler","constructInfo":{"fqn":"aws-cdk-lib.CfnResource","version":"0.0.0"}}}},"Fleet":{"id":"Fleet","path":"VariablePipelineStack/Fleet","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.Fleet","version":"0.0.0","metadata":[{"baseCapacity":"*","computeType":"BUILD_GENERAL1_SMALL","environmentType":"LINUX_CONTAINER"}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Fleet/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.CfnFleet","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CodeBuild::Fleet","aws:cdk:cloudformation:props":{"baseCapacity":1,"computeType":"BUILD_GENERAL1_SMALL","environmentType":"LINUX_CONTAINER"}}}}},"Pipeline":{"id":"Pipeline","path":"VariablePipelineStack/Pipeline","constructInfo":{"fqn":"aws-cdk-lib.pipelines.CodePipeline","version":"0.0.0"},"children":{"Pipeline":{"id":"Pipeline","path":"VariablePipelineStack/Pipeline/Pipeline","constructInfo":{"fqn":"aws-cdk-lib.aws_codepipeline.Pipeline","version":"0.0.0","metadata":[{"pipelineName":"*","pipelineType":"V1","crossAccountKeys":false,"crossRegionReplicationBuckets":"*","reuseCrossRegionSupportStacks":"*","restartExecutionOnUpdate":true,"role":"*","enableKeyRotation":"*","artifactBucket":"*","usePipelineRoleForActions":false},{"addStage":[{"stageName":"*"}]},{"addStage":[{"stageName":"*"}]},{"addStage":[{"stageName":"*"}]}]},"children":{"ArtifactsBucket":{"id":"ArtifactsBucket","path":"VariablePipelineStack/Pipeline/Pipeline/ArtifactsBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"0.0.0","metadata":[{"bucketName":"*","encryptionKey":"*","encryption":"KMS_MANAGED","enforceSSL":true,"blockPublicAccess":"*","removalPolicy":"retain"}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/ArtifactsBucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{"bucketEncryption":{"serverSideEncryptionConfiguration":[{"serverSideEncryptionByDefault":{"sseAlgorithm":"aws:kms"}}]},"publicAccessBlockConfiguration":{"blockPublicAcls":true,"blockPublicPolicy":true,"ignorePublicAcls":true,"restrictPublicBuckets":true}}}},"Policy":{"id":"Policy","path":"VariablePipelineStack/Pipeline/Pipeline/ArtifactsBucket/Policy","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.BucketPolicy","version":"0.0.0","metadata":[{"bucket":"*"}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/ArtifactsBucket/Policy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucketPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::BucketPolicy","aws:cdk:cloudformation:props":{"bucket":{"Ref":"PipelineArtifactsBucketAEA9A052"},"policyDocument":{"Statement":[{"Action":"s3:*","Condition":{"Bool":{"aws:SecureTransport":"false"}},"Effect":"Deny","Principal":{"AWS":"*"},"Resource":[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},"/*"]]}]}],"Version":"2012-10-17"}}}}}}}},"Role":{"id":"Role","path":"VariablePipelineStack/Pipeline/Pipeline/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"},"roleName":"*"},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportRole":{"id":"ImportRole","path":"VariablePipelineStack/Pipeline/Pipeline/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"codepipeline.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"VariablePipelineStack/Pipeline/Pipeline/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:Abort*","s3:DeleteObject*","s3:GetBucket*","s3:GetObject*","s3:List*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},"/*"]]}]},{"Action":"sts:AssumeRole","Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineCodeBuildActionRole226DB0CB","Arn"]},{"Fn::GetAtt":["PipelineSourceS3CodePipelineActionRole83895A58","Arn"]}]}],"Version":"2012-10-17"},"policyName":"PipelineRoleDefaultPolicy7BDC1ABB","roles":[{"Ref":"PipelineRoleB27FAA37"}]}}}}}}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_codepipeline.CfnPipeline","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CodePipeline::Pipeline","aws:cdk:cloudformation:props":{"artifactStore":{"type":"S3","location":{"Ref":"PipelineArtifactsBucketAEA9A052"}},"pipelineType":"V1","restartExecutionOnUpdate":true,"roleArn":{"Fn::GetAtt":["PipelineRoleB27FAA37","Arn"]},"stages":[{"name":"Source","actions":[{"name":{"Ref":"SourceBucketDDD2130A"},"outputArtifacts":[{"name":"c8afb86a650460a8cc607cf72a0827e7c93d0d6d5c_Source"}],"actionTypeId":{"category":"Source","version":"1","owner":"AWS","provider":"S3"},"configuration":{"S3Bucket":{"Ref":"SourceBucketDDD2130A"},"S3ObjectKey":"key"},"runOrder":1,"roleArn":{"Fn::GetAtt":["PipelineSourceS3CodePipelineActionRole83895A58","Arn"]}}]},{"name":"Build","actions":[{"name":"Synth","inputArtifacts":[{"name":"c8afb86a650460a8cc607cf72a0827e7c93d0d6d5c_Source"}],"outputArtifacts":[{"name":"Synth_Output"}],"actionTypeId":{"category":"Build","version":"1","owner":"AWS","provider":"CodeBuild"},"configuration":{"ProjectName":{"Ref":"PipelineBuildSynthCdkBuildProject6BEFA8E6"}},"runOrder":1,"roleArn":{"Fn::GetAtt":["PipelineCodeBuildActionRole226DB0CB","Arn"]}}]},{"name":"MyWave","actions":[{"name":"Produce","inputArtifacts":[{"name":"c8afb86a650460a8cc607cf72a0827e7c93d0d6d5c_Source"}],"actionTypeId":{"category":"Build","version":"1","owner":"AWS","provider":"CodeBuild"},"configuration":{"ProjectName":{"Ref":"PipelineMyWaveProduce884410D6"}},"runOrder":1,"roleArn":{"Fn::GetAtt":["PipelineCodeBuildActionRole226DB0CB","Arn"]},"namespace":"MyWave@Produce"},{"name":"Consume","inputArtifacts":[{"name":"c8afb86a650460a8cc607cf72a0827e7c93d0d6d5c_Source"}],"actionTypeId":{"category":"Build","version":"1","owner":"AWS","provider":"CodeBuild"},"configuration":{"ProjectName":{"Ref":"PipelineMyWaveConsumeC5D5CCD7"},"EnvironmentVariables":"[{\"name\":\"THE_VAR\",\"type\":\"PLAINTEXT\",\"value\":\"#{MyWave@Produce.MY_VAR}\"}]"},"runOrder":2,"roleArn":{"Fn::GetAtt":["PipelineCodeBuildActionRole226DB0CB","Arn"]}}]}]}}},"Source":{"id":"Source","path":"VariablePipelineStack/Pipeline/Pipeline/Source","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"S3":{"id":"S3","path":"VariablePipelineStack/Pipeline/Pipeline/Source/S3","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"CodePipelineActionRole":{"id":"CodePipelineActionRole","path":"VariablePipelineStack/Pipeline/Pipeline/Source/S3/CodePipelineActionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"grantAssumeRole":["*"]},{"grant":["*","*"]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportCodePipelineActionRole":{"id":"ImportCodePipelineActionRole","path":"VariablePipelineStack/Pipeline/Pipeline/Source/S3/CodePipelineActionRole/ImportCodePipelineActionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Source/S3/CodePipelineActionRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["PipelineRoleB27FAA37","Arn"]}}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"VariablePipelineStack/Pipeline/Pipeline/Source/S3/CodePipelineActionRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Source/S3/CodePipelineActionRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:GetBucket*","s3:GetObject*","s3:List*"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},"/key"]]}]},{"Action":["s3:Abort*","s3:DeleteObject*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"PipelineSourceS3CodePipelineActionRoleDefaultPolicyB176A07F","roles":[{"Ref":"PipelineSourceS3CodePipelineActionRole83895A58"}]}}}}}}}}}}},"Build":{"id":"Build","path":"VariablePipelineStack/Pipeline/Pipeline/Build","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Synth":{"id":"Synth","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"CdkBuildProject":{"id":"CdkBuildProject","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.PipelineProject","version":"0.0.0","metadata":[{},{},{}]},"children":{"Role":{"id":"Role","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportRole":{"id":"ImportRole","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"codebuild.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/codebuild/",{"Ref":"PipelineBuildSynthCdkBuildProject6BEFA8E6"},":*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/codebuild/",{"Ref":"PipelineBuildSynthCdkBuildProject6BEFA8E6"}]]}]},{"Action":["codebuild:BatchPutCodeCoverages","codebuild:BatchPutTestCases","codebuild:CreateReport","codebuild:CreateReportGroup","codebuild:UpdateReport"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":codebuild:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":report-group/",{"Ref":"PipelineBuildSynthCdkBuildProject6BEFA8E6"},"-*"]]}},{"Action":["s3:Abort*","s3:DeleteObject*","s3:GetBucket*","s3:GetObject*","s3:List*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"PipelineBuildSynthCdkBuildProjectRoleDefaultPolicyFB6C941C","roles":[{"Ref":"PipelineBuildSynthCdkBuildProjectRole231EEA2A"}]}}}}}}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/Build/Synth/CdkBuildProject/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.CfnProject","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CodeBuild::Project","aws:cdk:cloudformation:props":{"artifacts":{"type":"CODEPIPELINE"},"cache":{"type":"NO_CACHE"},"description":"Pipeline step VariablePipelineStack/Pipeline/Build/Synth","encryptionKey":"alias/aws/s3","environment":{"type":"LINUX_CONTAINER","image":"aws/codebuild/standard:7.0","imagePullCredentialsType":"CODEBUILD","certificate":{"Fn::Join":["",[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},"/my-certificate.pem"]]},"privilegedMode":false,"fleet":{"fleetArn":{"Fn::GetAtt":["Fleet30813DF3","Arn"]}},"computeType":"BUILD_GENERAL1_SMALL"},"serviceRole":{"Fn::GetAtt":["PipelineBuildSynthCdkBuildProjectRole231EEA2A","Arn"]},"source":{"type":"CODEPIPELINE","buildSpec":"{\n \"version\": \"0.2\",\n \"phases\": {\n \"build\": {\n \"commands\": [\n \"mkdir cdk.out\",\n \"touch cdk.out/dummy\"\n ]\n }\n },\n \"artifacts\": {\n \"base-directory\": \"cdk.out\",\n \"files\": \"**/*\"\n }\n}"}}}}}}}}}},"MyWave":{"id":"MyWave","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Produce":{"id":"Produce","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Produce":{"id":"Produce","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.PipelineProject","version":"0.0.0","metadata":[{},{},{}]},"children":{"Role":{"id":"Role","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportRole":{"id":"ImportRole","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"codebuild.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:Abort*","s3:DeleteObject*","s3:GetBucket*","s3:GetObject*","s3:List*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["TestCacheBucketA6BDC126","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["TestCacheBucketA6BDC126","Arn"]},"/*"]]}]},{"Action":["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/codebuild/",{"Ref":"PipelineMyWaveProduce884410D6"},":*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/codebuild/",{"Ref":"PipelineMyWaveProduce884410D6"}]]}]},{"Action":["codebuild:BatchPutCodeCoverages","codebuild:BatchPutTestCases","codebuild:CreateReport","codebuild:CreateReportGroup","codebuild:UpdateReport"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":codebuild:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":report-group/",{"Ref":"PipelineMyWaveProduce884410D6"},"-*"]]}},{"Action":["s3:GetBucket*","s3:GetObject*","s3:List*"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"PipelineMyWaveProduceRoleDefaultPolicy209239D4","roles":[{"Ref":"PipelineMyWaveProduceRole24E3565D"}]}}}}}}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Produce/Produce/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.CfnProject","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CodeBuild::Project","aws:cdk:cloudformation:props":{"artifacts":{"type":"CODEPIPELINE"},"cache":{"type":"S3","location":{"Fn::Join":["/",[{"Ref":"TestCacheBucketA6BDC126"},{"Ref":"AWS::NoValue"}]]}},"description":"Pipeline step VariablePipelineStack/Pipeline/MyWave/Produce","encryptionKey":"alias/aws/s3","environment":{"type":"LINUX_CONTAINER","image":"aws/codebuild/standard:7.0","imagePullCredentialsType":"CODEBUILD","certificate":{"Fn::Join":["",[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},"/my-certificate.pem"]]},"privilegedMode":false,"fleet":{"fleetArn":{"Fn::GetAtt":["Fleet30813DF3","Arn"]}},"computeType":"BUILD_GENERAL1_SMALL"},"serviceRole":{"Fn::GetAtt":["PipelineMyWaveProduceRole24E3565D","Arn"]},"source":{"type":"CODEPIPELINE","buildSpec":"{\n \"version\": \"0.2\",\n \"env\": {\n \"exported-variables\": [\n \"MY_VAR\"\n ]\n },\n \"phases\": {\n \"build\": {\n \"commands\": [\n \"export MY_VAR=hello\"\n ]\n }\n }\n}"}}}}}}}},"Consume":{"id":"Consume","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"},"children":{"Consume":{"id":"Consume","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.PipelineProject","version":"0.0.0","metadata":[{},{},{}]},"children":{"Role":{"id":"Role","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume/Role","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"roleName":"*","assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportRole":{"id":"ImportRole","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume/Role/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"codebuild.amazonaws.com"}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume/Role/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume/Role/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["s3:Abort*","s3:DeleteObject*","s3:GetBucket*","s3:GetObject*","s3:List*","s3:PutObject","s3:PutObjectLegalHold","s3:PutObjectRetention","s3:PutObjectTagging","s3:PutObjectVersionTagging"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["TestCacheBucketA6BDC126","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["TestCacheBucketA6BDC126","Arn"]},"/*"]]}]},{"Action":["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Effect":"Allow","Resource":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/codebuild/",{"Ref":"PipelineMyWaveConsumeC5D5CCD7"},":*"]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":logs:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":log-group:/aws/codebuild/",{"Ref":"PipelineMyWaveConsumeC5D5CCD7"}]]}]},{"Action":["codebuild:BatchPutCodeCoverages","codebuild:BatchPutTestCases","codebuild:CreateReport","codebuild:CreateReportGroup","codebuild:UpdateReport"],"Effect":"Allow","Resource":{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":codebuild:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":report-group/",{"Ref":"PipelineMyWaveConsumeC5D5CCD7"},"-*"]]}},{"Action":["s3:GetBucket*","s3:GetObject*","s3:List*"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},{"Fn::Join":["",[{"Fn::GetAtt":["PipelineArtifactsBucketAEA9A052","Arn"]},"/*"]]}]}],"Version":"2012-10-17"},"policyName":"PipelineMyWaveConsumeRoleDefaultPolicyC80F0194","roles":[{"Ref":"PipelineMyWaveConsumeRole2A96FF33"}]}}}}}}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/Pipeline/MyWave/Consume/Consume/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_codebuild.CfnProject","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::CodeBuild::Project","aws:cdk:cloudformation:props":{"artifacts":{"type":"CODEPIPELINE"},"cache":{"type":"S3","location":{"Fn::Join":["/",[{"Ref":"TestCacheBucketA6BDC126"},{"Ref":"AWS::NoValue"}]]}},"description":"Pipeline step VariablePipelineStack/Pipeline/MyWave/Consume","encryptionKey":"alias/aws/s3","environment":{"type":"LINUX_CONTAINER","image":"aws/codebuild/standard:7.0","imagePullCredentialsType":"CODEBUILD","certificate":{"Fn::Join":["",[{"Fn::GetAtt":["SourceBucketDDD2130A","Arn"]},"/my-certificate.pem"]]},"privilegedMode":false,"fleet":{"fleetArn":{"Fn::GetAtt":["Fleet30813DF3","Arn"]}},"computeType":"BUILD_GENERAL1_SMALL"},"serviceRole":{"Fn::GetAtt":["PipelineMyWaveConsumeRole2A96FF33","Arn"]},"source":{"type":"CODEPIPELINE","buildSpec":"{\n \"version\": \"0.2\",\n \"phases\": {\n \"build\": {\n \"commands\": [\n \"echo \\\"The variable was: $THE_VAR\\\"\"\n ]\n }\n }\n}"}}}}}}}}}}}},"CodeBuildActionRole":{"id":"CodeBuildActionRole","path":"VariablePipelineStack/Pipeline/CodeBuildActionRole","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":"*"},{"grantAssumeRole":["*"]},{"grant":["*","*"]},{"addToPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"attachInlinePolicy":["*"]},{"attachInlinePolicy":["*"]},{"grantAssumeRole":["*"]},{"grant":["*","*"]},{"addToPolicy":[{}]},{"addToPrincipalPolicy":[{}]},{"grantAssumeRole":["*"]},{"grant":["*","*"]},{"addToPolicy":[{}]},{"addToPrincipalPolicy":[{}]}]},"children":{"ImportCodeBuildActionRole":{"id":"ImportCodeBuildActionRole","path":"VariablePipelineStack/Pipeline/CodeBuildActionRole/ImportCodeBuildActionRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/CodeBuildActionRole/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"AWS":{"Fn::GetAtt":["PipelineRoleB27FAA37","Arn"]}}}],"Version":"2012-10-17"}}}},"DefaultPolicy":{"id":"DefaultPolicy","path":"VariablePipelineStack/Pipeline/CodeBuildActionRole/DefaultPolicy","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Policy","version":"0.0.0","metadata":["*",{"attachToRole":["*"]},{"attachToRole":["*"]},{"addStatements":[{}]},{"addStatements":[{}]},{"addStatements":[{}]}]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/Pipeline/CodeBuildActionRole/DefaultPolicy/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnPolicy","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Policy","aws:cdk:cloudformation:props":{"policyDocument":{"Statement":[{"Action":["codebuild:BatchGetBuilds","codebuild:StartBuild","codebuild:StopBuild"],"Effect":"Allow","Resource":[{"Fn::GetAtt":["PipelineBuildSynthCdkBuildProject6BEFA8E6","Arn"]},{"Fn::GetAtt":["PipelineMyWaveConsumeC5D5CCD7","Arn"]},{"Fn::GetAtt":["PipelineMyWaveProduce884410D6","Arn"]}]}],"Version":"2012-10-17"},"policyName":"PipelineCodeBuildActionRoleDefaultPolicy1D62A6FE","roles":[{"Ref":"PipelineCodeBuildActionRole226DB0CB"}]}}}}}}}}},"TestCacheBucket":{"id":"TestCacheBucket","path":"VariablePipelineStack/TestCacheBucket","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.Bucket","version":"0.0.0","metadata":["*"]},"children":{"Resource":{"id":"Resource","path":"VariablePipelineStack/TestCacheBucket/Resource","constructInfo":{"fqn":"aws-cdk-lib.aws_s3.CfnBucket","version":"0.0.0"},"attributes":{"aws:cdk:cloudformation:type":"AWS::S3::Bucket","aws:cdk:cloudformation:props":{}}}}},"BootstrapVersion":{"id":"BootstrapVersion","path":"VariablePipelineStack/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"VariablePipelineStack/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}},"VariablePipelineTest":{"id":"VariablePipelineTest","path":"VariablePipelineTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTest","version":"0.0.0"},"children":{"DefaultTest":{"id":"DefaultTest","path":"VariablePipelineTest/DefaultTest","constructInfo":{"fqn":"@aws-cdk/integ-tests-alpha.IntegTestCase","version":"0.0.0"},"children":{"Default":{"id":"Default","path":"VariablePipelineTest/DefaultTest/Default","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}},"DeployAssert":{"id":"DeployAssert","path":"VariablePipelineTest/DefaultTest/DeployAssert","constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"},"children":{"BootstrapVersion":{"id":"BootstrapVersion","path":"VariablePipelineTest/DefaultTest/DeployAssert/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"VariablePipelineTest/DefaultTest/DeployAssert/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}}}}}}},"Tree":{"id":"Tree","path":"Tree","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}}}} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.ts b/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.ts index 7f75e04e11164..14263bc29bfb6 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/pipelines/test/integ.pipeline-with-variables.ts @@ -23,6 +23,19 @@ class PipelineStack extends Stack { // }), commands: ['mkdir cdk.out', 'touch cdk.out/dummy'], }), + codeBuildDefaults: { + buildEnvironment: { + fleet: new codebuild.Fleet(this, 'Fleet', { + baseCapacity: 1, + computeType: codebuild.FleetComputeType.SMALL, + environmentType: codebuild.EnvironmentType.LINUX_CONTAINER, + }), + certificate: { + bucket: sourceBucket, + objectKey: 'my-certificate.pem', + }, + }, + }, selfMutation: false, }); diff --git a/packages/aws-cdk-lib/pipelines/lib/codepipeline/private/codebuild-factory.ts b/packages/aws-cdk-lib/pipelines/lib/codepipeline/private/codebuild-factory.ts index a9f164dca8d03..e1e9fe3b99f16 100644 --- a/packages/aws-cdk-lib/pipelines/lib/codepipeline/private/codebuild-factory.ts +++ b/packages/aws-cdk-lib/pipelines/lib/codepipeline/private/codebuild-factory.ts @@ -440,7 +440,7 @@ export function mergeCodeBuildOptions(...opts: Array; } } @@ -453,13 +453,23 @@ function mergeBuildEnvironments(a?: codebuild.BuildEnvironment, b?: codebuild.Bu return { buildImage: b.buildImage ?? a.buildImage, computeType: b.computeType ?? a.computeType, + dockerServer: b.dockerServer ?? a.dockerServer, + fleet: b.fleet ?? a.fleet, + privileged: b.privileged ?? a.privileged, + certificate: b.certificate ?? a.certificate, environmentVariables: { ...a.environmentVariables, ...b.environmentVariables, }, - privileged: b.privileged ?? a.privileged, - dockerServer: b.dockerServer ?? a.dockerServer, - }; + } satisfies OptionalToUndefined; +} + +// Turns `{ foo?: boolean, bar: number }` into `{ foo: boolean | undefined, bar: +// number }`. Lets us assert that we are enumerating all properties on a type. +// +// Ref: https://stackoverflow.com/a/52973675 +type OptionalToUndefined = { + [K in keyof Required]: T[K]; } function isDefined(x: A | undefined): x is NonNullable { diff --git a/packages/aws-cdk-lib/pipelines/test/compliance/synths.test.ts b/packages/aws-cdk-lib/pipelines/test/compliance/synths.test.ts index 5ff3552327e4e..164634e7ba454 100644 --- a/packages/aws-cdk-lib/pipelines/test/compliance/synths.test.ts +++ b/packages/aws-cdk-lib/pipelines/test/compliance/synths.test.ts @@ -164,6 +164,12 @@ test('CodeBuild: environment variables specified in multiple places are correctl const securityGroup = new ec2.SecurityGroup(pipelineStack, 'SecurityGroup', { vpc, }); + const bucket = s3.Bucket.fromBucketArn(pipelineStack, 'Bucket', 'arn:aws:s3:::this-particular-bucket'); + const fleet = new cbuild.Fleet(pipelineStack, 'Fleet', { + baseCapacity: 1, + computeType: cbuild.FleetComputeType.SMALL, + environmentType: cbuild.EnvironmentType.LINUX_CONTAINER, + }); new ModernTestGitHubNpmPipeline(pipelineStack, 'Cdk-1', { synth: new CodeBuildStep('Synth', { @@ -186,6 +192,8 @@ test('CodeBuild: environment variables specified in multiple places are correctl computeType: cbuild.DockerServerComputeType.SMALL, securityGroups: [securityGroup], }, + certificate: { bucket, objectKey: 'my-certificate' }, + fleet, }, }), }); @@ -233,6 +241,10 @@ test('CodeBuild: environment variables specified in multiple places are correctl 'Fn::GetAtt': ['SecurityGroupDD263621', 'GroupId'], }], }, + Certificate: 'arn:aws:s3:::this-particular-bucket/my-certificate', + Fleet: { + FleetArn: { 'Fn::GetAtt': [Match.stringLikeRegexp('Fleet.*'), 'Arn'] }, + }, }), Source: { BuildSpec: Match.serializedJson(Match.objectLike({