blob: a6b503629b21a61b6a697e9948feebd1780b2c0c [file] [log] [blame]
#!/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-1204-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 -q "$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