5

使用 AWS 时,将应用程序部署到新创建的实例的好方法似乎是通过 AWS CodeDeploy。这工作如下:

  1. 为应用设置自动伸缩组
  2. 为自动缩放组编写一个用户数据 bash 脚本,该脚本从 S3 中提取 CodeDeploy 代理,安装并启动它
  3. 设置部署到自动扩展组的 CodeDeploy 部署组

现在,当应用程序包(例如 jar 或 debian 包)部署到部署组时,它将自动部署到在自动扩展组中启动的新实例。

我的问题是:这种部署策略如何与 Travis CI 这样的 CI 工具相适应?

具体来说:

  • CodeDeploy 如何获取由 Travis CI 等 CI 工具构建的包?构建作业是否需要将包上传到 S3?
  • 如何使用 CodeDeploy 逐步部署应用程序(例如一次一个实例)?
  • 这种部署策略是否需要关闭和替换每个正在运行的实例,或者是否将新版本的应用程序部署在现有实例上?如果是前者,在部署过程中机器IP地址会发生变化,那么其他服务如何发现新部署的应用程序(即没有硬编码的IP地址)?
4

2 回答 2

4

tl;博士版本:

  • 构建作业需要将包上传到 S3。
  • 一次使用一个部署配置。
  • 应用程序的新版本部署在现有实例上。

好的,这是长版本:

我建议您尝试部署演练或查看文档中的概念。它应该可以帮助您更快地熟悉 CodeDeploy。

如果您不想,您不必将 AutoScaling 组与 CodeDeploy 一起使用。CodeDeploy 与 AutoScaling 集成允许您管理需要动态更改大小的队列,与部署到它们的代码分开,但这不是使用 CodeDeploy 的要求。您还可以手动启动一些 EC2 实例,安装主机代理,然后将它们标记到部署组中 - 但它们不会像 AutoScaling 实例那样在启动时自动部署。无论哪种情况,您始终可以创建队列范围的部署。

您必须做一些工作才能将它与您的 CI 工具集成。CodeDeploy 不直接管理您的构建工件,因此您的构建过程将需要这样做。要进行自动部署,您需要:

  1. appspec.yml使用、处理安装/升级所需的任何脚本以及构建工件创建存档包。
  2. 将包上传到 S3。
  3. 在 CodeDeploy 中创建部署。

您可能希望将CodePipeline视为与 CodeDeploy 集成的持续交付系统的示例。

CodeDeploy 使用部署配置来控制它部署到您的队列中的实例的积极程度。(对于自动部署,此配置将被忽略,因为每个实例都是单独处理的。)如果 CodeDeploy 在不违反部署配置中的约束条件的情况下不可能使另一个实例失败,它将使您的部署失败并停止部署到新实例。

有三个内置的部署配置,如果您需要不同的配置,可以通过 CLI 或API创建自己的。要一次仅部署到一个实例,您可以使用CodeDeployDefault.OneAtATime部署配置,该配置在任何给定时间最多允许一个运行状况不佳的主机。

于 2015-09-17T22:03:33.840 回答
0

对于其他人(像我一样)正在寻找有关如何将 Travis-CI 与 CodeDeploy 实际集成的示例:

  • 配置应用程序、部署组和实例,如CodeDeploy 演练中所述。
  • 使用 aws-cli 命令将您的第一个修订成功部署到 CodeDeploy 目标实例。
  • 部署并运行应用程序后,配置 Travis 以触发部署。
  • CodeDeployappspec.yml文件和用于部署的任何脚本都应打包在您的应用程序包中(latest.zip在下面的示例中)。

以下.travis.yml配置对我有用:

script: npm run build
before_deploy:
  - zip -r latest dist/*
  - mkdir -p dpl_cd_upload
  - mv latest.zip dpl_cd_upload/latest.zip
deploy:
  - provider: s3
    access_key_id: "XXXX"
    secret_access_key: "YYYYY"
    bucket: "deployments-bucket-name"
    local_dir: dpl_cd_upload
    skip_cleanup: true
  - provider: codedeploy
    access_key_id: "ZZZZZ"
    secret_access_key: "WWWW"
    bucket: "deployments-bucket-name"
    key: latest.zip
    bundle_type: zip
    application: CodeDeployAppName
    deployment_group: CodeDeployDeploymentGroupName

这个例子非常有用: https ://github.com/travis-ci/cat-party/blob/master/.travis.yml

于 2018-10-23T15:39:02.640 回答