github.com/in4it/ecs-deploy@v0.0.42-0.20240508120354-ed77ff16df25/provider/ecs/ecr.go (about) 1 package ecs 2 3 import ( 4 "strconv" 5 6 "github.com/aws/aws-sdk-go/aws" 7 "github.com/aws/aws-sdk-go/aws/awserr" 8 "github.com/aws/aws-sdk-go/aws/session" 9 "github.com/aws/aws-sdk-go/service/ecr" 10 "github.com/in4it/ecs-deploy/util" 11 "github.com/juju/loggo" 12 ) 13 14 // logging 15 var ecrLogger = loggo.GetLogger("ecr") 16 17 // ECR struct 18 type ECR struct { 19 RepositoryName, RepositoryURI string 20 } 21 22 // Creates ECR repository 23 func (e *ECR) CreateRepository() error { 24 scanOnPush, err := strconv.ParseBool(util.GetEnv("ECR_SCAN_ON_PUSH", "false")) 25 if err != nil { 26 ecrLogger.Errorf(err.Error()) 27 scanOnPush = false 28 } 29 svc := ecr.New(session.New()) 30 input := &ecr.CreateRepositoryInput{ 31 RepositoryName: aws.String(e.RepositoryName), 32 ImageScanningConfiguration: &ecr.ImageScanningConfiguration{ 33 ScanOnPush: aws.Bool(scanOnPush), 34 }, 35 } 36 37 res, err := svc.CreateRepository(input) 38 if err == nil && res.Repository.RepositoryUri != nil { 39 e.RepositoryURI = *res.Repository.RepositoryUri 40 41 lifecyclePolicyText := `{ 42 "rules": [ 43 { 44 "rulePriority": 10, 45 "description": "cleanup", 46 "selection": { 47 "tagStatus": "any", 48 "countType": "imageCountMoreThan", 49 "countNumber": 100 50 }, 51 "action": { 52 "type": "expire" 53 } 54 } 55 ] 56 }` 57 58 lifecycleInput := &ecr.PutLifecyclePolicyInput{ 59 RepositoryName: aws.String(e.RepositoryName), 60 LifecyclePolicyText: aws.String(lifecyclePolicyText), 61 RegistryId: aws.String(*res.Repository.RegistryId), 62 } 63 64 _, err := svc.PutLifecyclePolicy(lifecycleInput) 65 return err 66 } else { 67 return err 68 } 69 } 70 func (e *ECR) ListImagesWithTag(repositoryName string) (map[string]string, error) { 71 svc := ecr.New(session.New()) 72 73 images := make(map[string]string) 74 75 input := &ecr.ListImagesInput{ 76 RepositoryName: aws.String(repositoryName), 77 } 78 79 pageNum := 0 80 err := svc.ListImagesPages(input, 81 func(page *ecr.ListImagesOutput, lastPage bool) bool { 82 pageNum++ 83 for _, image := range page.ImageIds { 84 if image.ImageTag != nil { 85 images[*image.ImageTag] = *image.ImageDigest 86 } 87 } 88 return pageNum <= 100 89 }) 90 91 if err != nil { 92 if aerr, ok := err.(awserr.Error); ok { 93 ecrLogger.Errorf(aerr.Error()) 94 } else { 95 ecrLogger.Errorf(err.Error()) 96 } 97 return images, err 98 } 99 return images, nil 100 } 101 102 func (e *ECR) RepositoryExists(repositoryName string) (bool, error) { 103 svc := ecr.New(session.New()) 104 105 var exists bool 106 107 input := &ecr.DescribeRepositoriesInput{ 108 RepositoryNames: aws.StringSlice([]string{repositoryName}), 109 } 110 111 pageNum := 0 112 err := svc.DescribeRepositoriesPages(input, 113 func(page *ecr.DescribeRepositoriesOutput, lastPage bool) bool { 114 pageNum++ 115 if len(page.Repositories) > 0 { 116 exists = true 117 } 118 return pageNum <= 100 119 }) 120 121 if err != nil { 122 if aerr, ok := err.(awserr.Error); ok { 123 switch aerr.Code() { 124 case ecr.ErrCodeRepositoryNotFoundException: 125 return false, nil 126 default: 127 ecrLogger.Errorf(aerr.Error()) 128 } 129 } else { 130 ecrLogger.Errorf(err.Error()) 131 } 132 return exists, err 133 } 134 return exists, nil 135 }