Настраиваемая метка версии с конвейером кода aws

Я использую AWS CodePipeline с CodeBuild для создания и развертывания своего приложения в ElasticBeanstalk.

CodePipeline генерирует такие имена версий: code-pipeline-1122334455667-MyApp-1ac31f7c-1343-471x-a7e8-46b24f1785a

Можно ли настроить эти метки?


person RoddyRott    schedule 12.11.2018    source источник


Ответы (3)


Вы можете установить метку версии, если используете поставщик действий AWS CodeBuild вместо поставщика действий развертывания AWS ElasticBeanstalk.

CodeBuild имеет возможность запускать команды AWS CLI в buildspec, который вы можете использовать для

  1. загрузите артефакт сборки в S3 (документация)
  2. создайте версию в Elastic Beanstalk (документация)
  3. разверните версию (документация)

Ниже приведен пример спецификации сборки, загружающей артефакт с пользовательской меткой, именем файла и описанием.

version: 0.2

phases:
  build:
    commands:
      - mvn clean package
      - export POM_VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
      - export JAR_NAME='application-'$POM_VERSION'.jar'
      - export EB_VERSION=$POM_VERSION'-'$(date +%s)
      - aws s3 cp target/application.jar s3://bucket-name/$JAR_NAME
      - aws elasticbeanstalk create-application-version --application-name "Application Name" --version-label "$EB_VERSION" --description "$CommitMessage" --source-bundle S3Bucket=bucket-name,S3Key=$JAR_NAME
      - aws elasticbeanstalk update-environment --application-name "Application Name" --version-label "$EB_VERSION" --environment-name "EnvironmentName"

Примечания:

  • $CommitMessage поступает из CodePipeline как переменная среды.
  • Дата добавляется к имени версии, чтобы избежать конфликтов имен.
person Benjamin Bublitz    schedule 06.02.2020
comment
Это отлично сработало для меня! Перешел от процесса развертывания CodePipeline к простому использованию CodeBuild для отправки версий в Elastic Beanstalk. CodePipeline даже создавал разные метки версий для каждой среды, хотя все они были развернуты с помощью одного и того же конвейера, что делало почти невозможным определение того, что на самом деле было развернуто в каждой среде. - person JDWardle; 09.04.2020

Как уже упоминалось, в принципе невозможно обновить version-label в Elastic Beanstalk.

Но мы нашли решение, которое нас устроило. Мы создали отдельный этап в CodePipeline с действием Lambda. Пользовательский параметр — #{source_variables.CommitMessage}, а артефакт ввода — build_output. В лямбда-функции входящее событие считывается для сообщения фиксации

def lambda_handler(event, context):
    commit_message = event['CodePipeline.job']['data']['actionConfiguration']['configuration']['UserParameters']

На следующем шаге считываем версию с package.json с build_output на s3 ведро

# Read out data from package.json on s3 zip object
with tempfile.TemporaryFile() as f:
    s3_resource.meta.client.download_fileobj(s3_bucket_name, s3_object_key, f)
    archive = zipfile.ZipFile(f)
    package_json = archive.open('package.json')
    data = package_json.read() 
    json_data = json.loads(data)
    application_version = json_data['version']

Теперь функция может обновлять описание версии приложения из среды эластичного beanstalk.

# Read out version-label from environemt 
environment = eb_client.describe_environments(ApplicationName=application_name)
version_label = environment['Environments'][0]['VersionLabel']
description = 'Version: {} - Commit Message: {}'.format(application_version, commit_message)

# Write new Description to given elastic Beanstalk Application version 
eb_response = eb_client.update_application_version(
ApplicationName=application_name,
VersionLabel=version_label,
Description=description
)

Теперь мы можем ссылаться на версии наших приложений на версию и коммиты. Пожалуйста, имейте в виду, что это всего лишь фрагменты кода, а не вся логика.

person thorstenleidl    schedule 03.08.2021

На данный момент я считаю, что это невозможно, и это настоящая неприятность, когда мы не можем правильно управлять версиями наших развертываний.

Похоже, что AWS CodePipeline еще не совсем готов к работе в прайм-тайм с точки зрения отслеживаемости и т. д., что также видно по невозможности иметь настраиваемые именованные артефакты, когда этапы CodeBuild включены в конвейер.

Amazon действительно нужно активизировать свою игру в области CI/CD.

person João Nogueira    schedule 25.01.2019