cloudbuild.yaml (171 lines of code) (raw):
# Copyright 2019 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.
# Pre-requisites to running with cloud build
# export PROJECT_ID=$(gcloud config get-value core/project 2>/dev/null)
# gcloud services enable --project $PROJECT_ID compute.googleapis.com container.googleapis.com cloudbuild.googleapis.com cloudresourcemanager.googleapis.com servicemanagement.googleapis.com serviceusage.googleapis.com monitoring.googleapis.com secretmanager.googleapis.com iap.googleapis.com
# export CLOUDBUILD_SA=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')@cloudbuild.gserviceaccount.com
# gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$CLOUDBUILD_SA --role roles/owner
# gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$CLOUDBUILD_SA --role roles/iam.serviceAccountTokenCreator
timeout: 3600s
substitutions:
_ACTION: apply
_NAME: broker
_OAUTH_APP_NAME: App Launcher
_REGION:
_USER:
_BUILD_IMAGES: "true"
_ENABLE_COS_GPU: "true"
_ENABLE_UBUNTU_GPU: "false"
_WAIT_FOR_IAP: "true"
tags:
- kube-app-launcher-deploy
steps:
###
# Cleanup any existing sub-jobs to prevent overlapping executions.
###
- name: "gcr.io/cloud-builders/gcloud"
id: cleanup-sub-jobs
entrypoint: bash
args:
- -c
- |
gcloud builds list --ongoing --filter='tags[]~kube-app-launcher-setup' --format='value(id)' | \
xargs --no-run-if-empty gcloud builds cancel
###
# Build images
###
- name: "gcr.io/cloud-builders/gcloud"
id: "build-images"
dir: "images"
entrypoint: bash
args:
- -c
- |
[[ "${_BUILD_IMAGES}" == "false" ]] && exit 0
exec gcloud builds submit
waitFor: ["-"]
###
# Create OAuth client and store in Secret Manager
###
- name: "gcr.io/cloud-builders/gcloud"
id: "create-oauth-client"
entrypoint: "bash"
args:
- -exc
- |
count=0
while [[ $$count -lt 10 ]]; do
eval $$(./setup/scripts/create_oauth_client.sh "${_OAUTH_APP_NAME}")
[[ $? -eq 0 ]] && break
((count=count+1))
sleep 2
done
(gcloud secrets versions access 1 --secret broker-oauth2-client-id) || \
gcloud secrets create broker-oauth2-client-id \
--replication-policy=automatic \
--data-file <(echo -n $${CLIENT_ID})
(gcloud secrets versions access 1 --secret broker-oauth2-client-secret) || \
gcloud secrets create broker-oauth2-client-secret \
--replication-policy=automatic \
--data-file <(echo -n $${CLIENT_SECRET})
waitFor: ["-"]
###
# Generate broker cookie secret and store in Secret Manager
###
- name: "gcr.io/cloud-builders/gcloud"
id: "generate-broker-cookie-secret"
entrypoint: "bash"
args:
- -exc
- |
export COOKIE_SECRET=$$(openssl rand -base64 15)
(gcloud secrets versions access 1 --secret broker-cookie-secret) || \
gcloud secrets create broker-cookie-secret \
--replication-policy=automatic \
--data-file <(echo -n $${COOKIE_SECRET})
waitFor: ["-"]
###
# Deploy base infrastructure
###
- name: "gcr.io/cloud-builders/gcloud"
id: "deploy-infra-base"
dir: "setup"
args:
- "builds"
- "submit"
- "--substitutions=_NAME=${_NAME},_ACTION=${_ACTION}"
waitFor:
- create-oauth-client
- generate-broker-cookie-secret
###
# Add user to the IAP authorized web users role
###
- name: "gcr.io/${PROJECT_ID}/${_NAME}-installer"
id: "iap-user-authorization"
entrypoint: "bash"
args:
- -exc
- |
./setup/scripts/add_iap_user.sh user \
${_USER} ${PROJECT_ID}
waitFor: ["deploy-infra-base"]
###
# Deploy the cluster to the region
###
- name: "gcr.io/cloud-builders/gcloud"
id: "deploy-cluster-region"
dir: "setup/infra/cluster"
args:
- "builds"
- "submit"
- "--substitutions=_NAME=${_NAME},_ACTION=${_ACTION},_REGION=${_REGION}"
waitFor:
- deploy-infra-base
###
# Create node pool for apps
###
- name: "gcr.io/cloud-builders/gcloud"
id: "deploy-node-pool-apps"
dir: "setup/infra/node-pool-apps"
args:
- "builds"
- "submit"
- "--substitutions=_NAME=${_NAME},_ACTION=${_ACTION},_REGION=${_REGION}"
waitFor:
- deploy-cluster-region
###
# Create node pool for gpus
###
- name: "gcr.io/cloud-builders/gcloud"
id: "deploy-node-pool-gpu"
dir: "setup/infra/node-pool-gpu"
args:
- "builds"
- "submit"
- "--substitutions=_NAME=${_NAME},_ACTION=${_ACTION},_REGION=${_REGION},_COS=${_ENABLE_COS_GPU},_UBUNTU=${_ENABLE_UBUNTU_GPU}"
waitFor:
- deploy-node-pool-apps
###
# Create workload identity bindings
###
- name: "gcr.io/cloud-builders/gcloud"
id: "create-workload-identity-bindings"
dir: "setup/infra/wi-sa"
args:
- "builds"
- "submit"
- "--substitutions=_NAME=${_NAME},_ACTION=${_ACTION}"
waitFor:
- deploy-cluster-region
###
# Deploy manifests to the region
###
- name: "gcr.io/cloud-builders/gcloud"
id: "deploy-cluster-manifests-region"
dir: "setup/manifests"
args:
- "builds"
- "submit"
- "--substitutions=_INFRA_NAME=${_NAME},_REGION=${_REGION}"
waitFor:
- build-images
- create-workload-identity-bindings
###
# Wait for IAP and GCLB to stabilize - phase 1
###
- name: "gcr.io/${PROJECT_ID}/${_NAME}-installer"
id: "wait-for-iap-1"
entrypoint: "bash"
args:
- -xc
- |
[[ "${_WAIT_FOR_IAP}" == "false" ]] && exit 0
CLIENT_ID=$$(gcloud secrets versions access 1 --secret broker-oauth2-client-id)
ENDPOINT="https://${_NAME}.endpoints.${PROJECT_ID}.cloud.goog/broker/"
# Wait up to 10 minutes for LB to stabilize
rm -f /workspace/iap_timeout
timeout 600 bash ./setup/scripts/wait_for_iap.sh broker@${PROJECT_ID}.iam.gserviceaccount.com $${CLIENT_ID} $${ENDPOINT}
if [[ $? -ne 0 ]]; then
echo "timeout" > /workspace/iap_timeout
fi
waitFor:
- deploy-cluster-manifests-region
###
# Check for phase 1 timeout, if timeout then run fix_autoneg script
###
- name: "gcr.io/${PROJECT_ID}/${_NAME}-installer"
id: "fix-autoneg"
entrypoint: "bash"
args:
- -exc
- |
[[ ! -f /workspace/iap_timeout ]] && echo "echo: IAP is ready, skipping fix-autoneg" && exit 0
gcloud container clusters get-credentials --region ${_REGION} ${_NAME}-${_REGION}
./setup/scripts/fix_autoneg.sh
waitFor:
- wait-for-iap-1
###
# Wait for IAP and GCLB to stabilize phase 2
###
- name: "gcr.io/${PROJECT_ID}/${_NAME}-installer"
id: "wait-for-iap-2"
entrypoint: "bash"
args:
- -xc
- |
[[ "${_WAIT_FOR_IAP}" == "false" ]] && exit 0
[[ ! -f /workspace/iap_timeout ]] && echo "echo: IAP is ready, skipping wait-for-iap-2" && exit 0
CLIENT_ID=$$(gcloud secrets versions access 1 --secret broker-oauth2-client-id)
ENDPOINT="https://${_NAME}.endpoints.${PROJECT_ID}.cloud.goog/broker/"
# Wait for up to 20 minutes for IAP.
timeout 1200 bash ./setup/scripts/wait_for_iap.sh broker@${PROJECT_ID}.iam.gserviceaccount.com $${CLIENT_ID} $${ENDPOINT}
waitFor:
- fix-autoneg