#!/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 </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