1616
1717locals {
1818 cloudbuild_project_id = var. project_id != " " ? var. project_id : format (" %s-%s" , var. project_prefix , " cloudbuild" )
19- cloudbuild_apis = [" cloudbuild.googleapis.com" , " sourcerepo.googleapis.com" , " cloudkms.googleapis.com" ]
19+ gar_repo_name = var. gar_repo_name != " " ? var. gar_repo_name : format (" %s-%s" , var. project_prefix , " tf-runners" )
20+ cloudbuild_apis = [" cloudbuild.googleapis.com" , " sourcerepo.googleapis.com" , " cloudkms.googleapis.com" , " artifactregistry.googleapis.com" ]
2021 impersonation_enabled_count = var. sa_enable_impersonation == true ? 1 : 0
21- activate_apis = distinct (var. activate_apis )
22+ activate_apis = distinct (concat ( var. activate_apis , local . cloudbuild_apis ) )
2223 apply_branches_regex = " ^(${ join (" |" , var. terraform_apply_branches )} )$"
24+ gar_name = split (" /" , google_artifact_registry_repository. tf-image-repo . name )[length (split (" /" , google_artifact_registry_repository. tf-image-repo . name )) - 1 ]
2325}
2426
2527resource "random_id" "suffix" {
@@ -48,13 +50,6 @@ module "cloudbuild_project" {
4850 labels = var. project_labels
4951}
5052
51- resource "google_project_service" "cloudbuild_apis" {
52- for_each = toset (local. cloudbuild_apis )
53- project = module. cloudbuild_project . project_id
54- service = each. value
55- disable_on_destroy = false
56- }
57-
5853/* *****************************************
5954 Cloudbuild IAM for admins
6055*******************************************/
@@ -94,9 +89,6 @@ resource "google_kms_key_ring" "tf_keyring" {
9489 project = module. cloudbuild_project . project_id
9590 name = " tf-keyring"
9691 location = var. default_region
97- depends_on = [
98- google_project_service . cloudbuild_apis ,
99- ]
10092}
10193
10294/* *****************************************
@@ -120,9 +112,6 @@ resource "google_kms_crypto_key_iam_binding" "cloudbuild_crypto_key_decrypter" {
120112 " serviceAccount:${ module . cloudbuild_project . project_number } @cloudbuild.gserviceaccount.com" ,
121113 " serviceAccount:${ var . terraform_sa_email } "
122114 ]
123- depends_on = [
124- google_project_service . cloudbuild_apis ,
125- ]
126115}
127116
128117/* *****************************************
@@ -146,9 +135,6 @@ resource "google_sourcerepo_repository" "gcp_repo" {
146135 for_each = var. create_cloud_source_repos ? toset (var. cloud_source_repos ) : []
147136 project = module. cloudbuild_project . project_id
148137 name = each. value
149- depends_on = [
150- google_project_service . cloudbuild_apis ,
151- ]
152138}
153139
154140/* *****************************************
@@ -223,6 +209,19 @@ resource "google_cloudbuild_trigger" "non_master_trigger" {
223209 ]
224210}
225211
212+ /* **********************************************
213+ Cloud Build - Terraform Image Repo
214+ ***********************************************/
215+ resource "google_artifact_registry_repository" "tf-image-repo" {
216+ provider = google- beta
217+ project = module. cloudbuild_project . project_id
218+
219+ location = var. default_region
220+ repository_id = local. gar_repo_name
221+ description = " Docker repository for Terraform runner images used by Cloud Build"
222+ format = " DOCKER"
223+ }
224+
226225/* **********************************************
227226 Cloud Build - Terraform builder
228227 ***********************************************/
@@ -232,18 +231,20 @@ resource "null_resource" "cloudbuild_terraform_builder" {
232231 project_id_cloudbuild_project = module.cloudbuild_project.project_id
233232 terraform_version_sha256sum = var.terraform_version_sha256sum
234233 terraform_version = var.terraform_version
234+ gar_name = local.gar_name
235+ gar_location = google_artifact_registry_repository.tf- image- repo.location
235236 }
236237
237238 provisioner "local-exec" {
238239 command = << EOT
239240 gcloud builds submit ${ path . module } /cloudbuild_builder/ \
240241 --project ${ module . cloudbuild_project . project_id } \
241242 --config=${ path . module } /cloudbuild_builder/cloudbuild.yaml \
242- --substitutions=_TERRAFORM_VERSION=${ var . terraform_version } ,_TERRAFORM_VERSION_SHA256SUM=${ var . terraform_version_sha256sum } ,_TERRAFORM_VALIDATOR_RELEASE=${ var . terraform_validator_release }
243+ --substitutions=_TERRAFORM_VERSION=${ var . terraform_version } ,_TERRAFORM_VERSION_SHA256SUM=${ var . terraform_version_sha256sum } ,_TERRAFORM_VALIDATOR_RELEASE=${ var . terraform_validator_release } ,_REGION= ${ google_artifact_registry_repository . tf-image-repo . location } ,_REPOSITORY= ${ local . gar_name }
243244 EOT
244245 }
245246 depends_on = [
246- google_project_service . cloudbuild_apis ,
247+ google_artifact_registry_repository_iam_member . terraform-image-iam
247248 ]
248249}
249250
@@ -255,9 +256,16 @@ resource "google_storage_bucket_iam_member" "cloudbuild_artifacts_iam" {
255256 bucket = google_storage_bucket. cloudbuild_artifacts . name
256257 role = " roles/storage.admin"
257258 member = " serviceAccount:${ module . cloudbuild_project . project_number } @cloudbuild.gserviceaccount.com"
258- depends_on = [
259- google_project_service . cloudbuild_apis ,
260- ]
259+ }
260+
261+ resource "google_artifact_registry_repository_iam_member" "terraform-image-iam" {
262+ provider = google- beta
263+ project = module. cloudbuild_project . project_id
264+
265+ location = google_artifact_registry_repository. tf-image-repo . location
266+ repository = google_artifact_registry_repository. tf-image-repo . name
267+ role = " roles/artifactregistry.writer"
268+ member = " serviceAccount:${ module . cloudbuild_project . project_number } @cloudbuild.gserviceaccount.com"
261269}
262270
263271resource "google_service_account_iam_member" "cloudbuild_terraform_sa_impersonate_permissions" {
@@ -266,9 +274,6 @@ resource "google_service_account_iam_member" "cloudbuild_terraform_sa_impersonat
266274 service_account_id = var. terraform_sa_name
267275 role = " roles/iam.serviceAccountTokenCreator"
268276 member = " serviceAccount:${ module . cloudbuild_project . project_number } @cloudbuild.gserviceaccount.com"
269- depends_on = [
270- google_project_service . cloudbuild_apis ,
271- ]
272277}
273278
274279resource "google_organization_iam_member" "cloudbuild_serviceusage_consumer" {
@@ -277,9 +282,6 @@ resource "google_organization_iam_member" "cloudbuild_serviceusage_consumer" {
277282 org_id = var. org_id
278283 role = " roles/serviceusage.serviceUsageConsumer"
279284 member = " serviceAccount:${ module . cloudbuild_project . project_number } @cloudbuild.gserviceaccount.com"
280- depends_on = [
281- google_project_service . cloudbuild_apis ,
282- ]
283285}
284286
285287# Required to allow cloud build to access state with impersonation.
@@ -289,7 +291,4 @@ resource "google_storage_bucket_iam_member" "cloudbuild_state_iam" {
289291 bucket = var. terraform_state_bucket
290292 role = " roles/storage.admin"
291293 member = " serviceAccount:${ module . cloudbuild_project . project_number } @cloudbuild.gserviceaccount.com"
292- depends_on = [
293- google_project_service . cloudbuild_apis ,
294- ]
295294}
0 commit comments