具有AWS Code管道的自定义版本标签

时间:2018-11-12 14:57:29

标签: amazon-web-services amazon-elastic-beanstalk aws-codepipeline aws-codebuild

我将AWS CodePipeline与CodeBuild一起使用,以构建应用程序并将其部署到ElasticBeanstalk。

CodePipeline生成如下的版本名称: code-pipeline-1122334455667-MyApp-1ac31f7c-1343-471x-a7e8-46b24f1785a

是否可以自定义这些标签?

3 个答案:

答案 0 :(得分:5)

如果您使用AWS CodeBuild操作提供程序而不是AWS ElasticBeanstalk部署操作提供程序,则可以设置版本标签。

CodeBuild能够在buildspec中运行AWS CLI命令,您可以使用

  1. 将构建工件上传到S3(documentation
  2. 在Elastic Beanstalk(documentation)中创建一个版本
  3. 部署版本(documentation

下面是一个示例buildspec,它上载了带有自定义标签,文件名和描述的工件。

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作为environment variable来自CodePipeline。
  • 在版本名称后附加日期,以避免命名冲突。

答案 1 :(得分:1)

如前所述,基本上不可能更新 Elastic Beanstalk 中的 version-label

但我们找到了一个适合我们的解决方案。我们使用 Lambda 操作在 CodePipeline 中创建了一个单独的阶段。用户参数为 #{source_variables.CommitMessage},输入工件为 build_output。在 lambda 函数中,传入事件正在读取提交消息

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

在下一步中,我们从 s3 存储桶上的 package.json 中的 build_output 中读出版本

# 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
)

现在我们可以将我们的应用程序版本引用到版本和提交。请记住,这些只是代码片段,而不是整个逻辑。

答案 2 :(得分:0)

目前,我认为这是不可能的,并且无法正确地对我们的部署进行版本控制是一种真正的麻烦。

就可追溯性等方面而言,AWS CodePipeline似乎还没有准备好迎接黄金时间,这也可以从在管道中包含CodeBuild阶段时不具有自定义命名工件的情况中看到。

Amazon确实需要在CI / CD方面加强自己的游戏。