As it turned out, CodeBuild does not have a built-in incremental variable for the build number, as in Jenkins, for example.
The solution was found on medium.com
To add the build number you will need the following services:
- AWS SSM (Systems Manager Parameter Store)
- AWS Lambda
- AWS CloudWatch
- AWS IAM
Create Parameter Store
Go to the service AWS Systems Manager –> Parameter Store
Create a parameter named "/build-number/artem-test"
Set the parameters:
- Type: String
- Value: 1
Save our "Parameter store"
Go to AIM -> Policy
Create a new Policy with the name "codebuild-buildnumber-ssm" for the "CodeBild" project with the following contents:
"Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameter", "ssm:GetParameters" ], "Resource": "arn:aws:ssm:us-east-1:XXXXXXXXXXXX:parameter/build-number/*" } ]
XXXXXXXXXXXX – replace with your AWS ID. Also check your region.
Go to AIM -> Roles and find the role of CodeBuild for our project and make it "Attach" created by the Policy.
Create a Lambda function
Go to Lambda -> "Create function"
Set the name "update-codebuild-build-number" and select "Node.js 8.10"
Insert the following code:
const AWS = require('aws-sdk'); const ssm = new AWS.SSM(); exports.handler = async (event) => { const parameterName = '/build-number/' + event['detail']['project-name']; const getBuildNumberParams = { Name: parameterName }; const getBuildNumberResponse = await ssm.getParameter(getBuildNumberParams).promise(); const buildNumber = parseInt(getBuildNumberResponse.Parameter.Value); const setBuildNumberParams = { Name: parameterName, Type: 'String', Value: (buildNumber + 1).toString(), Overwrite: true }; const setBuildNumberResponse = await ssm.putParameter(setBuildNumberParams).promise(); };
Save the changes.
Go to AIM -> Policy
Create a new Policy with the name "lambda-buildnumber-ssm" for the "Lambda" project with the following contents:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameter", "ssm:GetParameters", "ssm:PutParameter" ], "Resource": "arn:aws:ssm:us-east-1:XXXXXXXXXXXX:parameter/build-number/*" } ] }
XXXXXXXXXXXX – replace with your AWS ID. Also check your region.
Go to AIM -> Roles and find the role of Lambda for our project and make it "Attach" created by the Policy.
Create a CloudWatch rule
Go to CloudWatch -> "Create rule" -> "Event Pattern"
Specify service – CodeBuild
Set the Event Type -> "CodeBuild Build State Change"
Specify "Specific state (s)" and select the states "SUCCESS" and "FAILED"
Go to "Targets" and select in the "Function" "update-codebuild-build-number"
Confirm the "Create rule", set the name "update-codebuild-build-number" and save.
CodeBuild
Editing "buildspec.yml"
Add a variable to the "parameter-store" block to store the build number.
env: parameter-store: BUILD_NUMBER: "/build-number/artem-test"
Now in assemblies you can use the variable "BUILD_NUMBER" which will be incremented.
An example of a simple work with CodeCommit and Codebuild can be found in the previous post.