这是我目前的情况。
我希望在自己的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文件夹?
答案 0 :(得分:19)
对于这个版本,它相对简单。例如:
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
。
一种方法是为每个环境(分支)提供不同的optionsettings文件。 EB CLI可以帮助您: - )
从每个分支运行eb init
(见下文)并为每个分支选择不同的环境名称,这样您最终会得到2个不同的.elasticbeanstalk/optionsettings.<env-name>
文件。这样可以避免.elasticbeanstalk/
上的冲突。
mkdir MyApp
cd MyApp
git init .
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
git checkout -b production
eb init
重复步骤3,但选择不同的环境名称。这将创建不同的.elasticbeanstalk/optionsettings.<env-name>
文件。
您应该对两种环境使用相同的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
中。但是你不希望其他贡献者看到它们,对吗?我建议使用占位符的解决方案在这方面很方便。
答案 1 :(得分:1)
您可以将master与生产和生产合并为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
挂钩,以便在每次合并后自动为各个分支执行此操作。