mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
214 lines
4.6 KiB
Bash
Executable File
214 lines
4.6 KiB
Bash
Executable File
#!/bin/bash -l
|
|
# note: the -l is needed here for bash to always make a login shell and load rvm if it hasn't been loaded
|
|
#
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you 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.
|
|
|
|
# build script which wraps around nose to test the systemvm
|
|
|
|
function usage() {
|
|
cat <<END
|
|
Usage:
|
|
./build.sh
|
|
END
|
|
exit 0
|
|
}
|
|
echo $@ | grep help >/dev/null && usage
|
|
echo $@ | grep '\-h' >/dev/null && usage
|
|
|
|
set -e
|
|
|
|
###
|
|
### Configuration
|
|
###
|
|
# whether to show DEBUG logs
|
|
DEBUG="${DEBUG:-}"
|
|
# whether to have other commands trace their actions
|
|
TRACE="${TRACE:-0}"
|
|
JENKINS_HOME=${JENKINS_HOME:-}
|
|
if [[ ! -z "${JENKINS_HOME}" ]]; then
|
|
DEBUG=1
|
|
fi
|
|
|
|
VPC_IP="${VPC_IP:-192.168.56.254}"
|
|
export VPC_IP
|
|
|
|
# inject our custom VBoxManage wrapper script
|
|
export PATH=$PWD:$PATH
|
|
|
|
###
|
|
### Generic helper functions
|
|
###
|
|
|
|
# how to tell sed to use extended regular expressions
|
|
os=`uname`
|
|
sed_regex_option="-E"
|
|
if [ "${os}" == "Linux" ]; then
|
|
sed_regex_option="-r"
|
|
fi
|
|
|
|
# logging support
|
|
if [[ "${DEBUG}" == "1" ]]; then
|
|
set -x
|
|
fi
|
|
|
|
function log() {
|
|
local level=${1?}
|
|
shift
|
|
|
|
if [[ "${DEBUG}" != "1" && "${level}" == "DEBUG" ]]; then
|
|
return
|
|
fi
|
|
|
|
local code=
|
|
local line="[$(date '+%F %T')] $level: $*"
|
|
if [ -t 2 ]
|
|
then
|
|
case "$level" in
|
|
INFO) code=36 ;;
|
|
DEBUG) code=30 ;;
|
|
WARN) code=33 ;;
|
|
ERROR) code=31 ;;
|
|
*) code=37 ;;
|
|
esac
|
|
echo -e "\033[${code}m${line}\033[0m"
|
|
else
|
|
echo "$line"
|
|
fi >&2
|
|
}
|
|
|
|
function error() {
|
|
log ERROR $@
|
|
exit 1
|
|
}
|
|
|
|
# cleanup code support
|
|
declare -a on_exit_items
|
|
|
|
function on_exit() {
|
|
for (( i=${#on_exit_items[@]}-1 ; i>=0 ; i-- )) ; do
|
|
log DEBUG "on_exit: ${on_exit_items[${i}]}"
|
|
eval ${on_exit_items[${i}]}
|
|
done
|
|
}
|
|
|
|
function add_on_exit() {
|
|
local n=${#on_exit_items[*]}
|
|
on_exit_items[${n}]="$*"
|
|
if [ ${n} -eq 0 ]; then
|
|
log DEBUG "Setting trap"
|
|
trap on_exit EXIT
|
|
fi
|
|
}
|
|
|
|
# retry code support
|
|
function retry() {
|
|
local times=$1
|
|
shift
|
|
local count=0
|
|
while [ ${count} -lt ${times} ]; do
|
|
"$@" && break
|
|
count=$(( $count + 1 ))
|
|
sleep ${count}
|
|
done
|
|
|
|
if [ ${count} -eq ${times} ]; then
|
|
error "Failed ${times} times: $@"
|
|
fi
|
|
}
|
|
|
|
###
|
|
### Script logic
|
|
###
|
|
|
|
function setup_ruby() {
|
|
local bundle_args=
|
|
if [[ ! -z "${JENKINS_HOME}" ]]; then
|
|
# inspired by https://github.com/CloudBees-community/rubyci-clickstart/blob/master/bin/run-ci
|
|
# also see https://rvm.io/integration/jenkins
|
|
# .rvmrc won't get trusted/auto-loaded by jenkins by default
|
|
export VAGRANT_HOME=$HOME/.vagrant.d-release-cloudstack
|
|
# rvm use ruby-1.9.3@vagrant-release-cloudstack --create
|
|
# do not use --deployment since that requires Gemfile.lock...and we prefer an up-to-date veewee
|
|
bundle_args="--path vendor/bundle"
|
|
fi
|
|
bundle check || bundle install ${bundle_args}
|
|
}
|
|
|
|
function setup_python() {
|
|
which pip || sudo easy_install pip
|
|
pip install nose paramiko python-vagrant envassert cuisine fabric
|
|
}
|
|
|
|
function prepare() {
|
|
log INFO "preparing for build"
|
|
setup_ruby
|
|
setup_python
|
|
rm -f systemvm.iso
|
|
}
|
|
|
|
function box_update() {
|
|
log INFO "invoking vagrant box update"
|
|
vagrant box update
|
|
log INFO "vagrant box update complete"
|
|
}
|
|
|
|
function vagrant_up() {
|
|
log INFO "invoking vagrant up"
|
|
vagrant up --no-provision
|
|
log INFO "vagrant up complete"
|
|
}
|
|
|
|
function vagrant_provision() {
|
|
log INFO "invoking vagrant provision"
|
|
vagrant provision
|
|
log INFO "vagrant up complete"
|
|
}
|
|
|
|
function nose() {
|
|
log INFO "invoking nose"
|
|
PWD=`pwd`
|
|
(cd ../../../test/systemvm;
|
|
mkdir -p target/test-reports;
|
|
nosetests --with-xunit --xunit-file=target/test-reports/xunit.xml;)
|
|
}
|
|
|
|
function vagrant_destroy() {
|
|
log INFO "invoking vagrant destroy"
|
|
vagrant destroy -f
|
|
log INFO "vagrant destroy complete"
|
|
}
|
|
|
|
###
|
|
### Main invocation
|
|
###
|
|
|
|
function main() {
|
|
prepare
|
|
box_update
|
|
vagrant_destroy
|
|
add_on_exit vagrant_destroy
|
|
vagrant_up
|
|
vagrant_provision
|
|
nose
|
|
add_on_exit log INFO "BUILD SUCCESSFUL"
|
|
exit
|
|
}
|
|
|
|
# we only run main() if not source-d
|
|
return 2>/dev/null || main
|