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 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии