aws弹性beanstalk环境的特定git分支
这是我当前的情景。aws弹性beanstalk环境的特定git分支,git,amazon-web-services,amazon-elastic-beanstalk,Git,Amazon Web Services,Amazon Elastic Beanstalk,这是我当前的情景。 我正在使用AWS Elasticbeanstalk和eb cli 3.x工具进行部署 我创建了两个环境(开发和生产)。每个环境(即主环境、生产环境)在我的git回购中有一个分支 我已经在git repo中创建了.ebextensions和.elasticbeanstalk文件夹 .ebextensions文件夹具有特定于每个环境的配置文件(例如设置、文件更改、环境变量等) 我希望在各自的git分支中处理每个环境 我的困难 如果我必须部署到developmentenv,它会
- 我正在使用AWS Elasticbeanstalk和eb cli 3.x工具进行部署
- 我创建了两个环境(开发和生产)。每个环境(即主环境、生产环境)在我的git回购中有一个分支
- 我已经在git repo中创建了.ebextensions和.elasticbeanstalk文件夹
- .ebextensions文件夹具有特定于每个环境的配置文件(例如设置、文件更改、环境变量等)
// 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文件夹?您可以将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
hook,以便在每次合并后为各个分支自动执行此操作。使用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
option_settings:
- option_name: MY_CONFIG
value: CHANGEME
2.初始化Git存储库
3.设置开发环境(主分支)
注意:当它要求您提供环境名称时,请选择一个名称来标识它是开发环境还是生产环境
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
5.设置生产环境
重复步骤3,但选择不同的环境名称。这将创建不同的.elasticbeanstalk/options设置。
文件
问:我的.ebextensions呢?
对于这两种环境,您应该使用相同的app.config
。不同环境之间唯一可能出现分歧的是选项\u设置
部分。但据我所知,每个环境都不能有不同的选项设置
,那么我们怎么做呢
嗯,我还没有一个最佳的解决方案,但我会告诉你我是如何做到的。我添加所需的所有选项\u name
,并使用占位符值,例如:
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
option_settings:
- option_name: MY_CONFIG
value: CHANGEME
随后,我通过AWS Elastic Beanstalk管理面板手动更改它们的值。转到应用程序>配置>软件配置>环境属性
另一种可能是使用自定义脚本,该脚本由容器\u命令运行。此脚本可以通过其主机名(或另一个唯一值)识别EC2实例,并自动加载环境变量(例如source.env
)
保护敏感信息
您需要遵守的唯一规则是:您的存储库不得包含敏感信息,如凭据,除非您不在乎
例如,应用程序希望通过环境变量读取RDS凭据,因此您将其置于选项设置中。但你不想让其他贡献者看到他们,是吗?我建议使用占位符的解决方案在这方面很方便。因此,在这两个分支中都有.ebextensions
和.elasticbeanstalk
文件夹,但在合并它们时,希望这两个文件夹保持不变?是的。我需要每一个分支机构都有它们。因为它们代表每个环境的服务器配置。此外,我将始终只合并从主生产。决不能反过来。开发只会在master中进行,可能很有用:另一种可能性是使用保存的配置而不是ebextensions。“eb config save”。听起来像是你在谈论旧的CLI版本(2.x),但OP说他们正在使用3。x@NickHumrich你说得对。谢谢你的提醒!我更新了答案以涵盖3.x版。不确定这是否有帮助。我对dev和prod环境(不仅仅是环境变量)的设置略有不同,例如,在prod env中,我修改了php,在另一个ec2实例上使用memcached进行会话。在dev env im中使用本地memcached进行会话时。这可以通过eb config save
来处理吗?@Lloyd:如果您只使用不同的主机/端口来连接memcached,那么不需要使用不同的PHP脚本来处理。您应该将这些设置放在选项设置文件的环境变量中。不要在PHP脚本中使用硬编码的主机/端口,而是让它读取您创建的环境变量并使用它连接到memcached。它能解决问题吗?@jweyrich:你提到的一切都是正确的。经过大量的搜索,我意识到这个功能不是亚马逊提供的。甚至遇到了你指出的同样的线索。现在由于时间不够,我已经将env变量移动到aws控制台,这样文件就不必不同了。至于其他配置,我暂时只是使环境或多或少相似。我们很快就会找到更好的解决办法。谢谢:)
git checkout -b production
eb init
option_settings:
- option_name: MY_CONFIG
value: CHANGEME