带有 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 命令,您可以将其用于
- 将构建工件上传到 S3 (documentation)
- 在 Elastic Beanstalk 中创建一个版本 (documentation)
- 部署版本 (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
)
现在我们可以将我们的应用程序版本引用到版本和提交中。请记住,这些只是代码片段,而不是整个逻辑。
我将 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 命令,您可以将其用于
- 将构建工件上传到 S3 (documentation)
- 在 Elastic Beanstalk 中创建一个版本 (documentation)
- 部署版本 (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
)
现在我们可以将我们的应用程序版本引用到版本和提交中。请记住,这些只是代码片段,而不是整个逻辑。