Как оказалось 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 можно глянуть в предыдущей статье.