Accessing AWS CodeBuild Variables in AWS CodePipeline

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

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 code. I want to use this codebuild id in aws codepipeline deployment phase, 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

      

+3


source to share


1 answer


You can write a build.json file with tag information during the 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 like this:

ParameterOverrides: !Sub |
 {
   "Tag" : { "Fn::GetParam" : [ "BuildOutput", "build.json", "Tag" ] },
 .........
 }

      

+3


source







All Articles