我将AWS CodePipeline与CodeBuild一起使用,以构建应用程序并将其部署到ElasticBeanstalk。
CodePipeline生成如下的版本名称:
code-pipeline-1122334455667-MyApp-1ac31f7c-1343-471x-a7e8-46b24f1785a
是否可以自定义这些标签?
答案 0 :(得分:5)
如果您使用AWS CodeBuild操作提供程序而不是AWS ElasticBeanstalk部署操作提供程序,则可以设置版本标签。
CodeBuild能够在buildspec中运行AWS CLI命令,您可以使用
下面是一个示例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方面加强自己的游戏。