Intellipaat Back

Explore Courses Blog Tutorials Interview Questions
0 votes
2 views
in AWS by (19.1k points)

I am trying to use the AWS CodeBuild Id as a tag for my docker image. This docker image is built in the build phase of CodeBuild. I want to get this Coudebuild Id which is my docker tag in AWS Code Pipeline phase. How do I access these codebuild environment variables in aws codepipeline?

CodeBuild Phase:

CodeBuildProject:

Type: AWS::CodeBuild::Project

Properties:

  Artifacts:

    Location: !Ref ArtifactBucket

    Type: "S3"

  Source:

    Location: !Sub ${ArtifactBucket}/source.zip

    Type: "S3"

    BuildSpec: |

      version: 0.1

      phases:

        pre_build:

          commands:

            - $(aws ecr get-login --region $AWS_DEFAULT_REGION)

            - sudo apt-get update

            - echo Pulling maven image...

            - docker pull maven:3.3-jdk-8

            - echo done with the pre build phase

        build:

          commands:

            - echo Build started on `date`

            - printf "%s" $REPOSITORY_URI

            - docker run -i --rm -w /opt/maven -v $PWD:/opt/maven -v $HOME/.m2:/root/.m2 maven:3.3-jdk-8 mvn clean install

            - docker build --file Dockerfile --tag $REPOSITORY_URI:$CODEBUILD_BUILD_ID .

        post_build:

          commands:

            - echo post build

            - docker push $REPOSITORY_URI:$CODEBUILD_BUILD_ID

        discard-paths: yes

  Environment:

    ComputeType: "BUILD_GENERAL1_LARGE" 

    Image: "aws/codebuild/docker:1.12.1"

    Type: "LINUX_CONTAINER"

    EnvironmentVariables:

      - Name: AWS_DEFAULT_REGION

        Value: !Ref AWS::Region

      - Name: REPOSITORY_URI

        Value: !Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${Repository}

      - Name: PipelineName

        Value: !Ref PipelineName

  Name: !Ref AWS::StackName

  ServiceRole: !Ref CodeBuildServiceRole

Here my docker image is now a combination of my Repository Url and my codebuild id. I want to use this codebuild id in the deploy phase of aws codepipeline, how to get it?

 Pipeline:

Type: AWS::CodePipeline::Pipeline

Properties:

  Name: !Ref PipelineName

  RoleArn: !GetAtt CodePipelineServiceRole.Arn

  ArtifactStore:

    Type: S3

    Location: !Ref ArtifactBucket

  Stages:

    - Name: Source

      Actions:

        - Name: GitHubRepoSource

          ActionTypeId:

            Category: Source

            Owner: ThirdParty

            Provider: GitHub

            Version: 1

          Configuration:

            Owner: !Ref GitHubUser

            Repo: !Ref GitHubRepo

            Branch: !Ref GitHubBranch

            OAuthToken: !Ref GitHubToken

          OutputArtifacts:

            - Name: GitHubRepoSource

          RunOrder: 1

    - Name: Build

      Actions:

        - Name: Build

          ActionTypeId:

            Category: Build

            Owner: AWS

            Version: 1

            Provider: CodeBuild

          Configuration:

            ProjectName: !Ref CodeBuildProject

          InputArtifacts:

            - Name: GitHubRepoSource

          OutputArtifacts:

            - Name: BuildOutput

          RunOrder: 1

    - Name: Deploy

      Actions:

        - Name: Deploy

          ActionTypeId:

            Category: Deploy

            Owner: AWS

            Version: 1

            Provider: CloudFormation

          Configuration:

            ChangeSetName: Deploy

            ActionMode: CREATE_UPDATE

            StackName: !Sub "${AWS::StackName}-Service"

            Capabilities: CAPABILITY_NAMED_IAM

            TemplatePath: https://s3.amazonaws.com/cicdoveraws-visa/service.yaml

            RoleArn: !GetAtt CloudFormationExecutionRole.Arn

            ParameterOverrides: !Sub |

              {

                "Tag" : "${}",

                "DesiredCount": "2",

                "Cluster": "${ECSCluster}",

                "TargetGroup": "${ECSTG}",

                "ImageName": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${Repository}:<Tag Name>,

                "ContainerName": "${ContainerName}",

                "Cpu": "${Cpu}",

                "Memory": "${Memory}",

                "ContainerPort": "${ContainerPort}" 

              }

          InputArtifacts:

            - Name: BuildOutput

          RunOrder: 1

1 Answer

0 votes
by (44.4k points)

You can write a build.json file with tag information during post_build phase of your code build

post_build:

      commands:

        - echo post build

        - docker push $REPOSITORY_URI:$CODEBUILD_BUILD_ID

        - printf '{"Tag":"%s"}' "$REPOSITORY_URI:$CODEBUILD_BUILD_ID" > /tmp/build.json

artifacts:

    files: /tmp/build.json

    discard-paths: yes

In your pipeline, you can now simply read your tag as follows:

ParameterOverrides: !Sub |

 {

   "Tag" : { "Fn::GetParam" : [ "BuildOutput", "build.json", "Tag" ] },

 .........

 }

Related questions

Want to get 50% Hike on your Salary?

Learn how we helped 50,000+ professionals like you !

31k questions

32.8k answers

501 comments

693 users

Browse Categories

...