setup/scripts/util.bash (113 lines of code) (raw):

#!/bin/bash # 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. # Font colors export RED='\033[1;31m' export CYAN='\033[1;36m' export GREEN='\033[1;32m' export NC='\033[0m' # No Color export GCLOUD=${GCLOUD:-"gcloud -q"} function log_red() { echo -e "${RED}$@${NC}" } function log_cyan() { echo -e "${CYAN}$@${NC}" } function log_green() { echo -e "${GREEN}$@${NC}" } function get_user_input() { local PROMPT="$1" local DEFAULT="$2" [[ -z "${PROMPT}" ]] && $(log_red "USAGE: ${FUNCNAME[*]} <PROMPT> [<DEFAULT VALUE>]" >&2) && return 1 while [[ -z "${INPUT}" ]]; do if [[ -n "${DEFAULT}" ]]; then read -p "$(log_green $PROMPT \(enter for default: ${DEFAULT}\)): " INPUT [[ -z "${INPUT}" && -n "${DEFAULT}" ]] && INPUT=${DEFAULT} else read -p "$(log_green $PROMPT): " INPUT fi done echo "${INPUT}" } function cloudbuild_project_owner() { local PROJECT_ID=$1 local PROJECT_NUMBER=$($GCLOUD projects describe ${PROJECT_ID} --format 'value(projectNumber)') $GCLOUD services enable cloudbuild.googleapis.com $GCLOUD projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role roles/owner >/dev/null } function enable_services() { ${GCLOUD?env not set} services enable \ compute.googleapis.com \ container.googleapis.com \ cloudbuild.googleapis.com \ sourcerepo.googleapis.com } function get_csr_repo_url() { local REPO_NAME=$1 [[ -z "${REPO_NAME}" ]] && $(log_red "USAGE: ${FUNCNAME[*]} <REPO_NAME>" >&2) && return 1 ${GCLOUD?env not set} source repos describe ${REPO_NAME} --format='value(url)' 2>/dev/null || true } function init_csr_repo() { local REPO_NAME=$1 [[ -z "${REPO_NAME}" ]] && $(log_red "USAGE: ${FUNCNAME[*]} <REPO_NAME>" >&2) && return 1 # Skip creation if repo already exists [[ -n "$(get_csr_repo_url ${REPO_NAME})" ]] && return 0 # Create repo ${GCLOUD?env not set} source repos create ${REPO_NAME} } function delete_csr_repo() { local REPO_NAME=$1 [[ -z "${REPO_NAME}" ]] && $(log_red "USAGE: ${FUNCNAME[*]} <REPO_NAME>" >&2) && return 1 # Delete repo ${GCLOUD?env not set} source repos delete $REPO_NAME } function get_build_trigger_id() { local PROJECT_ID=$1 local REPO_NAME=$2 local BRANCH=$3 [[ -z "${PROJECT_ID}" || -z "${REPO_NAME}" || -z "${BRANCH}" ]] && $(log_red "USAGE: ${FUNCNAME[*]} <PROJECT_ID> <REPO_NAME> <BRANCH>" >&2) && return 1 ${GCLOUD?env not set} beta builds triggers list --filter "triggerTemplate.repoName=${REPO_NAME} AND triggerTemplate.projectId=${PROJECT_ID} AND triggerTemplate.branchName=${BRANCH}" --format='value(id)' 2>/dev/null return 0 } function create_build_trigger() { local TRIGGER_NAME=$1 local REPO_NAME=$2 local BUILD_CONFIG=$3 local BRANCH=$4 local SUBSTITUTIONS=$5 [[ -z "${REPO_NAME}" || -z "${BUILD_CONFIG}" || -z "${BRANCH}" ]] && $(log_red "USAGE: ${FUNCNAME[*]} <REPO_NAME> <BUILD_CONFIG> <BRANCH> [<SUBSTITUTIONS KEY=VALUE,...]" >&2) && return 1 SUBSTITUTIONS_ARG="--substitutions=$SUBSTITUTIONS" ${GCLOUD?env not set} beta builds triggers create cloud-source-repositories \ --repo="${REPO_NAME}" \ --description="${TRIGGER_NAME}" \ --branch-pattern="${BRANCH}" \ --build-config="${BUILD_CONFIG}" \ ${SUBSTITUTIONS_ARG} } function delete_build_trigger() { local TRIGGER_NAME=$1 [[ -z "${TRIGGER_NAME}" ]] && $(log_red "USAGE: ${FUNCNAME[*]} <TRIGGER_NAME>" >&2) && return 1 ${GCLOUD?env not set} beta builds triggers delete "${TRIGGER_NAME}" } function init_git_repo() { local REPO_DIR=$1 local USER_EMAIL=$2 local USER_NAME=$3 [[ -z "${REPO_DIR}" || -z "${USER_EMAIL}" || -z "${USER_NAME}" ]] && $(log_red "USAGE: ${FUNCNAME[*]} <REPO_DIR> <USER_EMAIL> <USER_NAME>" >&2) && return 1 cd "${REPO_DIR}" # Skip init if already initialized. if [[ ! -d ".git" ]]; then git init git config --local user.email "${USER_EMAIL}" git config --local user.name "${USER_NAME}" git config --local credential.'https://source.developers.google.com'.helper gcloud.sh git add . && git commit -am "initial commit" fi } function init_csr_git_remote() { local REPO_DIR=$1 local REPO_NAME=$2 local REMOTE_NAME=$3 [[ -z "${REPO_DIR}" || -z "${REPO_NAME}" || -z "${REMOTE_NAME}" ]] && $(log_red "USAGE: ${FUNCNAME[*]} <REPO_DIR> <REPO_NAME> <REMOTE_NAME>" >&2) && return 1 cd "${REPO_DIR}" REMOTE_URL=$(get_csr_repo_url ${REPO_NAME}) # Skip if remote has already been added CURR_REMOTE_URL=$(git remote get-url ${REMOTE_NAME} 2>/dev/null || true) # Add new remote if it does not exist. [[ -z "${CURR_REMOTE_URL}" ]] && git remote add ${REMOTE_NAME} "${REMOTE_URL}" # Update URL if it does not match [[ "${CURR_REMOTE_URL}" != "${REMOTE_URL}" ]] && git remote set-url ${REMOTE_NAME} "${REMOTE_URL}" git push ${REMOTE_NAME} master }