【发布时间】:2021-07-15 22:21:46
【问题描述】:
正如标题所说,尝试利用 Cloud Build 和 Terraform 工作空间在同一个 GCP 项目中创建任意临时环境,映射到一个分支。
我的 Cloud Build 管道可以工作,但 terraform apply 似乎并没有尊重我尝试设置的工作空间,因为以前构建的资源被破坏了,即使它们应该在另一个工作空间中。
cloud_build.yaml
- id: 'tf workspace'
name: 'hashicorp/terraform:1.0.2'
args: ['workspace','new',$BRANCH_NAME]
- id: 'tf workspace'
name: 'hashicorp/terraform:1.0.2'
args: ['workspace','select',$BRANCH_NAME]
- id: 'tf init'
name: 'hashicorp/terraform:1.0.2'
args: ['init']
- id: 'tf plan'
name: 'hashicorp/terraform:1.0.2'
args: ['plan',"-var","branch_name=$BRANCH_NAME","-var","project_id=$PROJECT_ID"]
- id: 'tf apply'
name: 'hashicorp/terraform:1.0.0'
args: ['apply',"-auto-approve","-var","branch_name=$BRANCH_NAME","-var","project_id=$PROJECT_ID"]
后端很简单:
terraform {
backend "gcs" {
bucket = "my-tfstate-bucket"
}
}
我是否遗漏了一些关于工作空间的内容?似乎它们并没有真正反映在远程状态中。我知道您可以在 tf 后端配置中指定特定的工作区,但由于这些工作区是动态的,我一直希望通过 CLI 设置工作区会在上传的远程状态下设置某种命名空间并注意的分离。
编辑只是为了确认我以不同的方式命名所有组件,以当前分支名称作为后缀,但 TF 仍会销毁在运行不同分支时创建的组件。
【问题讨论】:
-
每次应用后,terraform 是否正确地将新文件上传到您的 GCS 存储桶?这可能是由于命名空间命名与对象的 GCS 命名约定冲突,导致将状态上传到存储桶的过程失败,因此您总是停留在相同的状态。
-
是的,只是看了一下状态文件,它最后更新的时间戳与最后一次部署尝试匹配。但是我在任何地方都没有在状态文件中看到任何“工作空间”的证据,我承认我对状态文件格式知之甚少,但你会认为它会以某种方式在工作空间状态之间划定,如果它们被设置,要么,要么完全上传不同的状态文件,但我只有一个。
标签: google-cloud-platform google-cloud-functions terraform google-cloud-build