如前所述,在 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']
现在该功能可以从弹性beantalk环境更新应用程序版本描述
# 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
)
现在我们可以将我们的应用程序版本引用到版本和提交。请记住,这些只是代码 sn-ps,而不是整个逻辑。