deploy-gke.bash (166 lines of code) (raw):
#!/bin/bash
# Copyright 2020 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.
# TODO: initial steps
GREEN="\e[32m"
RED="\e[31m"
RESET="\e[0m"
PROJECT=${PROJECT}
# Service names have "_" prefix and suffix to allow full service name matching
# using a substring search on the merged list.
SERVICE_NAMES=("_ic_" "_hydraic_" "_icdemo_")
ENV=""
unset PROMPT
unset BYPASS_BUILD
unset CONFIG_ONLY
unset DB_IP
unset DOMAIN_IC
print_usage() {
echo -e ${RED?}'Usage: deploy [-c] [-b] [-f] [-h] [-i] [-p project_id] [-P database_ip] [-d domain_for_ic] [service_name service_name ...]'${RESET?}
echo -e ${RED?}' -b \t bypass build of services'${RESET?}
echo -e ${RED?}' -c \t config generation only'${RESET?}
echo -e ${RED?}' -h \t show this help usage'${RESET?}
echo -e ${RED?}' -i \t interactive prompts to proceed between steps'${RESET?}
echo -e ${RED?}' -p \t GCP project_id to deploy to'${RESET?}
echo -e ${RED?}' -P \t CloudSQL instance private ip'${RESET?}
echo -e ${RED?}' -d \t domain for ic'${RESET?}
echo
echo -e ${RED?}' service names: '"${SERVICE_NAMES[@]//_}"${RESET?}
echo
echo -e ${RED?}' all flags must be provided before service names'${RESET?}
}
echo -e ${GREEN?}'Args: '"$@"${RESET?}
ARGS=("$@")
DEPLOY=()
unset SKIP_ARG
for arg in "${ARGS[@]}"; do
if [[ "${SKIP_ARG}" != "" ]]; then
# previous was a flag and this is that flag's string argument
unset SKIP_ARG
elif [[ $arg == -* ]]; then
# arg is a flag
if [[ "${#DEPLOY[@]}" != "0" ]]; then
echo -e ${RED?}'Flag "'$arg'" must be specified before any service names'${RESET?}
exit 1
elif [[ "$arg" == "-p" || "$arg" == "-P" || "$arg" == "-d" ]]; then
SKIP_ARG='true'
fi
elif [[ "${SERVICE_NAMES[@]}" =~ '_'$arg'_' ]]; then
DEPLOY+=('_'$arg'_')
else
echo -e ${RED?}'Service "'$arg'" is not a valid service name'${RESET?}
exit 1
fi
done
if [[ "${#DEPLOY[@]}" == "0" ]]; then
# When no services are specified to deploy, then deploy all of them.
DEPLOY=("${SERVICE_NAMES[@]}")
fi
while getopts ':bchip:P:d:' flag; do
case "${flag}" in
b) BYPASS_BUILD='true' ;;
c) CONFIG_ONLY='true' ;;
h) print_usage
exit 1 ;;
i) PROMPT='true' ;;
p) PROJECT="${OPTARG}" ;;
P) DB_IP="${OPTARG}" ;;
d) DOMAIN_IC="${OPTARG}" ;;
*) echo -e ${RED?}'Unknown flag: -'${flag}${RESET?}
print_usage
exit 1 ;;
esac
done
if [[ "${PROJECT}" == "" ]]; then
echo -e ${RED?}'Must provide a project via $PROJECT or -p project'${RESET?}
print_usage
exit 1
fi
if [[ "${DB_IP}" == "" ]]; then
echo -e ${RED?}'Must provide the private ip of database via -P ip'${RESET?}
print_usage
exit 1
fi
if [[ "${DOMAIN_IC}" == "" ]]; then
echo -e ${RED?}'Must provide the domain of ic via -d your.domain.ic'${RESET?}
print_usage
exit 1
fi
deploy_service() {
if [[ "${DEPLOY[@]}" =~ "_$1_" && -z $2 ]]; then
return
fi
echo -e ${GREEN?}'SKIP service "'$1'"'${RESET?}
false
}
# You need to loging to gcloud and createa a project using gcloud cli.
# Export the id of your project to environment variable PROJECT.
echo -e ${GREEN?}'Starting deployment to project: '${PROJECT?}${RESET?}
gcloud config set project ${PROJECT?}
# Generate the config files
if [[ "${IC_CONFIG}" == "" ]]; then
echo -e ${GREEN?}'Generating the default IC config files.'${RESET?}
echo -e ${GREEN?}'To use your own configs instead, set environment variable "IC_CONFIG" to point to your config folders.'${RESET?}
else
echo -e ${GREEN?}'Using the provided IC_CONFIG files at: '${IC_CONFIG?}${RESET?}
fi
if [[ "$PROMPT" != "" ]]; then
echo -e ${GREEN?}'PRESS ENTER TO CONTINUE...'${RESET?}
read
fi
# Create IC and DAM config directories if they do not exist.
mkdir -p ./deploy/config/ic/
if [[ "${IC_CONFIG}" == "" ]]; then
cp -R ./deploy/config/ic-gke-template/* ./deploy/config/ic/
else
cp -R $IC_CONFIG/* ./deploy/config/ic/
fi
sed -i 's/${DOMAIN_FOR_IC}/'${DOMAIN_IC?}'/g' ./deploy/config/ic/config_master_main_latest.json
sed -i 's/${DOMAIN_FOR_IC}/'${DOMAIN_IC?}'/g' ./deploy/config/ic/secrets_master_main_latest.json
mkdir -p ./deploy/build-gke/
cp -R ./deploy/build-gke-templates/* ./deploy/build-gke/
sed -i 's/${YOUR_PROJECT_ID}/'${PROJECT?}'/g' ./deploy/build-gke/hydra-ic/k8s.yaml
sed -i 's/${YOUR_PROJECT_ID}/'${PROJECT?}'/g' ./deploy/build-gke/ic/k8s.yaml
sed -i 's/${YOUR_PROJECT_ID}/'${PROJECT?}'/g' ./deploy/build-gke/icdemo/k8s.yaml
sed -i 's/${PRIVATE_IP_OF_CLOUDSQL}/'${DB_IP?}'/g' ./deploy/build-gke/hydra-ic/k8s.yaml
sed -i 's/${PRIVATE_IP_OF_CLOUDSQL}/'${DB_IP?}'/g' ./deploy/build-gke/ic/k8s.yaml
sed -i 's/${PRIVATE_IP_OF_CLOUDSQL}/'${DB_IP?}'/g' ./deploy/build-gke/icdemo/k8s.yaml
sed -i 's/${DOMAIN_FOR_IC}/'${DOMAIN_IC?}'/g' ./deploy/build-gke/hydra-ic/k8s.yaml
sed -i 's/${DOMAIN_FOR_IC}/'${DOMAIN_IC?}'/g' ./deploy/build-gke/ic/k8s.yaml
sed -i 's/${DOMAIN_FOR_IC}/'${DOMAIN_IC?}'/g' ./deploy/build-gke/icdemo/k8s.yaml
sed -i 's/${DOMAIN_FOR_IC}/'${DOMAIN_IC?}'/g' ./deploy/build-gke/ingress.yaml
sed -i 's/build-gke-templates/build-gke/g' ./deploy/build-gke/ic/Dockerfile
sed -i 's/build-gke-templates/build-gke/g' ./deploy/build-gke/ic/cloudbuild.yaml
sed -i 's/build-gke-templates/build-gke/g' ./deploy/build-gke/hydra-ic/Dockerfile
sed -i 's/build-gke-templates/build-gke/g' ./deploy/build-gke/hydra-ic/cloudbuild.yaml
if [[ "${CONFIG_ONLY}" != "" ]]; then
echo -e ${GREEN?}'CONFIG_ONLY flag is set. Skipping all other steps.'${RESET?}
exit 0
fi
# Build the Hydra, IC, ICDEMO images
if [[ "${BYPASS_BUILD}" == "" ]]; then
echo -e ${GREEN?}'Building Docker images for the services.'${RESET?}
if [[ "$PROMPT" != "" ]]; then
echo -e ${GREEN?}'PRESS ENTER TO CONTINUE...'${RESET?}
read
fi
if deploy_service "hydraic" $BYPASS_BUILD; then
echo -e ${GREEN?}'Building Hydra IC Docker Image.'${RESET?}
gcloud builds submit --project=${PROJECT?} --config deploy/build-gke/hydra-ic/cloudbuild.yaml .
fi
if deploy_service "ic" $BYPASS_BUILD; then
echo -e ${GREEN?}'Building IC Docker Image.'${RESET?}
gcloud builds submit --project=${PROJECT?} --config deploy/build-gke/ic/cloudbuild.yaml .
fi
if deploy_service "icdemo" $BYPASS_BUILD; then
echo -e ${GREEN?}'Building ICDEMO Docker Image.'${RESET?}
gcloud builds submit --project=${PROJECT?} --config deploy/build-gke/icdemo/cloudbuild.yaml .
fi
else
echo -e ${GREEN?}'BYPASS_BUILD flag is set. Bypassing the building of Docker images for the services.'${RESET?}
fi
# Deploy Services
echo -e ${GREEN?}'Deploying services to the GCP project.'${RESET?}
if [[ "${PROMPT}" != "" ]]; then
echo -e ${GREEN?}'PRESS ENTER TO CONTINUE...'${RESET?}
read
fi
if deploy_service "hydraic"; then
echo -e ${GREEN?}'Deploy Hydra IC.'${RESET?}
kubectl apply -f deploy/build-gke/hydra-ic/k8s.yaml
fi
if deploy_service "ic"; then
echo -e ${GREEN?}'Deploy IC.'${RESET?}
kubectl apply -f deploy/build-gke/ic/k8s.yaml
fi
if deploy_service "icdemo"; then
echo -e ${GREEN?}'Deploy ICDEMO.'${RESET?}
kubectl apply -f deploy/build-gke/icdemo/k8s.yaml
fi
kubectl apply -f deploy/build-gke/ingress.yaml
echo -e ${GREEN?}'=== DEPLOY COMPLETE, But it may need 10 min to effect ==='${RESET?}