git - aws elastic beanstalk 环境的特定 git 分支

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

这是我目前的情况。

  • 我正在使用 AWS Elasticbeanstalk 和 eb cli 3.x 工具进行部署。
  • 我创建了 2 个环境(开发和生产)。以及我的 git repo 中每个环境的一个分支(即 master , production )
  • 我在我的 git 存储库中创建了 .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 

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

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

最佳答案

使用 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/<env-name>.cfg.yml .由于每个环境都有自己的文件,因此您不应该有任何冲突,除非您在两个分支中更改其中一个。另一种选择(请参阅保护敏感信息)是将它们添加到 .gitignore .

使用 EB CLI 2.x

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

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

运行 eb init从每个分支(见下文)并为每个分支选择不同的环境名称,因此您最终会得到 2 个不同的 .elasticbeanstalk/optionsettings.<env-name>。文件。这样您就可以避免 .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.<env-name>文件。

问:我的 .ebextensions 怎么办?

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

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

option_settings:
  - option_name: MY_CONFIG
    value: CHANGEME

然后我通过 AWS Elastic Beanstalk 管理面板手动更改它们的值。转到 Application > Configuration > Software Configuration > Environment Properties .

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

保护敏感信息

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

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

关于git - aws elastic beanstalk 环境的特定 git 分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28986270/

相关文章:

javascript - 在AWS弹性Beanstalk上运行babel-node命令?

amazon-web-services - AWS :Device Name Error when converting from Elastic Beanstalk instance from m3. xlarge 到 m4.xlarge

amazon-web-services - 更改 Elastic Beanstalk 应用程序中的 RDS 配置?

macos - 显示系统文件/在 osx 中显示 git ignore

git - 将代码从一个仓库的一个分支推送到另一个仓库的另一个分支

git - Git 如何记录(或更可能地表示)其 blob 的文件路径和名称,然后识别重命名?

python - 将 boto 用于 AWS S3 Buckets for Signature V4

git - 如何提交并推送带有.git的子文件夹到github?

amazon-web-services - 解决 AWS CDK CloudFormation 堆栈之间的循环依赖关系

amazon-web-services - 无服务器错误 AWS 配置文件 ""似乎没有配置?