【问题标题】:Custom version label with aws code pipeline带有 aws 代码管道的自定义版本标签
【发布时间】:2021-08-04 05:51:20
【问题描述】:

我正在使用 AWS CodePipeline 和 CodeBuild 来构建我的应用程序并将其部署到 ElasticBeanstalk。

CodePipeline 生成的版本名称如下: code-pipeline-1122334455667-MyApp-1ac31f7c-1343-471x-a7e8-46b24f1785a

是否可以自定义这些标签?

【问题讨论】:

    标签: amazon-web-services amazon-elastic-beanstalk aws-codepipeline aws-codebuild


    【解决方案1】:

    如果您使用 AWS CodeBuild 操作提供程序而不是 AWS ElasticBeanstalk 部署操作提供程序,则可以设置版本标签。

    CodeBuild 能够在 buildspec 中运行 AWS CLI 命令,您可以使用它来

    1. 将您的构建工件上传到 S3 (documentation)
    2. 在 Elastic Beanstalk (documentation) 中创建一个版本
    3. 部署版本 (documentation)

    以下是使用自定义标签、文件名和描述上传工件的构建规范示例。

    版本:0.2 阶段: 建造: 命令: - mvn 清洁包 - 导出 POM_VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec) - 导出 JAR_NAME='application-'$POM_VERSION'.jar' - 导出 EB_VERSION=$POM_VERSION'-'$(date +%s) - aws s3 cp 目标/application.jar s3://bucket-name/$JAR_NAME - aws elasticbeanstalk create-application-version --application-name "应用程序名称" --version-label "$EB_VERSION" --description "$CommitMessage" --source-bundle S3Bucket=bucket-name,S3Key=$JAR_NAME - aws elasticbeanstalk update-environment --application-name "应用程序名称" --version-label "$EB_VERSION" --environment-name "EnvironmentName"

    注意事项

    • $CommitMessage 作为 environment variable 从 CodePipeline 进来。
    • 日期附加到版本名称以避免命名冲突。

    【讨论】:

    • 这对我来说非常棒!从拥有 CodePipeline 部署过程到仅使用 CodeBuild 将版本发送到 Elastic Beanstalk。 CodePipeline 甚至会为每个环境创建不同的版本标签,即使它们都部署在相同的管道上,这使得几乎不可能确定每个环境实际部署了什么。
    【解决方案2】:

    目前我认为这是不可能的,而且无法正确地对我们的部署进行版本控制真的很麻烦。

    在可追溯性等方面,AWS CodePipeline 似乎还没有准备好迎接黄金时段,当 CodeBuild 阶段包含在管道中时,不可能拥有自定义命名的工件也可以看出这一点。

    亚马逊确实需要在 CI/CD 方面加紧努力。

    【讨论】:

      【解决方案3】:

      如前所述,在 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,而不是整个逻辑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 2019-02-08
        • 1970-01-01
        相关资源
        最近更新 更多