如何自定义CodeCommit-CodeBuild-CodePipeline部署的Elastic Beanstalk应用运行版本字符串?
自定义Elastic Beanstalk部署版本号(基于CodeCommit-CodeBuild-CodePipeline)
绝对可行!我之前帮团队实现过几乎一模一样的需求,下面是两种亲测有效的方案,你可以根据自己的流程偏好选择:
方案一:CodeBuild生成版本号,传递给CodePipeline部署
这是最灵活的方式,完全由你控制版本号的生成规则:
1. 在CodeBuild的buildspec.yml中生成自定义版本号
修改你的buildspec.yml,加入读取VERSION文件、拼接时间戳的逻辑,同时把生成的版本号保存为可被CodePipeline读取的文件:
version: 0.2 phases: pre_build: commands: # 读取仓库中的VERSION文件内容 - APP_VERSION=$(cat VERSION) # 生成时间戳(格式可自定义,比如YYYYMMDDHHMMSS) - DEPLOY_TIMESTAMP=$(date +%Y%m%d%H%M%S) # 拼接自定义版本号(规则随便改,比如加git commit ID也行) - CUSTOM_VERSION="${APP_VERSION}-${DEPLOY_TIMESTAMP}" # 确保输出目录存在 - mkdir -p ./build-artifacts # 把版本号写入文件,方便后续阶段读取 - echo $CUSTOM_VERSION > ./build-artifacts/version.txt artifacts: files: - '**/*' base-directory: './build-artifacts'
2. 在CodePipeline中添加Lambda动作,创建指定版本的EB应用
默认的CodePipeline Elastic Beanstalk部署动作用的是随机版本号,所以我们需要加一个Lambda步骤,读取version.txt的内容,调用EB API创建自定义版本,再让后续的部署动作使用这个版本:
- 编写Lambda函数(Python示例):
import boto3 import os import zipfile eb = boto3.client('elasticbeanstalk') s3 = boto3.client('s3') def lambda_handler(event, context): # 从CodePipeline输入artifact中获取S3存储信息 job_data = event['CodePipeline.job']['data'] input_artifact = job_data['inputArtifacts'][0]['location']['s3Location'] bucket = input_artifact['bucketName'] key = input_artifact['objectKey'] # 下载并解压artifact文件,读取version.txt s3.download_file(bucket, key, '/tmp/build.zip') with zipfile.ZipFile('/tmp/build.zip', 'r') as zip_ref: zip_ref.extractall('/tmp/build') with open('/tmp/build/version.txt', 'r') as f: custom_version = f.read().strip() # 创建EB应用版本 eb.create_application_version( ApplicationName=os.environ['EB_APP_NAME'], VersionLabel=custom_version, SourceBundle={ 'S3Bucket': bucket, 'S3Key': key }, AutoCreateApplication=False ) # 把版本号传递给下一个部署阶段 return { 'versionLabel': custom_version }
- 给Lambda角色添加必要权限:
CodePipelineFullAccess、ElasticBeanstalkFullAccess、S3ReadOnlyAccess(可根据实际情况缩小权限范围) - 在CodePipeline中,将这个Lambda动作放在CodeBuild之后、EB部署之前,并配置部署阶段使用Lambda输出的
versionLabel作为版本号
3. 简化版:直接在CodeBuild中调用EB CLI创建版本
如果不想加Lambda步骤,可以在CodeBuild中直接用EB CLI创建自定义版本:
- 给CodeBuild服务角色添加
ElasticBeanstalkFullAccess权限 - 在buildspec.yml的
post_build阶段添加命令:
post_build: commands: - eb init your-app-name --region us-east-1 - eb create-application-version --version-label $CUSTOM_VERSION --source-bundle S3Bucket=your-build-artifact-bucket,S3Key=your-build-key
方案二:利用Elastic Beanstalk配置文件自定义版本显示
如果你的版本号规则相对简单,也可以直接在部署包中加入.ebextensions配置文件,让EB自动读取VERSION文件并设置版本号:
在项目根目录创建.ebextensions/version.config:
files: "/opt/elasticbeanstalk/hooks/appdeploy/pre/01_set_version.sh": mode: "000755" owner: root group: root content: | #!/bin/bash # 读取部署包中的VERSION文件 VERSION=$(cat /var/app/current/VERSION) TIMESTAMP=$(date +%Y%m%d%H%M%S) CUSTOM_VERSION="${VERSION}-${TIMESTAMP}" # 更新EB环境的版本标签 aws elasticbeanstalk update-environment --environment-name your-env-name --version-label $CUSTOM_VERSION
注意:需要给EB的EC2实例角色添加ElasticBeanstalkFullAccess权限,并且确保实例能正常调用AWS CLI
关键注意事项
- Elastic Beanstalk的版本标签只能包含字母、数字、连字符(
-)、下划线(_)和点(.),不要使用特殊字符 - 如果想增强版本号辨识度,可以在CodeBuild中用
git rev-parse --short HEAD获取Git短提交ID,拼接到版本号里 - 测试时建议先手动运行脚本,确认版本号生成符合预期后,再集成到流水线中
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

