5-app-infra/modules/service_catalog/main.tf (130 lines of code) (raw):
/**
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
# resource "google_project_service_identity" "storage_agent" {
# provider = google-beta
# project = var.project_id
# service = "storage.googleapis.com"
# }
# resource "google_kms_crypto_key_iam_member" "storage-kms-key-binding" {
# crypto_key_id = var.kms_crypto_key
# role = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
# member = "serviceAccount:${google_project_service_identity.storage_agent.email}"
# }
resource "random_string" "bucket_name" {
length = 4
upper = false
numeric = true
lower = true
special = false
}
resource "google_storage_bucket" "bucket" {
location = var.region
name = "${var.gcs_bucket_prefix}-${var.project_id}-${lower(var.region)}-${random_string.bucket_name.result}"
project = var.project_id
uniform_bucket_level_access = true
encryption {
default_kms_key_name = var.kms_crypto_key
}
versioning {
enabled = true
}
logging {
log_bucket = var.log_bucket
}
}
resource "google_storage_bucket_iam_member" "bucket_role" {
bucket = google_storage_bucket.bucket.name
role = "roles/storage.admin"
member = google_service_account.trigger_sa.member
}
resource "google_sourcerepo_repository_iam_member" "read" {
project = var.project_id
repository = var.name
role = "roles/viewer"
member = "serviceAccount:${var.tf_service_catalog_sa_email}"
}
resource "google_service_account" "trigger_sa" {
account_id = var.trigger_sa_id
display_name = "Service Catalog Pipeline Account"
project = var.project_id
}
resource "google_service_account_iam_member" "impersonate" {
service_account_id = google_service_account.trigger_sa.id
role = "roles/iam.serviceAccountUser"
member = local.current_member
}
resource "random_string" "suffix" {
length = 10
special = false
upper = false
}
resource "google_storage_bucket" "cloud_build_logs" {
name = "svc-catalog-pipeline-logs-${random_string.suffix.result}"
storage_class = "REGIONAL"
project = var.project_id
location = var.region
uniform_bucket_level_access = true
encryption {
default_kms_key_name = var.kms_crypto_key
}
}
resource "google_sourcerepo_repository_iam_member" "repo_reader" {
repository = data.google_sourcerepo_repository.artifacts_repo.id
role = "roles/source.reader"
member = google_service_account.trigger_sa.member
}
resource "google_storage_bucket_iam_member" "storage_admin" {
bucket = google_storage_bucket.cloud_build_logs.name
role = "roles/storage.admin"
member = google_service_account.trigger_sa.member
}
resource "google_cloudbuild_trigger" "zip_files" {
name = "zip-tf-files-trigger"
project = var.project_id
location = var.region
trigger_template {
branch_name = "^main$"
repo_name = var.name
}
service_account = google_service_account.trigger_sa.id
build {
timeout = "1800s"
logs_bucket = google_storage_bucket.bucket.name
step {
id = "unshallow"
name = "gcr.io/cloud-builders/git"
entrypoint = "/bin/bash"
args = [
"-c",
"git fetch --unshallow"
]
}
step {
id = "find-folders-affected-in-push"
name = "gcr.io/cloud-builders/git"
entrypoint = "/bin/bash"
args = [
"-c",
<<-EOT
changed_files=$(git diff $${COMMIT_SHA}^1 --name-only -r)
changed_folders=$(echo "$changed_files" | awk -F/ '{print $2}' | sort | uniq )
for folder in $changed_folders; do
if [[ "$folder" != *.* ]]; then
echo "Found change in folder: $folder"
(cd modules/$folder && find . -type f -name '*.tf' -exec tar -cvzPf "/workspace/$folder.tar.gz" {} +)
fi
done
EOT
]
}
step {
id = "push-to-bucket"
name = "gcr.io/cloud-builders/gsutil"
args = ["cp", "/workspace/*.tar.gz", "gs://${google_storage_bucket.bucket.name}/modules/"]
}
}
depends_on = [google_service_account_iam_member.impersonate]
}