5-infrastructure/modules/app_cicd_pipeline/repo.tf (109 lines of code) (raw):
/**
* Copyright 2021 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.
*/
locals {
created_csrs = toset([for repo in google_sourcerepo_repository.app_infra_repo : repo.name])
gar_name = split("/", google_artifact_registry_repository.image_repo.name)[length(split("/", google_artifact_registry_repository.image_repo.name)) - 1]
folders = ["cache/.m2/.ignore", "cache/.skaffold/.ignore", "cache/.cache/pip/wheels/.ignore"]
}
data "google_project" "app_cicd_project" {
project_id = var.app_cicd_project_id
}
/***********************************************
Cloud Source Repos
***********************************************/
resource "google_sourcerepo_repository" "app_infra_repo" {
for_each = toset(var.app_cicd_repos)
project = var.app_cicd_project_id
name = each.key
}
/***********************************************
Cache Storage Bucket
***********************************************/
resource "google_storage_bucket" "cache_bucket" {
project = var.app_cicd_project_id
name = "${var.app_cicd_project_id}_cloudbuild"
location = var.primary_location
uniform_bucket_level_access = true
versioning {
enabled = true
}
}
resource "google_storage_bucket_object" "cache_bucket_folders" {
for_each = toset(local.folders)
name = each.value
content = "/n"
bucket = google_storage_bucket.cache_bucket.name
}
resource "google_storage_bucket_iam_member" "cloudbuild_artifacts_iam" {
bucket = google_storage_bucket.cache_bucket.name
role = "roles/storage.admin"
member = "serviceAccount:${data.google_project.app_cicd_project.number}@cloudbuild.gserviceaccount.com"
depends_on = [google_storage_bucket.cache_bucket]
}
/***********************************************
App Repo Cloudbuild Build Trigger
***********************************************/
resource "google_cloudbuild_trigger" "boa_build_trigger" {
project = var.app_cicd_project_id
description = "${var.boa_build_repo}-trigger."
trigger_template {
branch_name = ".*"
repo_name = var.boa_build_repo
}
substitutions = {
_GAR_REPOSITORY = local.gar_name
_DEFAULT_REGION = var.primary_location
_CACHE_BUCKET_NAME = google_storage_bucket.cache_bucket.name
}
filename = var.build_app_yaml
depends_on = [google_sourcerepo_repository.app_infra_repo]
}
/***********************************************
Image Build
***********************************************/
resource "null_resource" "cloudbuild_image_builder" {
triggers = {
project_id_cloudbuild_project = var.app_cicd_project_id
}
provisioner "local-exec" {
command = <<EOT
gcloud builds submit ${path.module}/cloud-build-builder/ \
--project ${var.app_cicd_project_id} \
--config=${path.module}/cloud-build-builder/${var.build_image_yaml} \
--substitutions=_DEFAULT_REGION=${var.primary_location},_GAR_REPOSITORY=${local.gar_name} \
--impersonate-service-account=${var.app_cicd_build_sa}
EOT
}
}
/***********************************************
GAR Image Repo
***********************************************/
resource "google_artifact_registry_repository" "image_repo" {
provider = google-beta
project = var.app_cicd_project_id
location = var.primary_location
repository_id = format("%s-%s", var.app_cicd_project_id, var.gar_repo_name_suffix)
description = "Docker repository for application images"
format = "DOCKER"
}
resource "google_artifact_registry_repository_iam_member" "terraform-image-iam" {
provider = google-beta
project = var.app_cicd_project_id
location = google_artifact_registry_repository.image_repo.location
repository = google_artifact_registry_repository.image_repo.name
role = "roles/artifactregistry.writer"
member = "serviceAccount:${data.google_project.app_cicd_project.number}@cloudbuild.gserviceaccount.com"
}