Repository: cloudstack Updated Branches: refs/heads/4.3 a743937e4 -> df5dfd40c
[CLOUDSTACK-6115] Investigate the use of TravisCI for CloudStack integration testing (cherry picked from commit 26069aa3776ea4b634fb9d614062caa595bc0fa0) Signed-off-by: Rohit Yadav <rohit.ya...@shapeblue.com> Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/a58f098e Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/a58f098e Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/a58f098e Branch: refs/heads/4.3 Commit: a58f098ec01e6b6aa963171250914fe5a6394746 Parents: a743937 Author: Ian Duffy <du...@apache.org> Authored: Mon Sep 1 10:56:44 2014 +0100 Committer: Rohit Yadav <rohit.ya...@shapeblue.com> Committed: Mon Sep 1 12:40:58 2014 +0200 ---------------------------------------------------------------------- .travis.yml | 23 ++++++++++ tools/travis/after_failure.sh | 6 +++ tools/travis/after_script.sh | 6 +++ tools/travis/after_success.sh | 4 ++ tools/travis/before_install.sh | 50 ++++++++++++++++++++++ tools/travis/before_script.sh | 14 ++++++ tools/travis/install.sh | 27 ++++++++++++ tools/travis/script.sh | 5 +++ tools/travis/xunit-reader.py | 85 +++++++++++++++++++++++++++++++++++++ 9 files changed, 220 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a58f098e/.travis.yml ---------------------------------------------------------------------- diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..007d466 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,23 @@ +language: java +cache: + directories: + - $HOME/.cache +jdk: +- oraclejdk7 +notifications: + email: false +env: +- TESTS="test_affinity_groups test_deploy_vms_with_varied_deploymentplanners test_disk_offerings test_global_settings test_guest_vlan_range test_iso test_multipleips_per_nic test_network test_non_contigiousvlan test_over_provisioning" +- TESTS="test_portable_publicip test_primary_storage test_privategw_acl test_public_ip_range test_pvlan test_regions test_reset_vm_on_reboot test_resource_detail test_routers" +- TESTS="test_secondary_storage test_service_offerings test_ssvm test_templates misc/test_deploy_vm test_vm_life_cycle test_volumes test_vpc_vpn" +before_install: travis_wait 30 ./tools/travis/before_install.sh +install: ./tools/travis/install.sh +before_script: travis_wait 30 ./tools/travis/before_script.sh +script: +- mkdir -p integration-test-results/misc +- travis_wait 30 sleep 30 +- for suite in $TESTS; do travis_wait 30 nosetests --with-xunit --xunit-file=integration-test-results/$suite.xml --with-marvin --marvin-config=setup/dev/advanced.cfg test/integration/smoke/$suite.py -s -a tags=advanced,required_hardware=false --zone=Sandbox-simulator --hypervisor=simulator ; done +- python ./tools/travis/xunit-reader.py integration-test-results/ +after_success: ./tools/travis/after_success.sh +after_failure: ./tools/travis/after_failure.sh +after_script: ./tools/travis/after_script.sh http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a58f098e/tools/travis/after_failure.sh ---------------------------------------------------------------------- diff --git a/tools/travis/after_failure.sh b/tools/travis/after_failure.sh new file mode 100755 index 0000000..d0ea01d --- /dev/null +++ b/tools/travis/after_failure.sh @@ -0,0 +1,6 @@ +#!/bin/bash +# +# As the filename suggests, this is executed on build failure +# failure. +# + http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a58f098e/tools/travis/after_script.sh ---------------------------------------------------------------------- diff --git a/tools/travis/after_script.sh b/tools/travis/after_script.sh new file mode 100755 index 0000000..721de64 --- /dev/null +++ b/tools/travis/after_script.sh @@ -0,0 +1,6 @@ +#!/bin/bash +# +# This script should run any tear down commands required. +# + +mvn -Dsimulator -pl client jetty:stop 2>&1 http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a58f098e/tools/travis/after_success.sh ---------------------------------------------------------------------- diff --git a/tools/travis/after_success.sh b/tools/travis/after_success.sh new file mode 100755 index 0000000..5ca7ff0 --- /dev/null +++ b/tools/travis/after_success.sh @@ -0,0 +1,4 @@ +#!/bin/bash +# +# As the filename suggests this is executed on build success. +# http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a58f098e/tools/travis/before_install.sh ---------------------------------------------------------------------- diff --git a/tools/travis/before_install.sh b/tools/travis/before_install.sh new file mode 100755 index 0000000..aff3e56 --- /dev/null +++ b/tools/travis/before_install.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# +# This script should be used to install additional dependencies +# This includes: installing ubuntu packages, custom services +# or internet downloads. +# + +echo -e "#### System Information ####" + +echo -e "\nJava Version: " +javac -version + +echo -e "\nMaven Version: " +mvn -v + +echo -e "\nUpdating the system: " +sudo apt-get -q -y update > /dev/null + +echo -e "\nInstalling MySQL: " + +sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password password your_password' +sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password your_password' +sudo apt-get -q -y install mysql-server > /dev/null + +sudo /etc/init.d/mysql start + +echo -e "\nInstalling Tomcat: " +wget -q -O tomcat.tar.gz http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.33/bin/apache-tomcat-6.0.33.tar.gz +sudo mkdir -p /opt/tomcat +sudo tar xfv tomcat.tar.gz -C /opt/tomcat --strip 1 > /dev/null + +echo -e "\nInstalling Development tools: " + +sudo apt-get -q -y install uuid-runtime genisoimage python-setuptools python-pip netcat > /dev/null + +echo "<settings> + <mirrors> + <mirror> + <id>Central</id> + <url>http://repo1.maven.org/maven2</url> + <mirrorOf>central</mirrorOf> + <!-- United States, St. Louis--> + </mirror> + </mirrors> +</settings>" > ~/.m2/settings.xml + +echo -e "\nInstalling some python packages: " + +sudo pip install lxml > /dev/null +sudo pip install texttable > /dev/null http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a58f098e/tools/travis/before_script.sh ---------------------------------------------------------------------- diff --git a/tools/travis/before_script.sh b/tools/travis/before_script.sh new file mode 100755 index 0000000..607ed1b --- /dev/null +++ b/tools/travis/before_script.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# +# This script should be used to bring up the environment. +# + +export CATALINA_BASE=/opt/tomcat +export CATALINA_HOME=/opt/tomcat +export M2_HOME="/usr/local/maven-3.2.1/" +export MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=500m" + +mvn -Dsimulator -pl :cloud-client-ui jetty:run 2>&1 > /dev/null & + +while ! nc -vz localhost 8096 2>&1 > /dev/null; do sleep 10; done +python -m marvin.deployDataCenter -i setup/dev/advanced.cfg 2>&1 || true \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a58f098e/tools/travis/install.sh ---------------------------------------------------------------------- diff --git a/tools/travis/install.sh b/tools/travis/install.sh new file mode 100755 index 0000000..f8b22d4 --- /dev/null +++ b/tools/travis/install.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# +# This should be used to create the build. +# + +export CATALINA_BASE=/opt/tomcat +export CATALINA_HOME=/opt/tomcat +export M2_HOME="/usr/local/maven-3.2.1/" +export MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=500m" + +# Compile Cloudstack +mvn -q -Pimpatient -Dsimulator clean install + +# Compile API Docs +cd tools/apidoc +mvn -q clean install +cd ../../ + +# Compile marvin +cd tools/marvin +mvn -q clean install +sudo python setup.py install 2>&1 > /dev/null +cd ../../ + +# Deploy the database +mvn -q -Pdeveloper -pl developer -Ddeploydb +mvn -q -Pdeveloper -pl developer -Ddeploydb-simulator \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a58f098e/tools/travis/script.sh ---------------------------------------------------------------------- diff --git a/tools/travis/script.sh b/tools/travis/script.sh new file mode 100755 index 0000000..72b9ee2 --- /dev/null +++ b/tools/travis/script.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# +# This script should be responsible for bring up the +# test environment and executing the tests. +# \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a58f098e/tools/travis/xunit-reader.py ---------------------------------------------------------------------- diff --git a/tools/travis/xunit-reader.py b/tools/travis/xunit-reader.py new file mode 100755 index 0000000..8cf8fe8 --- /dev/null +++ b/tools/travis/xunit-reader.py @@ -0,0 +1,85 @@ +# !/usr/bin/env python +# encoding: utf-8 + +""" +This script provides parsing of xunit xml files. + +""" + +import os +import argparse + +import texttable + +import lxml.etree + + +def main(): + """ + Entry point for the parser + + """ + + args = _generate_args() + file_path_list = _generate_file_list(args) + + exit(parse_reports(file_path_list)) + + +def _generate_args(): + parser = argparse.ArgumentParser( + description='Command line utility for reading xunit xml files' + ) + + parser.add_argument( + 'path', + metavar='/path/to/folder/containing/xunit-reports', + type=str, + help='A path to a folder containing xunit reports' + ) + + args = parser.parse_args() + + return vars(args) + + +def _generate_file_list(args): + path = args.pop('path') + file_path_list = [] + for (root, dirnames, filenames) in os.walk(path): + for filename in filenames: + if filename.endswith('.xml'): + file_path_list.append(os.path.join(root, filename)) + + return file_path_list + + +def parse_reports(file_path_list): + table = texttable.Texttable() + table.header(['Test', 'Result']) + + exit_code = 0 + + for file_path in file_path_list: + data = lxml.etree.iterparse(file_path, tag='testcase') + for event, elem in data: + name = '' + status = 'Success' + if 'name' in elem.attrib: + name = elem.attrib['name'] + for children in elem.getchildren(): + if 'skipped' == children.tag: + status = 'Skipped' + elif 'failure' == children.tag: + exit_code = 1 + status = 'Failure' + + table.add_row([name, status]) + + print table.draw() + + return exit_code + + +if __name__ == "__main__": + main() \ No newline at end of file