aws弹性beanstalk环境的特定git分支

Llo*_*oyd 12 git amazon-web-services amazon-elastic-beanstalk

这是我目前的情况.

  • 我正在使用AWS Elasticbeanstalk和eb cli 3.x工具进行部署.
  • 我创建了2个环境(开发和生产).每个环境(即主人,生产)我的git仓库中有一个分支
  • 我在我的git仓库中创建了.ebextensions和.elasticbeanstalk文件夹
  • .ebextensions文件夹具有特定于每个环境的配置文件(例如,设置,文件更改,环境变量等)

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

我的困难

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

// make config changes in master branch
// git add, commit
// eb deploy
// thus development environment is updated
Run Code Online (Sandbox Code Playgroud)

但是,如果我必须部署到生产是问题的开始

git checkout production
git merge master // pulls config that is meant for development environment only
eb deploy 
Run Code Online (Sandbox Code Playgroud)

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

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

jwe*_*ich 19

使用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
Run Code Online (Sandbox Code Playgroud)

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

使用EB CLI 2.x.

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

一种方法是为每个环境(分支)提供不同的optionsettings文件.该EB CLI可以帮你:-)

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

1.创建项目目录

mkdir MyApp
cd MyApp
Run Code Online (Sandbox Code Playgroud)

2.初始化Git存储库

git init .
Run Code Online (Sandbox Code Playgroud)

3.设置开发环境(主分支)

eb init
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

git checkout -b production
Run Code Online (Sandbox Code Playgroud)

5.设置生产环境

eb init
Run Code Online (Sandbox Code Playgroud)

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

问:我的.ebextensions怎么样?

您应该在app.config两种环境中使用相同的内容.环境之间唯一可能不同的是该option_settings部分.但据我所知,你不能有不同的option_settings环境,所以我们怎么做呢?

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

option_settings:
  - option_name: MY_CONFIG
    value: CHANGEME
Run Code Online (Sandbox Code Playgroud)

然后,我通过AWS Elastic Beanstalk管理面板手动更改其值.去吧Application > Configuration > Software Configuration > Environment Properties.

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

保护敏感信息

你需要遵循的唯一规则是这样的:你的仓库必须不包含敏感信息像凭证,除非你不在乎.

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


Nom*_*man 1

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

git checkout production
git merge --no-commit --no-ff master
git reset /path/to/[.ebextensions and .elasticbeanstalk]/folders
git commit
git push
Run Code Online (Sandbox Code Playgroud)

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