使用 CodeDeploy 和 CI 工具部署分布式应用程序的好方法是什么?

What is a good way to deploy a distributed application using CodeDeploy and a CI tool?

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

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

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

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

具体来说:

tl;dr 版本:

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

好的,这是长版:

我建议您尝试文档中的 Deployment Walkthrough or take a looks at Concepts。它应该可以帮助您更快地熟悉 CodeDeploy。

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

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

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

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

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

如果您需要不同的,可以使用三个 built in deployment configs, and you can create your own via the CLI or API。要一次仅部署到一个实例,您可以使用 CodeDeployDefault.OneAtATime 部署配置,它在任何给定时间最多允许一个不健康的主机。

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

  • 配置应用程序、DeploymentGroups 和实例,如 CodeDeploy walkthrough 中所述。
  • 使用 aws-cli 命令将您的第一个修订版成功部署到 CodeDeploy 目标实例。
  • 部署应用程序并运行后,配置 Travis 以触发部署。
  • CodeDeploy appspec.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