Как оказалось CodeBuild не имеет встроенной инкрементной переменной для номера сборки, как в том же Jenkins'е к примеру.
Решение было найдено на medium.com
Для добавления номера сборки понадобятся следующие сервисы:
- AWS SSM (Systems Manager Parameter Store)
- AWS Lambda
- AWS CloudWatch
- AWS IAM
Создаем Parameter Store
Переходим в сервис AWS Systems Manager —> Parameter Store
Создаем параметр с именем "/build-number/artem-test"
Задаем параметры:
- Type: String
- Value: 1
Сохраняем наш "Parameter store"
Переходим в AIM -> Policy
Создаем новую Policy с именем "codebuild-buildnumber-ssm" для "CodeBild" проекта со следующим содержимым:
"Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameter", "ssm:GetParameters" ], "Resource": "arn:aws:ssm:us-east-1:XXXXXXXXXXXX:parameter/build-number/*" } ]
XXXXXXXXXXXX — замените на свой AWS ID. Так же проверьте свой регион.
Переходим в AIM -> Roles и находим роль CodeBuild для нашего проекта и делаем ему "Attach" созданного Policy.
Создаем Lambda функцию.
Переходим в сервис Lambda -> "Create function"
Задаем имя "update-codebuild-build-number" и выбираем "Node.js 8.10"
Вставляем следующий код:
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(); };
Сохраняем изменения.
Переходим в AIM -> Policy
Создаем новую Policy с именем "lambda-buildnumber-ssm" для "Lambda" проекта со следующим содержимым:
{ "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 — замените на свой AWS ID. Так же проверьте свой регион.
Переходим в AIM -> Roles и находим роль Lambda для нашего проекта и делаем ему "Attach" созданного Policy.
Создаем правило CloudWatch
Переходим в сервис CloudWatch -> "Create rule" -> "Event Pattern"
Указываем сервис — CodeBuild
Указываем Event Type -> "CodeBuild Build State Change"
Указываем "Specific state(s)" и выбираем состояния "SUCCESS" и "FAILED"
Переходим к "Targets" и выбираем в "Function" "update-codebuild-build-number"
Подтверждаем "Create rule", задаем имя "update-codebuild-build-number" и сохраняем.
CodeBuild
Редактируем "buildspec.yml"
Добавляем в блок "parameter-store" переменную для хранения номера сборки.
env: parameter-store: BUILD_NUMBER: "/build-number/artem-test"
Теперь в сборках можно использовать переменную "BUILD_NUMBER" котора будет инкрементится.
Пример простой работы с CodeCommit и Codebuild можно глянуть в предыдущей статье.