AWS — CodeBuild: Добавляем инкрементный номер сборки

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

Метки: Метки

Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии