使用Terraform创建GCP CloudBuild V1触发器时遭遇400错误:Repository mapping does not exist
我之前也踩过这个坑,明明控制台里已经有仓库映射了,Terraform就是报这个错,给你几个实际验证过的解决方向:
先死磕「区域一致性」:你说确认映射存在,但一定要保证Terraform触发器配置里的
location和GCP控制台中创建的仓库映射的区域完全一模一样。比如如果你的仓库映射是在global区域创建的,触发器就必须设location = "global",哪怕你想让触发器跑在eu-west4也不行——CloudBuild的仓库映射是和区域绑定的,跨区域不互通。调整
source_to_build的配置逻辑:别用完整的GitHub URL填uri了,改用仓库的短名称格式,同时加上repo_name字段关联已映射的仓库,示例修改后:source_to_build { repo_name = "<org>/<repo>" repo_type = "GITHUB" ref = "refs/heads/main" }这里的
repo_name要和你在GCP控制台里看到的映射仓库名称完全一致,包括大小写(虽然GitHub不敏感,但GCP的映射偶尔会认死理)。检查仓库映射的创建方式:如果你是在CloudBuild控制台连接的GitHub,要确认是在当前项目、对应区域下创建的映射,而且用的是和仓库匹配的GitHub账号/组织授权。另外,尽量别同时混用OAuth和GitHub App两种连接方式,容易出冲突。
升级Terraform的Google Provider:有些旧版本的provider对CloudBuild V1触发器的仓库映射识别有bug,建议把provider升级到最新稳定版,比如在你的provider配置里指定:
provider "google" { version = "~> 4.0" project = "<your-project-id>" region = "europe-west4" }显式绑定GitHub仓库信息:在
github块里加上owner和name字段,明确告诉Terraform要关联哪个已映射的仓库,示例:github { owner = "<org>" name = "<repo>" push { tag = ".*" } }
如果以上方法都试过还不行,给你个终极调试技巧:先在GCP控制台手动创建一个能正常工作的相同触发器,然后用terraform import命令把这个手动创建的触发器导入到你的Terraform状态里,再对比你自己写的配置和导入后的配置差异——通常就能一眼找到哪里不对了。
备注:内容来源于stack exchange,提问作者Ramon Vermeulen

