Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
aws弹性beanstalk环境的特定git分支_Git_Amazon Web Services_Amazon Elastic Beanstalk - Fatal编程技术网

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文件夹具有特定于每个环境的配置文件(例如设置、文件更改、环境变量等)
我希望在各自的git分支中处理每个环境

我的困难

如果我必须部署到developmentenv,它会变得非常简单

// 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