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
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" ] },
.........
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With