| #!/bin/bash |
| # |
| # Copyright 2016 Google Inc. |
| # |
| # 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. |
| # |
| # Author: cheesy@google.com (Steve Hill) |
| # |
| # Build a mod_pagespeed release on a gcloud VM. |
| # |
| # You may want to set CLOUDSDK_COMPUTE_REGION and/or CLOUDSDK_CORE_PROJECT, |
| # or set your gcloud defaults befor running this: |
| # https://cloud.google.com/sdk/gcloud/reference/config/set |
| |
| set -u |
| |
| branch=master |
| delete_existing_machine=false |
| image_family=ubuntu-1404-lts |
| keep_machine=false |
| machine_name= |
| use_existing_machine=false |
| |
| options="$(getopt --long build_branch:,centos,delete_existing_machine \ |
| --long image_family:,machine_name:,use_existing_machine \ |
| -o '' -- "$@")" |
| if [ $? -ne 0 ]; then |
| echo "Usage: $(basename "$0") [options] -- [build_release.sh options]" >&2 |
| echo " --build_branch=<branch> mod_pagespeed branch to build" >&2 |
| echo " --centos Shortcut for --image_family=centos-6" >&2 |
| echo " --delete_existing_machine If the VM already exists, delete it" >&2 |
| echo " --image_family=<family> Image family used to create VM" >&2 |
| echo " See: gcloud compute images list" >&2 |
| echo " --machine_name VM name to create" >&2 |
| echo " --use_existing_machine Re-run build on exiting VM" >&2 |
| exit 1 |
| fi |
| |
| set -e |
| eval set -- "$options" |
| |
| while [ $# -gt 0 ]; do |
| case "$1" in |
| --build_branch) branch="$2"; shift 2 ;; |
| --centos) image_family="centos-6"; shift ;; |
| --delete_existing_machine) delete_existing_machine=true; shift ;; |
| --image_family) image_family="$2"; shift 2 ;; |
| --keep_machine) keep_machine=true; shift ;; |
| --machine_name) machine_name="$2"; shift 2 ;; |
| --use_existing_machine) use_existing_machine=true; shift ;; |
| --) shift; break ;; |
| *) echo "getopt error" >&2; exit 1 ;; |
| esac |
| done |
| |
| if $use_existing_machine && $delete_existing_machine; then |
| echo "Supply only one of --delete_existing_machine and" \ |
| "--use_existing_machine" >&2 |
| exit 1 |
| fi |
| |
| if ! type gcloud >/dev/null 2>&1; then |
| echo "gcloud is not in your PATH. See: https://cloud.google.com/sdk/" >&2 |
| exit 1 |
| fi |
| |
| use_rpms=false |
| |
| case "$image_family" in |
| centos-*) image_project=centos-cloud ; use_rpms=true ;; |
| ubuntu-*) image_project=ubuntu-os-cloud ;; |
| *) echo "This script doesn't recognize image family '$image_family'" >&2; |
| exit 1 ;; |
| esac |
| |
| if [ -z "$machine_name" ]; then |
| bit_suffix= |
| for flag in "$@"; do |
| if [ "$flag" = "--32bit" ]; then |
| bit_suffix='-32' |
| break |
| fi |
| done |
| |
| # gcloud is pretty fussy about machine names. |
| sanitized_branch="$(tr _ - <<< "$branch" | tr -d .)" |
| |
| machine_name="${USER}-${image_family}${bit_suffix}" |
| machine_name+="-${sanitized_branch}-mps-build${bit_suffix}" |
| fi |
| |
| instances=$(gcloud compute instances list --filter="name=( '$machine_name' )") |
| if [ -n "$instances" ]; then |
| if $delete_existing_machine; then |
| gcloud -q compute instances delete "$machine_name" |
| instances= |
| elif ! $use_existing_machine; then |
| echo "Instance '$machine_name' already exists." >&2 |
| exit 1 |
| fi |
| fi |
| |
| if [ -z "$instances" ] || ! $use_existing_machine; then |
| gcloud compute instances create "$machine_name" \ |
| --image-family="$image_family" --image-project="$image_project" |
| fi |
| |
| mkdir -p ~/release |
| |
| # Display an error including the machine name if we die in the script below. |
| trap '[ $? -ne 0 ] && echo -e "\nBuild failed on $machine_name"' EXIT |
| |
| gcloud compute ssh "$machine_name" -- bash << EOF |
| set -e |
| set -x |
| if $use_rpms; then |
| sudo yum -y install git redhat-lsb |
| else |
| sudo apt-get -y install git |
| fi |
| # CentOS 6's git is old enough that git clone -b <tag> doesn't work and |
| # silently checks out HEAD. To be safe we use an explicit checkout below. |
| git clone https://github.com/pagespeed/mod_pagespeed.git |
| cd mod_pagespeed |
| git checkout "$branch" |
| install/build_release.sh $@ |
| EOF |
| |
| gcloud compute copy-files "${machine_name}:mod_pagespeed/release/*" ~/release/ |
| |
| if ! $keep_machine; then |
| gcloud -q compute instances delete "$machine_name" |
| fi |