modules/cloudbuild-github-deploy/main.tf (106 lines of code) (raw):

/** * Module `cloudbuild-github-deploy` * * This module creates Cloud Build triggers to run when the provided github repo * is updated. * * It handles the complexity of connecting cloud build and github together. * */ /* * 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 * * https://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. */ data "google_project" "project" { } data "google_secret_manager_secret_version" "gh_access" { secret = var.token_secret } locals { repo_owner = split("/", var.github_repo)[0] repo_name = split("/", var.github_repo)[1] } resource "google_project_service" "required_apis" { for_each = toset(["secretmanager", "apikeys"]) service = "${each.value}.googleapis.com" } resource "random_password" "pass_webhook" { length = 16 special = false } resource "google_secret_manager_secret" "gh_webhook" { secret_id = "${var.app_name}-github-webhook-secret" replication { auto {} } } resource "google_secret_manager_secret_version" "wh_secv" { secret = google_secret_manager_secret.gh_webhook.id secret_data = random_password.pass_webhook.result } data "google_iam_policy" "wh-secv-access" { binding { role = "roles/secretmanager.secretAccessor" members = [ "serviceAccount:service-${data.google_project.project.number}@gcp-sa-cloudbuild.iam.gserviceaccount.com", ] } } resource "google_secret_manager_secret_iam_policy" "policy" { secret_id = google_secret_manager_secret.gh_webhook.id policy_data = data.google_iam_policy.wh-secv-access.policy_data } resource "google_cloudbuild_trigger" "deploy" { name = "deploy-${var.app_name}" description = "Webhook to deploy from ${var.github_repo}" project = var.project_id webhook_config { secret = google_secret_manager_secret_version.wh_secv.id } source_to_build { uri = "https://github.com/${var.github_repo}" ref = "refs/heads/main" repo_type = "GITHUB" } filename = "cloudbuild/build-deploy.yaml" substitutions = { # TODO: plumb this through to the $PROJECT_ID env var at build time. _PROJECT_ID = data.google_project.project.project_id _APP_NAME = var.app_name } # filter = "(!_COMMIT_MSG.matches('IGNORE'))" depends_on = [google_secret_manager_secret_version.wh_secv] } resource "google_apikeys_key" "api_key" { name = "${var.app_name}-gh-cloudbuild" display_name = "${var.app_name} webhook for github calling cloudbuild" project = var.project_id restrictions { api_targets { service = "cloudbuild.googleapis.com" } } depends_on = [google_project_service.required_apis] } resource "github_repository_webhook" "gh_webhook" { provider = github repository = local.repo_name configuration { url = "https://cloudbuild.googleapis.com/v1/projects/${var.project_id}/triggers/${google_cloudbuild_trigger.deploy.name}:webhook?key=${google_apikeys_key.api_key.key_string}&secret=${random_password.pass_webhook.result}" content_type = "json" insecure_ssl = false secret = random_password.pass_webhook.result } active = true events = ["push"] depends_on = [google_cloudbuild_trigger.deploy] }