【问题标题】:Specific git branches for aws elastic beanstalk environmentsaws弹性beantalk环境的特定git分支
【发布时间】:2015-05-13 05:19:45
【问题描述】:

这是我目前的情况。

  • 我正在使用 AWS Elasticbeanstalk 以及 eb cli 3.x 工具进行部署。
  • 我创建了 2 个环境(开发和生产)。以及我的 git 存储库中针对每个环境(即 master 、 production)的一个分支
  • 我在我的 git repo 中创建了 .ebextensions 和 .elasticbeanstalk 文件夹
  • .ebextensions 文件夹包含特定于每个环境的配置文件(例如设置、文件更改、环境变量......等)

我希望在自己的 git 分支中处理每个环境。

我的困难

如果我必须部署到开发环境,它变得非常简单

// make config changes in master branch
// git add, commit
// eb deploy
// thus development environment is updated

但如果我必须部署到生产环境,问题就从这里开始

git checkout production
git merge master // pulls config that is meant for development environment only
eb deploy 

我希望当我合并来自主分支的更改时,我的所有代码都会更新为最新的更改。但是 .ebextensions 和 .elasticbeanstalk 目录保持不变

如何告诉 git 在合并到生产分支时忽略整个 .ebextensions 文件夹?

【问题讨论】:

  • 所以,您在两个分支中都有 .ebextensions.elasticbeanstalk 文件夹,但是当您合并它们时,您希望这两个文件夹保持不变?
  • 是的。我需要它们特定于每个分支。因为它们代表每个环境的服务器配置。此外,我将始终只从主合并到生产。永远不要反过来。开发只会发生在 master
  • 另一种可能性是使用保存的配置而不是 ebextensions。 “eb 配置保存”。

标签: git amazon-web-services amazon-elastic-beanstalk


【解决方案1】:

使用 EB CLI 3.x

对于这个版本,它相对简单。例如:

mkdir HelloWorld                 # create new directory for project
cd HelloWorld                    # enter the new directory
git init                         # create git repository
eb init -p PHP                   # create new application

echo "<?php echo getenv("ENV_NAME"); ?>" > index.php
git add .gitignore index.php
git commit -m 'Initial commit.'

eb create dev-env                # create environment named dev-env
eb create prod-env               # create environment named prod-env

eb use dev-env                   # associate dev-env to current branch (master)
eb setenv ENV_NAME=DEV           # set env variable specific to dev-env

git checkout -b production       # create production branch and switch to it
eb use prod-env                  # associate prod-env to the current branch (production)
eb setenv ENV_NAME=PROD          # set env variable specific to prod-env

这不会将ENV_NAME 保存在本地文件系统的任何位置。 EB CLI 直接更改实时 EB 实例。您可以使用 eb config save(由 Nick Humrich 建议)将当前运行环境的环境配置设置保存到 .elasticbeanstalk/saved_configs/&lt;env-name&gt;.cfg.yml。由于每个环境都有自己的文件,因此您不应该有任何冲突,除非您在两个分支中更改其中一个。另一种选择(请参阅保护敏感信息)是将它们添加到.gitignore

使用 EB CLI 2.x

问:您是如何创建环境的?

一种方法是为每个环境(分支)设置不同的选项设置文件。 EB CLI 可以帮助您:-)

从每个分支运行 eb init(见下文)并为每个分支选择不同的环境名称,这样您最终将得到 2 个不同的 .elasticbeanstalk/optionsettings.&lt;env-name&gt; 文件。这样可以避免.elasticbeanstalk/ 上的冲突。

1。创建项目目录

mkdir MyApp
cd MyApp

2。初始化 Git 存储库

git init .

3。设置开发环境(master分支)

eb init

注意:当它要求您提供环境名称时,请选择一个标识它是开发环境还是生产环境的名称。

Enter your AWS Access Key ID (current value is "<redacted>"): 
Enter your AWS Secret Access Key (current value is "<redacted>"): 
Select an AWS Elastic Beanstalk service region.
Available service regions are:
<redacted>
Select (1 to 8): 1
Enter an AWS Elastic Beanstalk application name
(auto-generated value is "MyApp"): MyApp      
Enter an AWS Elastic Beanstalk environment name
(auto-generated value is "MyApp-env"): MyApp-dev
Select an environment tier.
Available environment tiers are:
1) WebServer::Standard::1.0
2) Worker::SQS/HTTP::1.0
Select (1 to 2): 1
Select a solution stack.
Available solution stacks are:
<redacted>
Select (1 to 59): 32
Select an environment type.
Available environment types are:
1) LoadBalanced
2) SingleInstance
Select (1 to 2): 2
Create an RDS DB Instance? [y/n]: n
Attach an instance profile (current value is "[Create a default instance profile]"):
<redacted>
Select (1 to 5): 4

4。为生产创建一个新分支

git checkout -b production

5。设置生产环境

eb init

重复步骤 3,但选择不同的环境名称。这将创建不同的 .elasticbeanstalk/optionsettings.&lt;env-name&gt; 文件。

问:我的 .ebextensions 呢?

您应该为两种环境使用相同的app.config。环境之间唯一可能存在分歧的是option_settings 部分。但据我所知,每个环境不能有不同的option_settings,那么我们该怎么做呢?

好吧,我还没有最佳解决方案,但我会告诉你我是如何做到的。我添加了我需要的所有option_name 并使用占位符值,例如:

option_settings:
  - option_name: MY_CONFIG
    value: CHANGEME

然后我通过 AWS Elastic Beanstalk 管理面板手动更改它们的值。转至Application &gt; Configuration &gt; Software Configuration &gt; Environment Properties

另一种可能性是拥有一个由您的container_commands 运行的自定义脚本。该脚本可以通过主机名(或其他唯一值)识别 EC2 实例并自动加载环境变量(例如source &lt;hostname&gt;.env)。

保护敏感信息

您需要遵守的唯一规则是:您的存储库不得包含凭据等敏感信息,除非您不在乎。

例如,应用程序希望通过环境变量读取 RDS 凭据,因此您将它们放在 option_settings 中。但是您不希望其他贡献者看到它们,对吗?我建议使用占位符的解决方案在这方面很方便。

【讨论】:

  • 听起来你在谈论旧的 CLI 版本(2.x),但 OP 说他们使用的是 3.x
  • @NickHumrich 你是对的。谢谢提醒!我更新了我的答案以涵盖版本 3.x。
  • 不确定这是否有帮助。我对 dev 和 prod nvironments(不仅仅是环境变量)的设置略有不同,例如在产品环境中,我修改了 php 以在另一个 ec2 实例上使用 memcached 进行会话。在开发环境中,我使用本地 memcached 进行会话。这个可以eb config save处理吗?
  • @Lloyd:如果您只使用不同的主机/端口连接到您的 memcached,则不需要不同的 PHP 脚本来处理它。您应该将这些 settings 放在选项设置文件的环境变量中。不要在 PHP 脚本中使用硬编码的主机/端口,而是让它读取您创建的环境变量并使用它来连接到 memcached。能解决问题吗?
  • @jweyrich :你提到的一切都是正确的。经过大量搜索后,我意识到亚马逊没有提供此功能。甚至遇到了您指出的同一线程。现在由于时间不够,我已将 env 变量移动到 aws 控制台,这样文件就不必不同。至于其他配置,我暂时只是使环境或多或少相似。很快就会看到更好的解决方案。谢谢你:)
【解决方案2】:

您可以将 master 合并到 production 和 production 到 master。但是,每次合并后,您都必须重置相关文件夹的工作树。以下是您可以执行此操作的方法。

git checkout production
git merge --no-commit --no-ff master
git reset /path/to/[.ebextensions and .elasticbeanstalk]/folders
git commit
git push

此外,您可能会忘记在每次合并后重置,因此我建议您设置一个 post-merge 挂钩,以便在每次合并后自动为各个分支执行此操作。

【讨论】:

    猜你喜欢
    • 2017-11-25
    • 2020-12-26
    • 2021-01-07
    • 2021-01-17
    • 2017-07-15
    • 2019-09-24
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    相关资源
    最近更新 更多