带有 aws 代码管道的自定义版本标签

Custom version label with aws code pipeline

我将 AWS CodePipeline 与 CodeBuild 结合使用来构建我的应用程序并将其部署到 ElasticBeanstalk。

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

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

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

似乎 AWS CodePipeline 在可追溯性等方面还没有完全准备好迎接黄金时段,这也可以从管道中包含 CodeBuild 阶段时无法拥有自定义命名工件中看出。

亚马逊确实需要在 CI/CD 方面加强其游戏。

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

CodeBuild 能够 运行 buildspec 中的 AWS CLI 命令,您可以将其用于

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

下面是一个使用自定义标签、文件名和描述上传工件的构建规范示例。

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 传入
  • 日期附加到版本名称以避免命名冲突。

前面已经提到了,在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 存储桶 build_output 中的 package.json 中读取版本

# 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']

现在该函数可以从 elastic 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
)

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