首页 > 解决方案 > 带有 Terragrunt/Terraform 单一存储库的 CI/CD

问题描述

我在一个单一存储库中使用 Terragrunt,如下所示,用于多个项目和环境:

projects/
├─ terragrunt.hcl
├─ teamA/
│  ├─ dev/
│  │  ├─ some-service/
│  │  │  ├─ terragrunt.hcl
│  ├─ prod/
│  │  ├─ some-service/
│  │  │  ├─ terragrunt.hcl
├─ teamB/
│  ├─ dev/
│  │  ├─ another-service/
│  │  │  ├─ terragrunt.hcl
│  ├─ prod/
│  │  ├─ another-service/
│  │  │  ├─ terragrunt.hcl

我已经读过,在使用 Terragrunt 时,最佳做法是在需要部署的模块上运行plan/命令,而不是在所有模块上递归运行应用程序,这些模块有时会破坏事情(?)。applyrun-all apply

我还被告知,如果我们apply遍历所有内容,有一些资源会被重建,并且可能会清除团队所做的任何手动更改。有点咸菜。

但是,我不熟悉如何在 CI/CD 管道方面进行此操作,并且仅在更新的模块上执行命令。

我还假设依赖关系需要在.hcl每个项目模块的文件中非常明确地说明,以免尝试部署需要其他东西已经存在的东西。

流动

  1. 工程师克隆代码
  2. 工程师创建并签出新分支,例如。fix/thing
  3. 工程师更新projects/teamB/dev/another-service/terragrunt.hcl
  4. 工程师提交代码并与分支一起推送回远程
  5. 工程师打开拉取请求
    • 这触发terragrunt planprojects/teamB/dev/another-service/terragrunt.hcl一些如何
  6. 工程师提交另一个更改projects/teamA/prod/some-service/terragrunt.hcl
    • plan这仅在受影响的模块上 重新触发
      • projects/teamB/dev/another-service/terragrunt.hcl
      • projects/teamA/prod/some-service/terragrunt.hcl
  7. PR 获批并合并
    • apply这仅在受影响的模块上 触发:
      • projects/teamB/dev/another-service/terragrunt.hcl
      • projects/teamA/prod/some-service/terragrunt.hcl

我看到的一些答案涉及向 CI/CD 工具解析的提交或 PR 添加指令。另一个提到运行git diff和解析已更改的文件夹/文件。

有没有人用 terragrunt 甚至 terraform 部署过类似的东西?

标签: terraformterragruntcicd

解决方案


推荐阅读