You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:54:50