1*90c8c64dSAndroid Build Coastguard WorkerSQL_SCRIPT_DIR="tools/migrations" 2*90c8c64dSAndroid Build Coastguard Worker 3*90c8c64dSAndroid Build Coastguard WorkerDOCKER_SERVICE_NAME="repodiff-service" 4*90c8c64dSAndroid Build Coastguard WorkerDOCKER_CONTAINER_REGISTRY="gcr.io" 5*90c8c64dSAndroid Build Coastguard WorkerDOCKER_IMAGE_NAME="repodiff-image" 6*90c8c64dSAndroid Build Coastguard WorkerDOCKER_TAG_NAME="latest" 7*90c8c64dSAndroid Build Coastguard WorkerDOCKER_DOCKERFILE_DIR="." 8*90c8c64dSAndroid Build Coastguard WorkerDOCKER_TARGET_PORT=$(shell cat config.json | jq ".port") 9*90c8c64dSAndroid Build Coastguard WorkerDOCKER_CLUSTER_NAME="repodiff-default-cluster" 10*90c8c64dSAndroid Build Coastguard WorkerDOCKER_DEPLOYMENT_NAME="repodiff-deployment" 11*90c8c64dSAndroid Build Coastguard WorkerDOCKER_REPLICA_COUNT="1" 12*90c8c64dSAndroid Build Coastguard Worker 13*90c8c64dSAndroid Build Coastguard WorkerDOCKER_CANONICAL_ID=$(DOCKER_CONTAINER_REGISTRY)/$(GOOGLE_PROJECT_ID)/$(DOCKER_IMAGE_NAME):$(DOCKER_TAG_NAME) 14*90c8c64dSAndroid Build Coastguard Worker 15*90c8c64dSAndroid Build Coastguard WorkerPORT_HTTP="80" 16*90c8c64dSAndroid Build Coastguard WorkerGCE_ZONE="us-west1-b" 17*90c8c64dSAndroid Build Coastguard WorkerGCE_IMAGE_PROJECT="ubuntu-os-cloud" 18*90c8c64dSAndroid Build Coastguard WorkerGCE_IMAGE_FAMILY="ubuntu-1604-lts" 19*90c8c64dSAndroid Build Coastguard Worker 20*90c8c64dSAndroid Build Coastguard WorkerTMP_CREDENTIAL_FNAME=service_account_credentials.json 21*90c8c64dSAndroid Build Coastguard Worker 22*90c8c64dSAndroid Build Coastguard Worker# https://cloud.google.com/compute/docs/machine-types 23*90c8c64dSAndroid Build Coastguard WorkerGCE_MACHINE_TYPE="n1-standard-64" 24*90c8c64dSAndroid Build Coastguard Worker 25*90c8c64dSAndroid Build Coastguard WorkerPROJECT_NAME="auto-diff-android-branches" 26*90c8c64dSAndroid Build Coastguard WorkerREMOTE_MACHINE_NAME=mithalop5 27*90c8c64dSAndroid Build Coastguard WorkerFIREWALL_NAME=public-http-access 28*90c8c64dSAndroid Build Coastguard WorkerDISK_SIZE=500GB 29*90c8c64dSAndroid Build Coastguard WorkerRUN_COMMAND_REMOTE=gcloud compute --project $(PROJECT_NAME) ssh --zone $(GCE_ZONE) "$(REMOTE_MACHINE_NAME)" --command 30*90c8c64dSAndroid Build Coastguard WorkerSCP_TO_HOST=gcloud compute --project $(PROJECT_NAME) scp --zone $(GCE_ZONE) 31*90c8c64dSAndroid Build Coastguard WorkerSERVICE_ACCOUNT_ID=repo-reader 32*90c8c64dSAndroid Build Coastguard WorkerSERVICE_ACCOUNT=$(SERVICE_ACCOUNT_ID)@$(PROJECT_NAME).iam.gserviceaccount.com 33*90c8c64dSAndroid Build Coastguard Worker 34*90c8c64dSAndroid Build Coastguard Workerifeq ($(ROLE),prod) 35*90c8c64dSAndroid Build Coastguard Worker GCP_DB_USER=$(GCP_DB_USER_PROD) 36*90c8c64dSAndroid Build Coastguard Worker GCP_DB_INSTANCE_CONNECTION_NAME=$(GCP_DB_INSTANCE_CONNECTION_NAME_PROD) 37*90c8c64dSAndroid Build Coastguard Worker GCP_DB_PASSWORD=$(GCP_DB_PASSWORD_PROD) 38*90c8c64dSAndroid Build Coastguard Worker GCP_DB_NAME=$(GCP_DB_NAME_PROD) 39*90c8c64dSAndroid Build Coastguard Worker GCP_DB_PROXY_PORT=$(GCP_DB_PROXY_PORT_PROD) 40*90c8c64dSAndroid Build Coastguard Workerelse 41*90c8c64dSAndroid Build Coastguard Worker GCP_DB_USER=$(GCP_DB_USER_DEV) 42*90c8c64dSAndroid Build Coastguard Worker GCP_DB_INSTANCE_CONNECTION_NAME=$(GCP_DB_INSTANCE_CONNECTION_NAME_DEV) 43*90c8c64dSAndroid Build Coastguard Worker GCP_DB_PASSWORD=$(GCP_DB_PASSWORD_DEV) 44*90c8c64dSAndroid Build Coastguard Worker GCP_DB_NAME=$(GCP_DB_NAME_DEV) 45*90c8c64dSAndroid Build Coastguard Worker GCP_DB_PROXY_PORT=$(GCP_DB_PROXY_PORT_DEV) 46*90c8c64dSAndroid Build Coastguard Workerendif 47*90c8c64dSAndroid Build Coastguard Worker 48*90c8c64dSAndroid Build Coastguard Worker 49*90c8c64dSAndroid Build Coastguard Workerbootstrap: 50*90c8c64dSAndroid Build Coastguard Worker mkdir -p $(GOPATH)/src 51*90c8c64dSAndroid Build Coastguard Worker ./tools/setup_go_path_symlink.sh 52*90c8c64dSAndroid Build Coastguard Worker # include $GOPATH/bin as part of system path 53*90c8c64dSAndroid Build Coastguard Worker grep -q -F 'export PATH=$$PATH:$$GOPATH/bin' ~/.bashrc || echo 'export PATH=$$PATH:$$GOPATH/bin' >> ~/.bashrc 54*90c8c64dSAndroid Build Coastguard Worker source ~/.bashrc 55*90c8c64dSAndroid Build Coastguard Worker cd $(GOPATH)/src/repodiff; go get github.com/GoogleCloudPlatform/cloudsql-proxy/cmd/cloud_sql_proxy; \ 56*90c8c64dSAndroid Build Coastguard Worker go get github.com/golang/dep/cmd/dep; \ 57*90c8c64dSAndroid Build Coastguard Worker dep ensure; \ 58*90c8c64dSAndroid Build Coastguard Worker go build 59*90c8c64dSAndroid Build Coastguard Worker 60*90c8c64dSAndroid Build Coastguard Workerrun: 61*90c8c64dSAndroid Build Coastguard Worker go build; 62*90c8c64dSAndroid Build Coastguard Worker ROLE="dev" ./repodiff 63*90c8c64dSAndroid Build Coastguard Worker 64*90c8c64dSAndroid Build Coastguard Workerrun_prod: 65*90c8c64dSAndroid Build Coastguard Worker go build; 66*90c8c64dSAndroid Build Coastguard Worker ROLE="prod" ./repodiff 67*90c8c64dSAndroid Build Coastguard Worker 68*90c8c64dSAndroid Build Coastguard Workerreformat: 69*90c8c64dSAndroid Build Coastguard Worker go fmt . 70*90c8c64dSAndroid Build Coastguard Worker 71*90c8c64dSAndroid Build Coastguard Workerdb_shell: 72*90c8c64dSAndroid Build Coastguard Worker mysql -u $(GCP_DB_USER) -h 127.0.0.1 -P $(GCP_DB_PROXY_PORT) -p$(GCP_DB_PASSWORD) $(GCP_DB_NAME) ${EXTRA} 73*90c8c64dSAndroid Build Coastguard Worker 74*90c8c64dSAndroid Build Coastguard Workerdb_proxy: 75*90c8c64dSAndroid Build Coastguard Worker $(GOPATH)/bin/cloud_sql_proxy -instances=$(GCP_DB_INSTANCE_CONNECTION_NAME_DEV)=tcp:$(GCP_DB_PROXY_PORT_DEV) & 76*90c8c64dSAndroid Build Coastguard Worker $(GOPATH)/bin/cloud_sql_proxy -instances=$(GCP_DB_INSTANCE_CONNECTION_NAME_PROD)=tcp:$(GCP_DB_PROXY_PORT_PROD) & 77*90c8c64dSAndroid Build Coastguard Worker 78*90c8c64dSAndroid Build Coastguard Workerdb_proxy_ignore_err: 79*90c8c64dSAndroid Build Coastguard Worker make db_proxy; true 80*90c8c64dSAndroid Build Coastguard Worker 81*90c8c64dSAndroid Build Coastguard Workerstart_sql: 82*90c8c64dSAndroid Build Coastguard Worker make db_proxy_ignore_err & 83*90c8c64dSAndroid Build Coastguard Worker make db_shell < $(SQL_SCRIPT_DIR)/required_meta.sql 84*90c8c64dSAndroid Build Coastguard Worker 85*90c8c64dSAndroid Build Coastguard Workerdb_upgrade: 86*90c8c64dSAndroid Build Coastguard Worker make start_sql 87*90c8c64dSAndroid Build Coastguard Worker python tools/upgrade_db.py upgrade $(SQL_SCRIPT_DIR) 88*90c8c64dSAndroid Build Coastguard Worker 89*90c8c64dSAndroid Build Coastguard Worker 90*90c8c64dSAndroid Build Coastguard Workerdb_downgrade: 91*90c8c64dSAndroid Build Coastguard Worker make start_sql 92*90c8c64dSAndroid Build Coastguard Worker python tools/upgrade_db.py downgrade $(SQL_SCRIPT_DIR) 93*90c8c64dSAndroid Build Coastguard Worker 94*90c8c64dSAndroid Build Coastguard Workerexample: 95*90c8c64dSAndroid Build Coastguard Worker make db_shell EXTRA="-e 'DESCRIBE project_differential;'" 96*90c8c64dSAndroid Build Coastguard Worker 97*90c8c64dSAndroid Build Coastguard Workertest: 98*90c8c64dSAndroid Build Coastguard Worker rm -rf build/ 99*90c8c64dSAndroid Build Coastguard Worker ROLE="dev" go test ./... -v | grep -v PASS | grep -v RUN 100*90c8c64dSAndroid Build Coastguard Worker 101*90c8c64dSAndroid Build Coastguard Workersql_script: 102*90c8c64dSAndroid Build Coastguard Worker python tools/create_sql_script.py 103*90c8c64dSAndroid Build Coastguard Worker 104*90c8c64dSAndroid Build Coastguard Workerssh: 105*90c8c64dSAndroid Build Coastguard Worker gcloud compute --project $(PROJECT_NAME) ssh --zone $(GCE_ZONE) $(REMOTE_MACHINE_NAME) 106*90c8c64dSAndroid Build Coastguard Worker 107*90c8c64dSAndroid Build Coastguard Workerdeploy: 108*90c8c64dSAndroid Build Coastguard Worker gcloud config set project $(PROJECT_NAME) 109*90c8c64dSAndroid Build Coastguard Worker @echo "Starting docker image build" 110*90c8c64dSAndroid Build Coastguard Worker make build_container_image 111*90c8c64dSAndroid Build Coastguard Worker @echo "Creating machine if it doesn't already exist" 112*90c8c64dSAndroid Build Coastguard Worker gcloud compute instances create $(REMOTE_MACHINE_NAME) \ 113*90c8c64dSAndroid Build Coastguard Worker --machine-type $(GCE_MACHINE_TYPE) \ 114*90c8c64dSAndroid Build Coastguard Worker --boot-disk-size $(DISK_SIZE) \ 115*90c8c64dSAndroid Build Coastguard Worker --scopes https://www.googleapis.com/auth/source.read_only,https://www.googleapis.com/auth/compute \ 116*90c8c64dSAndroid Build Coastguard Worker --zone $(GCE_ZONE) \ 117*90c8c64dSAndroid Build Coastguard Worker --local-ssd interface=nvme \ 118*90c8c64dSAndroid Build Coastguard Worker --metadata-from-file startup-script=remote_scripts/gce_startup.sh \ 119*90c8c64dSAndroid Build Coastguard Worker --metadata AUTHOR=$(USER),SERVICE_ACCOUNT=$(SERVICE_ACCOUNT),GOOGLE_PROJECT_ID=$(GOOGLE_PROJECT_ID) \ 120*90c8c64dSAndroid Build Coastguard Worker --image-project $(GCE_IMAGE_PROJECT) \ 121*90c8c64dSAndroid Build Coastguard Worker --image-family $(GCE_IMAGE_FAMILY) \ 122*90c8c64dSAndroid Build Coastguard Worker --min-cpu-platform skylake \ 123*90c8c64dSAndroid Build Coastguard Worker --service-account $(SERVICE_ACCOUNT) \ 124*90c8c64dSAndroid Build Coastguard Worker 2>/dev/null || true 125*90c8c64dSAndroid Build Coastguard Worker @echo "Hackily waiting a bit for instance to start up" 126*90c8c64dSAndroid Build Coastguard Worker # TODO(slobdell) need to add a mechanism to block until startup script has completed 127*90c8c64dSAndroid Build Coastguard Worker @sleep 60 128*90c8c64dSAndroid Build Coastguard Worker ./tools/clear_service_account_keys.py $(SERVICE_ACCOUNT) 2>/dev/null || true 129*90c8c64dSAndroid Build Coastguard Worker gcloud iam service-accounts keys create $(TMP_CREDENTIAL_FNAME) --iam-account $(SERVICE_ACCOUNT) 130*90c8c64dSAndroid Build Coastguard Worker $(RUN_COMMAND_REMOTE) 'mkdir -p /tmp/scripts' 131*90c8c64dSAndroid Build Coastguard Worker $(SCP_TO_HOST) remote_scripts/* "$(REMOTE_MACHINE_NAME)":/tmp/scripts/ 132*90c8c64dSAndroid Build Coastguard Worker $(SCP_TO_HOST) $(TMP_CREDENTIAL_FNAME) "$(REMOTE_MACHINE_NAME)":/tmp/ 133*90c8c64dSAndroid Build Coastguard Worker rm $(TMP_CREDENTIAL_FNAME) 134*90c8c64dSAndroid Build Coastguard Worker @echo "Stopping all existing docker images" 135*90c8c64dSAndroid Build Coastguard Worker $(RUN_COMMAND_REMOTE) 'docker stop $$(docker ps -a -q)' 2>/dev/null || true 136*90c8c64dSAndroid Build Coastguard Worker docker image save $(DOCKER_CANONICAL_ID) -o transferrable_docker_image.tar \ 137*90c8c64dSAndroid Build Coastguard Worker && $(SCP_TO_HOST) transferrable_docker_image.tar "$(REMOTE_MACHINE_NAME)":~/transferred_docker_image.tar \ 138*90c8c64dSAndroid Build Coastguard Worker && $(RUN_COMMAND_REMOTE) 'docker load -i transferred_docker_image.tar' \ 139*90c8c64dSAndroid Build Coastguard Worker && $(RUN_COMMAND_REMOTE) 'docker run -d --rm -p $(DOCKER_TARGET_PORT):$(DOCKER_TARGET_PORT) $(DOCKER_CANONICAL_ID)' \ 140*90c8c64dSAndroid Build Coastguard Worker && gcloud compute firewall-rules create $(FIREWALL_NAME) --allow tcp:$(DOCKER_TARGET_PORT) 2>/dev/null || true \ 141*90c8c64dSAndroid Build Coastguard Worker && gcloud compute firewall-rules update $(FIREWALL_NAME) --allow tcp:$(DOCKER_TARGET_PORT) --source-tags="$(REMOTE_MACHINE_NAME)" --source-ranges=0.0.0.0/0 --description="Allow requests over HTTP" 142*90c8c64dSAndroid Build Coastguard Worker @make output_instance_url --no-print-directory 143*90c8c64dSAndroid Build Coastguard Worker @rm transferrable_docker_image.tar 144*90c8c64dSAndroid Build Coastguard Worker 145*90c8c64dSAndroid Build Coastguard Workeroutput_instance_url: 146*90c8c64dSAndroid Build Coastguard Worker @echo "Monitor progress at http://"$(shell (gcloud compute instances list | grep $(REMOTE_MACHINE_NAME) | awk -F ' ' '{print $$5}')):$(DOCKER_TARGET_PORT)/health 147*90c8c64dSAndroid Build Coastguard Worker 148*90c8c64dSAndroid Build Coastguard Workerdestroy: 149*90c8c64dSAndroid Build Coastguard Worker gcloud compute instances delete $(REMOTE_MACHINE_NAME) --zone $(GCE_ZONE) --quiet 150*90c8c64dSAndroid Build Coastguard Worker 151*90c8c64dSAndroid Build Coastguard Worker############## DOCKER DEPLOYMENT 152*90c8c64dSAndroid Build Coastguard Workerbuild_container_image: 153*90c8c64dSAndroid Build Coastguard Worker mkdir -p ./build 154*90c8c64dSAndroid Build Coastguard Worker # move contents of entire directory into build 155*90c8c64dSAndroid Build Coastguard Worker find . -type f -not -path 'build' -exec cp --parents '{}' 'build/' \; 156*90c8c64dSAndroid Build Coastguard Worker # copy python scripts repo uses, TODO re-structure codebase so the dependencies align with file structure 157*90c8c64dSAndroid Build Coastguard Worker cp ../../*.{txt,py} build/ 158*90c8c64dSAndroid Build Coastguard Worker # Application credentials must be downloaded from https://pantheon.corp.google.com; set this environment variable to the path of the downloaded file 159*90c8c64dSAndroid Build Coastguard Worker cp $(GOOGLE_APPLICATION_CREDENTIALS) build/ 160*90c8c64dSAndroid Build Coastguard Worker # copy local environment variables into Dockerfile 161*90c8c64dSAndroid Build Coastguard Worker cat Dockerfile | envsubst > build/Dockerfile 162*90c8c64dSAndroid Build Coastguard Worker # copy permissions from local gitcookies into Dockerfile (container will sync repo as you) 163*90c8c64dSAndroid Build Coastguard Worker cp static/docker_git_config ./build/.gitconfig 164*90c8c64dSAndroid Build Coastguard Worker cp ~/.gitcookies ./build/.gitcookies 165*90c8c64dSAndroid Build Coastguard Worker docker build -t $(DOCKER_CANONICAL_ID) ./build 166*90c8c64dSAndroid Build Coastguard Worker rm -rf ./build 167*90c8c64dSAndroid Build Coastguard Worker 168*90c8c64dSAndroid Build Coastguard Workerdocker_shell: 169*90c8c64dSAndroid Build Coastguard Worker docker run -it --rm $(DOCKER_CANONICAL_ID) bash 170*90c8c64dSAndroid Build Coastguard Worker 171*90c8c64dSAndroid Build Coastguard Workerupload_container_image: 172*90c8c64dSAndroid Build Coastguard Worker gcloud config set project $(GOOGLE_PROJECT_ID) 173*90c8c64dSAndroid Build Coastguard Worker gcloud docker -- push $(DOCKER_CANONICAL_ID) 174*90c8c64dSAndroid Build Coastguard Worker 175*90c8c64dSAndroid Build Coastguard Workerrun_container_local: 176*90c8c64dSAndroid Build Coastguard Worker docker run --rm -p $(DOCKER_TARGET_PORT):$(DOCKER_TARGET_PORT) $(DOCKER_CANONICAL_ID) 177*90c8c64dSAndroid Build Coastguard Worker 178*90c8c64dSAndroid Build Coastguard Workercreate_container_cluster: 179*90c8c64dSAndroid Build Coastguard Worker gcloud container clusters create $(DOCKER_CLUSTER_NAME) \ 180*90c8c64dSAndroid Build Coastguard Worker --num-nodes=3 \ 181*90c8c64dSAndroid Build Coastguard Worker --machine-type $(GCE_MACHINE_TYPE) \ 182*90c8c64dSAndroid Build Coastguard Worker --zone $(GCE_ZONE) 183*90c8c64dSAndroid Build Coastguard Worker 184*90c8c64dSAndroid Build Coastguard Workercreate_container_cluster_verify: 185*90c8c64dSAndroid Build Coastguard Worker gcloud compute instances list 186*90c8c64dSAndroid Build Coastguard Worker 187*90c8c64dSAndroid Build Coastguard Workerexpose_to_internets: 188*90c8c64dSAndroid Build Coastguard Worker kubectl expose deployment $(DOCKER_DEPLOYMENT_NAME) --type=LoadBalancer --port $(PORT_HTTP) --target-port $(DOCKER_TARGET_PORT) 189*90c8c64dSAndroid Build Coastguard Worker 190*90c8c64dSAndroid Build Coastguard Workerexpose_to_internets_verify: 191*90c8c64dSAndroid Build Coastguard Worker kubectl get service 192*90c8c64dSAndroid Build Coastguard Worker 193*90c8c64dSAndroid Build Coastguard Workerscale: 194*90c8c64dSAndroid Build Coastguard Worker kubectl scale deployment $(DOCKER_DEPLOYMENT_NAME) --replicas=$(DOCKER_REPLICA_COUNT) 195*90c8c64dSAndroid Build Coastguard Worker 196*90c8c64dSAndroid Build Coastguard Workercleanup: 197*90c8c64dSAndroid Build Coastguard Worker kubectl delete service 198*90c8c64dSAndroid Build Coastguard Worker############## END DOCKER DEPLOYMENT 199