terraform-modules/webhooks/application/main.tf (158 lines of code) (raw):

/** * Copyright 2022 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. */ resource "random_password" "pass-webhook" { length = 16 special = false } resource "google_secret_manager_secret" "wh-sec" { project = var.project_id secret_id = "${var.app_name}-app-webhook-secret" replication { auto {} } } resource "google_secret_manager_secret_version" "wh-secv" { secret = google_secret_manager_secret.wh-sec.id secret_data = "${random_password.pass-webhook.result}" } data "google_iam_policy" "wh-secv-access" { binding { role = "roles/secretmanager.secretAccessor" members = [ "serviceAccount:service-${var.project_number}@gcp-sa-cloudbuild.iam.gserviceaccount.com", ] } } resource "google_secret_manager_secret_iam_policy" "policy" { project = var.project_id secret_id = google_secret_manager_secret.wh-sec.id policy_data = data.google_iam_policy.wh-secv-access.policy_data } resource "google_cloudbuild_trigger" "deploy-app" { name = "deploy-app-${var.app_name}" description = "Webhook to deploy the app" project = var.project_id webhook_config { secret = google_secret_manager_secret_version.wh-secv.id } build { step { name = "gcr.io/cloud-builders/git" id = "update-config-repo" entrypoint = "bash" args = [ "-c", <<-EOF branch=`echo "${"$"}{_REF}" | cut -d "/" -f3` echo ${"$"}{_REPO} echo "###########" echo $branch echo "###########" git clone -b ${"$"}{branch} https://$$GITHUB_USER:$$GITHUB_TOKEN@github.com/$$GITHUB_ORG/${"$"}{_REPO} EOF ] secret_env = [ "GITHUB_USER", "GITHUB_TOKEN", "GITHUB_ORG"] } step { name = "gcr.io/k8s-skaffold/skaffold" id = "skaffold-build" entrypoint = "bash" args = [ "-c", <<-EOF cd ${"$"}{_REPO} skaffold build --file-output=/workspace/artifacts.json \ --default-repo $$REGION-docker.pkg.dev/$PROJECT_ID/$$APP_NAME/image-$$APP_NAME-$(date '+%Y%m%d%H%M%S') \ --push=true EOF ] secret_env = ["APP_NAME", "REGION"] } step { name = "gcr.io/cloud-builders/gcloud" id = "create-release" entrypoint = "sh" args = [ "-c", <<-EOF gcloud config set deploy/region $$REGION cd ${"$"}{_REPO} gcloud beta deploy releases create "release-pipeline-$(date '+%Y%m%d%H%M%S')" --delivery-pipeline=$$APP_NAME --description="First Release" --build-artifacts=/workspace/artifacts.json --annotations="release-id=rel-$(date '+%Y%m%d%H%M%S')" EOF ] secret_env = [ "APP_NAME", "REGION"] } available_secrets { secret_manager { version_name = "projects/$PROJECT_ID/secrets/app-name/versions/latest" env = "APP_NAME" } secret_manager { version_name = "projects/${var.secret_project_id}/secrets/github-user/versions/latest" env = "GITHUB_USER" } secret_manager { version_name = "projects/${var.secret_project_id}/secrets/github-token/versions/latest" env = "GITHUB_TOKEN" } secret_manager { version_name = "projects/${var.secret_project_id}/secrets/github-org/versions/latest" env = "GITHUB_ORG" } secret_manager { version_name = "projects/$PROJECT_ID/secrets/region/versions/latest" env = "REGION" } } options { logging = "CLOUD_LOGGING_ONLY" } } substitutions = { _REPO = "${var.app_repo_name}" _REF = "${"$"}(body.ref)" _COMMIT_MSG = "${"$"}(body.head_commit.message)" } filter = "(!_COMMIT_MSG.matches('IGNORE'))" service_account = var.service_account depends_on = [google_secret_manager_secret_version.wh-secv] } resource "google_apikeys_key" "api-key" { name = "${var.app_name}-app-webhook-api-key-11" display_name = "${var.app_name} App webhook API key-11" project = var.project_id restrictions { api_targets { service = "cloudbuild.googleapis.com" } } } resource "github_repository_webhook" "gh-webhook" { provider = github repository = "${var.app_repo_name}" configuration { url = "https://cloudbuild.googleapis.com/v1/projects/${var.project_id}/triggers/deploy-app-${var.app_name}:webhook?key=${google_apikeys_key.api-key.key_string}&secret=${random_password.pass-webhook.result}" content_type = "json" insecure_ssl = false } active = true events = ["push"] depends_on = [google_cloudbuild_trigger.deploy-app] }