使用 Terraform CI/CD 为每个分支创建一个新环境

问题描述

在我的一个项目中,我们使用了 GitHub flow。分支模型如下:

  1. 在 Jira (OSCS-103) 上创建了一张票
  2. master 创建了一个分支,名为 OSCS-103
  3. PR 会在创建后立即在此分支上创建,带有可以测试的自定义环境,其中 UI 位于 oscs-103.x.com
  4. 一旦 PR 关闭,环境就会被删除(使用 terraform)。
  5. master 中的所有内容都被视为 int 并准备发布,可以通过 int.x.com 访问。
  6. 创建发布后,master 中的所有内容都会推送到生产环境,x.com

目前,每个分支创建不同环境的过程是“手动”,我们运行以下命令:

$ terraform init
$ terraform workspace new OSCS-103
$ terraform apply -var="source_branch=OSCS-203" -var="token=$GITHUB_TOKEN"

这会在 terraform 中启动一个新环境,我们在其中使用 source_branch 创建管道。

一旦我们完成了这个环境,我们执行:

$ terraform init
$ terraform workspace select OSCS-103
$ terraform destroy -var="source_branch=OSCS-203" -var="token=$GITHUB_TOKEN"

但是,我想自动化这个过程,这样无论何时创建 PR,都会自动创建一个 env(理想情况下使用 AWS CodePipeline 或 AWS CodeBuild),并且当 PR 关闭/合并时,env 被销毁。

有没有人有这样做的例子?

编辑:

只是为了澄清,上面的 terraform 命令正在创建一个管道,这个管道“侦听”source_branch 上的更改并运行一个脚本来检查基础设施更改(使用 terraform 并在以下情况下进行更改)必要)、重建和部署 UI、重建和部署 API,以及运行 flyway 以迁移数据库更改。

解决方法

按照 Adil B 的建议,首先您需要在您的存储库中创建一个 Webhook。 设置好 webhook 后,您需要创建一个 CodeBuild 项目并设置一个 Github 事件,该事件将根据您设置的过滤器触发 CodeBuild: https://docs.aws.amazon.com/codebuild/latest/userguide/github-webhook.html

在 CodeBuild 构建规范中,您可能会使用您当前拥有的相同命令。您可以将部署/应用设置为外部变量并为两者使用相同的 CodeBuild 项目,或者使用专用的项目来使用不同的 webhook 事件进行应用和销毁。

如果可用过滤器不够用,您可以配置 webhook 以使用一些自定义逻辑触发 Lambda,然后启动 CodeBuild(甚至可能根据 Lambda 执行的结果更改其配置)。在这种情况下,您可能需要使用 API 网关或应用程序负载均衡器来处理 Lambda,这会使整个事情变得更加复杂。

附加文档:

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...