问题描述
在我的一个项目中,我们使用了 GitHub flow。分支模型如下:
- 在 Jira (OSCS-103) 上创建了一张票
- 从
master
创建了一个分支,名为OSCS-103
。 - PR 会在创建后立即在此分支上创建,带有可以测试的自定义环境,其中 UI 位于
oscs-103.x.com
。 - 一旦 PR 关闭,环境就会被删除(使用 terraform)。
-
master
中的所有内容都被视为int
并准备发布,可以通过int.x.com
访问。 - 创建发布后,
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,这会使整个事情变得更加复杂。
附加文档:
- https://docs.aws.amazon.com/codebuild/latest/userguide/sample-github-pull-request.html
- https://aws-quickstart.s3.amazonaws.com/quickstart-git2s3/doc/git-to-amazon-s3-using-webhooks.pdf
- 代码构建网络钩子的 Terraform 资源:https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/codebuild_webhook