diff --git a/packages/@aws-cdk/aws-codepipeline-actions/lib/ecr/source-action.ts b/packages/@aws-cdk/aws-codepipeline-actions/lib/ecr/source-action.ts index 0485d450e82d8..9e2088d9510c0 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/lib/ecr/source-action.ts +++ b/packages/@aws-cdk/aws-codepipeline-actions/lib/ecr/source-action.ts @@ -1,5 +1,6 @@ import * as codepipeline from '@aws-cdk/aws-codepipeline'; import * as ecr from '@aws-cdk/aws-ecr'; +import { Rule } from '@aws-cdk/aws-events'; import * as targets from '@aws-cdk/aws-events-targets'; import * as iam from '@aws-cdk/aws-iam'; import { Names } from '@aws-cdk/core'; @@ -85,16 +86,27 @@ export class EcrSourceAction extends Action { }; } - protected bound(_scope: Construct, stage: codepipeline.IStage, options: codepipeline.ActionBindOptions): + protected bound(scope: Construct, stage: codepipeline.IStage, options: codepipeline.ActionBindOptions): codepipeline.ActionConfig { options.role.addToPolicy(new iam.PolicyStatement({ actions: ['ecr:DescribeImages'], resources: [this.props.repository.repositoryArn], })); - this.props.repository.onCloudTrailImagePushed(Names.nodeUniqueId(stage.pipeline.node) + 'SourceEventRule', { - target: new targets.CodePipeline(stage.pipeline), - imageTag: this.props.imageTag === '' ? undefined : (this.props.imageTag ?? 'latest'), + new Rule(scope, Names.nodeUniqueId(stage.pipeline.node) + 'SourceEventRule', { + targets: [ + new targets.CodePipeline(stage.pipeline), + ], + eventPattern: { + detailType: ['ECR Image Action'], + source: ['aws.ecr'], + detail: { + 'result': ['SUCCESS'], + 'repository-name': [this.props.repository.repositoryName], + 'image-tag': [this.props.imageTag === '' ? undefined : (this.props.imageTag ?? 'latest')], + 'action-type': ['PUSH'], + }, + }, }); // the Action Role also needs to write to the Pipeline's bucket diff --git a/packages/@aws-cdk/aws-codepipeline-actions/test/ecr/ecr-source-action.test.ts b/packages/@aws-cdk/aws-codepipeline-actions/test/ecr/ecr-source-action.test.ts index 99752272df90f..a728a9f9c5e45 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/test/ecr/ecr-source-action.test.ts +++ b/packages/@aws-cdk/aws-codepipeline-actions/test/ecr/ecr-source-action.test.ts @@ -63,9 +63,10 @@ describe('ecr source action', () => { Template.fromStack(stack).hasResourceProperties('AWS::Events::Rule', { 'EventPattern': { 'detail': { - 'requestParameters': { - 'imageTag': ['latest'], - }, + 'result': ['SUCCESS'], + 'repository-name': ['repo'], + 'image-tag': ['latest'], + 'action-type': ['PUSH'], }, }, }); @@ -110,9 +111,10 @@ describe('ecr source action', () => { 'aws.ecr', ], 'detail': { - 'requestParameters': { - 'imageTag': Match.absent(), - }, + 'result': ['SUCCESS'], + 'repository-name': ['repo'], + 'image-tag': [], + 'action-type': ['PUSH'], }, }, }); diff --git a/packages/@aws-cdk/aws-codepipeline-actions/test/integ.pipeline-ecr-source.ts b/packages/@aws-cdk/aws-codepipeline-actions/test/integ.pipeline-ecr-source.ts index 9e6e4b497a7a7..96352d7606838 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/test/integ.pipeline-ecr-source.ts +++ b/packages/@aws-cdk/aws-codepipeline-actions/test/integ.pipeline-ecr-source.ts @@ -2,8 +2,28 @@ import * as codepipeline from '@aws-cdk/aws-codepipeline'; import * as ecr from '@aws-cdk/aws-ecr'; import * as s3 from '@aws-cdk/aws-s3'; import * as cdk from '@aws-cdk/core'; +import { IntegTest } from '@aws-cdk/integ-tests'; import * as cpactions from '../lib'; +/** + * Manual validation steps + * + * Run test with `-vv` so that the outputs are printed and + * `--no-clean` flag so that the stack is not deleted after the deployment is complete + * + * You should see output like: + * + * Outputs: + * aws-cdk-codepipeline-ecr-source.PipelineConsoleLink = https://us-east-1.console.aws.amazon.com/codesuite/codepipeline/pipelines/aws-cdk-codepipeline-ecr-source-MyPipelineAED38ECF-1P0OYRLWF8FHY/view?region=us-east-1 + * aws-cdk-codepipeline-ecr-source.LoginCommand = aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 11111111111.dkr.ecr.us-east-1.amazonaws.com + * aws-cdk-codepipeline-ecr-source.PushCommand = docker tag public.ecr.aws/lambda/provided 11111111111.dkr.ecr.us-east-1.amazonaws.com/aws-cdk-codepipeline-ecr-source-myecrrepo767466d0-gsrntpvfwc5w:latest \ + * && docker push 11111111111.dkr.ecr.us-east-1.amazonaws.com/aws-cdk-codepipeline-ecr-source-myecrrepo767466d0-gsrntpvfwc5w:latest + * + * Run the LoginCommand & PushCommand to tag and push an image to the ECR repository. + * Then use the PipelineConsoleLink to navigate to the pipeline console page to validate that the pipeline + * was triggered successfully. + */ + const app = new cdk.App(); const stack = new cdk.Stack(app, 'aws-cdk-codepipeline-ecr-source'); @@ -28,4 +48,18 @@ sourceStage.addAction(new cpactions.EcrSourceAction({ const approveStage = pipeline.addStage({ stageName: 'Approve' }); approveStage.addAction(new cpactions.ManualApprovalAction({ actionName: 'ManualApproval' })); -app.synth(); +new cdk.CfnOutput(stack, 'LoginCommand', { + value: `aws ecr get-login-password --region ${stack.region} | docker login --username AWS --password-stdin ${stack.account}.dkr.ecr.${stack.region}.amazonaws.com`, +}); + +new cdk.CfnOutput(stack, 'PushCommand', { + value: `docker tag public.ecr.aws/lambda/provided ${repository.repositoryUriForTag('latest')} && docker push ${repository.repositoryUriForTag('latest')}`, +}); + +new cdk.CfnOutput(stack, 'PipelineConsoleLink', { + value: `https://${stack.region}.console.aws.amazon.com/codesuite/codepipeline/pipelines/${pipeline.pipelineName}/view?region=${stack.region}`, +}); + +new IntegTest(app, 'ecr-source-action', { + testCases: [stack], +}); diff --git a/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/aws-cdk-codepipeline-ecr-source.assets.json b/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/aws-cdk-codepipeline-ecr-source.assets.json deleted file mode 100644 index 7d558c9ce0ef2..0000000000000 --- a/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/aws-cdk-codepipeline-ecr-source.assets.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": "17.0.0", - "files": { - "26ccd3bf4d70f3a3d93ba25dda6e7050ccbb8dd879a7828708b8d8774abf0292": { - "source": { - "path": "aws-cdk-codepipeline-ecr-source.template.json", - "packaging": "file" - }, - "destinations": { - "current_account-current_region": { - "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "26ccd3bf4d70f3a3d93ba25dda6e7050ccbb8dd879a7828708b8d8774abf0292.json", - "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" - } - } - } - }, - "dockerImages": {} -} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/aws-cdk-codepipeline-ecr-source.template.json b/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/aws-cdk-codepipeline-ecr-source.template.json index db4a6bc1e26d3..eae0a42075cd0 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/aws-cdk-codepipeline-ecr-source.template.json +++ b/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/aws-cdk-codepipeline-ecr-source.template.json @@ -260,6 +260,70 @@ ] } }, + "MyPipelineSourceECRSourceawscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRuleF3B28B14": { + "Type": "AWS::Events::Rule", + "Properties": { + "EventPattern": { + "detail-type": [ + "ECR Image Action" + ], + "source": [ + "aws.ecr" + ], + "detail": { + "result": [ + "SUCCESS" + ], + "repository-name": [ + { + "Ref": "MyEcrRepo767466D0" + } + ], + "image-tag": [ + "latest" + ], + "action-type": [ + "PUSH" + ] + } + }, + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":codepipeline:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "MyPipelineAED38ECF" + } + ] + ] + }, + "Id": "Target0", + "RoleArn": { + "Fn::GetAtt": [ + "MyPipelineEventsRoleFAB99F32", + "Arn" + ] + } + } + ] + } + }, "MyPipelineEventsRoleFAB99F32": { "Type": "AWS::IAM::Role", "Properties": { @@ -356,67 +420,143 @@ "Type": "AWS::ECR::Repository", "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" + } + }, + "Outputs": { + "LoginCommand": { + "Value": { + "Fn::Join": [ + "", + [ + "aws ecr get-login-password --region ", + { + "Ref": "AWS::Region" + }, + " | docker login --username AWS --password-stdin ", + { + "Ref": "AWS::AccountId" + }, + ".dkr.ecr.", + { + "Ref": "AWS::Region" + }, + ".amazonaws.com" + ] + ] + } }, - "MyEcrRepoawscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRule911FDB6D": { - "Type": "AWS::Events::Rule", - "Properties": { - "EventPattern": { - "source": [ - "aws.ecr" - ], - "detail-type": [ - "AWS API Call via CloudTrail" - ], - "detail": { - "requestParameters": { - "repositoryName": [ + "PushCommand": { + "Value": { + "Fn::Join": [ + "", + [ + "docker tag public.ecr.aws/lambda/provided ", + { + "Fn::Select": [ + 4, + { + "Fn::Split": [ + ":", + { + "Fn::GetAtt": [ + "MyEcrRepo767466D0", + "Arn" + ] + } + ] + } + ] + }, + ".dkr.ecr.", + { + "Fn::Select": [ + 3, { - "Ref": "MyEcrRepo767466D0" + "Fn::Split": [ + ":", + { + "Fn::GetAtt": [ + "MyEcrRepo767466D0", + "Arn" + ] + } + ] } - ], - "imageTag": [ - "latest" ] }, - "eventName": [ - "PutImage" - ] - } - }, - "State": "ENABLED", - "Targets": [ - { - "Arn": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":codepipeline:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":", - { - "Ref": "MyPipelineAED38ECF" - } - ] + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/", + { + "Ref": "MyEcrRepo767466D0" + }, + ":latest && docker push ", + { + "Fn::Select": [ + 4, + { + "Fn::Split": [ + ":", + { + "Fn::GetAtt": [ + "MyEcrRepo767466D0", + "Arn" + ] + } + ] + } ] }, - "Id": "Target0", - "RoleArn": { - "Fn::GetAtt": [ - "MyPipelineEventsRoleFAB99F32", - "Arn" + ".dkr.ecr.", + { + "Fn::Select": [ + 3, + { + "Fn::Split": [ + ":", + { + "Fn::GetAtt": [ + "MyEcrRepo767466D0", + "Arn" + ] + } + ] + } ] + }, + ".", + { + "Ref": "AWS::URLSuffix" + }, + "/", + { + "Ref": "MyEcrRepo767466D0" + }, + ":latest" + ] + ] + } + }, + "PipelineConsoleLink": { + "Value": { + "Fn::Join": [ + "", + [ + "https://", + { + "Ref": "AWS::Region" + }, + ".console.aws.amazon.com/codesuite/codepipeline/pipelines/", + { + "Ref": "MyPipelineAED38ECF" + }, + "/view?region=", + { + "Ref": "AWS::Region" } - } + ] ] } } diff --git a/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/cdk.out b/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/cdk.out index 90bef2e09ad39..588d7b269d34f 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/cdk.out +++ b/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/cdk.out @@ -1 +1 @@ -{"version":"17.0.0"} \ No newline at end of file +{"version":"20.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/ecrsourceactionDefaultTestDeployAssert981BA701.template.json b/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/ecrsourceactionDefaultTestDeployAssert981BA701.template.json new file mode 100644 index 0000000000000..9e26dfeeb6e64 --- /dev/null +++ b/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/ecrsourceactionDefaultTestDeployAssert981BA701.template.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/integ.json b/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/integ.json index 43d9ee3493030..0fe37af13af32 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/integ.json +++ b/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/integ.json @@ -1,14 +1,11 @@ { "version": "20.0.0", "testCases": { - "integ.pipeline-ecr-source": { + "ecr-source-action/DefaultTest": { "stacks": [ "aws-cdk-codepipeline-ecr-source" ], - "diffAssets": false, - "stackUpdateWorkflow": true + "assertionStack": "ecrsourceactionDefaultTestDeployAssert981BA701" } - }, - "synthContext": {}, - "enableLookups": false + } } \ No newline at end of file diff --git a/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/manifest.json b/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/manifest.json index aade2ac999d5e..937c1ee681059 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/manifest.json +++ b/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/manifest.json @@ -1,5 +1,5 @@ { - "version": "17.0.0", + "version": "20.0.0", "artifacts": { "Tree": { "type": "cdk:tree", @@ -51,6 +51,12 @@ "data": "MyPipelineSourceECRSourceCodePipelineActionRoleDefaultPolicy7646B7FE" } ], + "/aws-cdk-codepipeline-ecr-source/MyPipeline/Source/ECR_Source/awscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRule/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyPipelineSourceECRSourceawscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRuleF3B28B14" + } + ], "/aws-cdk-codepipeline-ecr-source/MyPipeline/EventsRole/Resource": [ { "type": "aws:cdk:logicalId", @@ -75,14 +81,35 @@ "data": "MyEcrRepo767466D0" } ], - "/aws-cdk-codepipeline-ecr-source/MyEcrRepo/awscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRule/Resource": [ + "/aws-cdk-codepipeline-ecr-source/LoginCommand": [ + { + "type": "aws:cdk:logicalId", + "data": "LoginCommand" + } + ], + "/aws-cdk-codepipeline-ecr-source/PushCommand": [ + { + "type": "aws:cdk:logicalId", + "data": "PushCommand" + } + ], + "/aws-cdk-codepipeline-ecr-source/PipelineConsoleLink": [ { "type": "aws:cdk:logicalId", - "data": "MyEcrRepoawscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRule911FDB6D" + "data": "PipelineConsoleLink" } ] }, "displayName": "aws-cdk-codepipeline-ecr-source" + }, + "ecrsourceactionDefaultTestDeployAssert981BA701": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "ecrsourceactionDefaultTestDeployAssert981BA701.template.json", + "validateOnSynth": false + }, + "displayName": "ecr-source-action/DefaultTest/DeployAssert" } } } \ No newline at end of file diff --git a/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/tree.json b/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/tree.json index d06e98074029c..03238759a0f28 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/tree.json +++ b/packages/@aws-cdk/aws-codepipeline-actions/test/pipeline-ecr-source.integ.snapshot/tree.json @@ -9,7 +9,7 @@ "path": "Tree", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.0.9" + "version": "10.1.71" } }, "aws-cdk-codepipeline-ecr-source": { @@ -380,17 +380,99 @@ "fqn": "@aws-cdk/aws-iam.Role", "version": "0.0.0" } + }, + "awscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRule": { + "id": "awscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRule", + "path": "aws-cdk-codepipeline-ecr-source/MyPipeline/Source/ECR_Source/awscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRule", + "children": { + "Resource": { + "id": "Resource", + "path": "aws-cdk-codepipeline-ecr-source/MyPipeline/Source/ECR_Source/awscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRule/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Events::Rule", + "aws:cdk:cloudformation:props": { + "eventPattern": { + "detail-type": [ + "ECR Image Action" + ], + "source": [ + "aws.ecr" + ], + "detail": { + "result": [ + "SUCCESS" + ], + "repository-name": [ + { + "Ref": "MyEcrRepo767466D0" + } + ], + "image-tag": [ + "latest" + ], + "action-type": [ + "PUSH" + ] + } + }, + "state": "ENABLED", + "targets": [ + { + "id": "Target0", + "arn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":codepipeline:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":", + { + "Ref": "MyPipelineAED38ECF" + } + ] + ] + }, + "roleArn": { + "Fn::GetAtt": [ + "MyPipelineEventsRoleFAB99F32", + "Arn" + ] + } + } + ] + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-events.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-events.Rule", + "version": "0.0.0" + } } }, "constructInfo": { "fqn": "constructs.Construct", - "version": "10.0.9" + "version": "10.1.71" } } }, "constructInfo": { "fqn": "constructs.Construct", - "version": "10.0.9" + "version": "10.1.71" } }, "EventsRole": { @@ -550,13 +632,13 @@ }, "constructInfo": { "fqn": "constructs.Construct", - "version": "10.0.9" + "version": "10.1.71" } } }, "constructInfo": { "fqn": "constructs.Construct", - "version": "10.0.9" + "version": "10.1.71" } } }, @@ -580,97 +662,76 @@ "fqn": "@aws-cdk/aws-ecr.CfnRepository", "version": "0.0.0" } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-ecr.Repository", + "version": "0.0.0" + } + }, + "LoginCommand": { + "id": "LoginCommand", + "path": "aws-cdk-codepipeline-ecr-source/LoginCommand", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnOutput", + "version": "0.0.0" + } + }, + "PushCommand": { + "id": "PushCommand", + "path": "aws-cdk-codepipeline-ecr-source/PushCommand", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnOutput", + "version": "0.0.0" + } + }, + "PipelineConsoleLink": { + "id": "PipelineConsoleLink", + "path": "aws-cdk-codepipeline-ecr-source/PipelineConsoleLink", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnOutput", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/core.Stack", + "version": "0.0.0" + } + }, + "ecr-source-action": { + "id": "ecr-source-action", + "path": "ecr-source-action", + "children": { + "DefaultTest": { + "id": "DefaultTest", + "path": "ecr-source-action/DefaultTest", + "children": { + "Default": { + "id": "Default", + "path": "ecr-source-action/DefaultTest/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.71" + } }, - "awscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRule": { - "id": "awscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRule", - "path": "aws-cdk-codepipeline-ecr-source/MyEcrRepo/awscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRule", - "children": { - "Resource": { - "id": "Resource", - "path": "aws-cdk-codepipeline-ecr-source/MyEcrRepo/awscdkcodepipelineecrsourceMyPipeline63CF3194SourceEventRule/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::Events::Rule", - "aws:cdk:cloudformation:props": { - "eventPattern": { - "source": [ - "aws.ecr" - ], - "detail-type": [ - "AWS API Call via CloudTrail" - ], - "detail": { - "requestParameters": { - "repositoryName": [ - { - "Ref": "MyEcrRepo767466D0" - } - ], - "imageTag": [ - "latest" - ] - }, - "eventName": [ - "PutImage" - ] - } - }, - "state": "ENABLED", - "targets": [ - { - "id": "Target0", - "arn": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":codepipeline:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":", - { - "Ref": "MyPipelineAED38ECF" - } - ] - ] - }, - "roleArn": { - "Fn::GetAtt": [ - "MyPipelineEventsRoleFAB99F32", - "Arn" - ] - } - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-events.CfnRule", - "version": "0.0.0" - } - } - }, + "DeployAssert": { + "id": "DeployAssert", + "path": "ecr-source-action/DefaultTest/DeployAssert", "constructInfo": { - "fqn": "@aws-cdk/aws-events.Rule", + "fqn": "@aws-cdk/core.Stack", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/aws-ecr.Repository", + "fqn": "@aws-cdk/integ-tests.IntegTestCase", "version": "0.0.0" } } }, "constructInfo": { - "fqn": "@aws-cdk/core.Stack", + "fqn": "@aws-cdk/integ-tests.IntegTest", "version": "0.0.0" } }