Skip to content

Commit

Permalink
Merge branch 'travis' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
PeterBowman committed Jul 15, 2018
2 parents 1517d37 + 6a1eec3 commit c93c7fb
Show file tree
Hide file tree
Showing 4 changed files with 276 additions and 74 deletions.
175 changes: 101 additions & 74 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,91 +1,118 @@
os:
- linux

language:
- cpp
language: cpp
dist: trusty
sudo: required
os: linux

compiler:
- gcc
- clang

env:
global:
- CACHE_DIR=~/cached-deps
matrix:
- YARP_CHECKOUT=master
- YARP_CHECKOUT=v2.3.72.1
- YARP_CHECKOUT=v2.3.70.2

matrix:
include:
- if: type = cron
compiler: gcc
env: ROBOTOLOGY_CHECKOUT=devel
- if: type = cron
compiler: clang
env: ROBOTOLOGY_CHECKOUT=devel

cache:
directories: $CACHE_DIR

addons:
apt:
packages:
# AMOR API
- libboost-thread-dev
- libeigen3-dev

# device deps
- libusb-1.0-0-dev # libphidget21
- libspnav-dev # spacenavigator

- libgtest-dev # unit testing
- lcov # code coverage

before_install:
- sudo apt-get -qq update # -qq No output except for errors
- '[[ "$TRAVIS_EVENT_TYPE" = cron ]] && export ROBOTOLOGY_CHECKOUT=devel || export ROBOTOLOGY_CHECKOUT=master'
#-- Configure Git (needed by YCM)
- if [ ! `git config --get user.email` ]; then `git config --global user.email '[email protected]'`; fi
- if [ ! `git config --get user.name` ]; then `git config --global user.name 'Travis CI'`; fi

#-- Register SSH deploy key for AMOR API private repository
#-- https://gist.github.com/lukewpatterson/4242707#gistcomment-2382443
#-- http://anil.recoil.org/2013/10/06/travis-secure-ssh-integration.html
- mkdir -p ~/.ssh
- echo $DEPLOY_KEY_AMOR_API | base64 --decode | openssl aes-256-cbc -K $encrypted_7b486c11a122_key -iv $encrypted_7b486c11a122_iv -out ~/.ssh/id_rsa -d
- chmod 600 ~/.ssh/id_rsa
- echo "Host *" >> ~/.ssh/config
- echo " StrictHostKeyChecking no" >> ~/.ssh/config
- echo " CheckHostIP no" >> ~/.ssh/config
- echo " PasswordAuthentication no" >> ~/.ssh/config
- echo " UserKnownHostsFile=/dev/null" >> ~/.ssh/config
- source "$TRAVIS_BUILD_DIR/scripts/travis/configure-ssh.sh"

#-- Code coverage
- if [ "$CXX" = "g++" ]; then gem install coveralls-lcov; fi

install:
#-- Install 3rd-party dependencies
- sudo apt-get install libboost-thread-dev libeigen3-dev libspnav-dev libxwiimote-dev libusb-1.0-0-dev libgtest-dev
#-- Install color-debug
- git clone https://github.com/roboticslab-uc3m/color-debug
- cd color-debug && mkdir build && cd build
- cmake ..
- sudo make install
- cd ../..
#-- Install ycm
- git clone --branch="$ROBOTOLOGY_CHECKOUT" https://github.com/robotology/ycm
- cd ycm && mkdir build && cd build
- cmake ..
- make -j$(nproc)
- sudo make install
- cd ../..
#-- Install yarp
- git clone --branch="$ROBOTOLOGY_CHECKOUT" https://github.com/robotology/yarp
- cd yarp && mkdir build && cd build
- cmake .. -DSKIP_ACE=ON
- make -j$(nproc)
- sudo make install
- cd ../..
#-- Install device-related deps
- sudo apt-get install libxwiimote-dev

#-- Install YCM
- >
source "$TRAVIS_BUILD_DIR/scripts/travis/git-cache-dependency.sh"
--package-name YCM
--repo-url https://github.com/robotology/ycm
--repo-checkout "${ROBOTOLOGY_CHECKOUT:-${YCM_CHECKOUT:-master}}"
#-- Install YARP
- >
source "$TRAVIS_BUILD_DIR/scripts/travis/git-cache-dependency.sh"
--package-name YARP
--repo-url https://github.com/robotology/yarp
--repo-checkout "${ROBOTOLOGY_CHECKOUT:-$YARP_CHECKOUT}"
--additional-cmake-options "-DSKIP_ACE:BOOL=ON"
--prepend-to-linker-path lib
--additional-export-paths "YARP_DATA_DIRS;share/yarp"
#-- Install libphidget21
- cd extern/phidget
- tar xzf libphidget_2.1.8.20151217.tar.gz
- cd libphidget-2.1.8.20151217
- ./configure --enable-jni=no
- make -j$(nproc)
- sudo make install
- cd ../../..
#-- Install AMOR API
- git clone [email protected]:roboticslab-uc3m/amor-api
- cd amor-api && mkdir build && cd build
- cmake ..
- make
- sudo make install
- cd ../..
# see http://gronlier.fr/blog/2015/01/adding-code-coverage-to-your-c-project/
- if [ "$CXX" = "g++" ]; then wget http://ftp.de.debian.org/debian/pool/main/l/lcov/lcov_1.11.orig.tar.gz; fi
- if [ "$CXX" = "g++" ]; then tar xf lcov_1.11.orig.tar.gz; fi
- if [ "$CXX" = "g++" ]; then sudo make -C lcov-1.11/ install; fi
- if [ "$CXX" = "g++" ]; then gem install coveralls-lcov; fi
- >
if [ ! -d "$CACHE_DIR/libphidget_2.1.8" ]; then
echo "libphidget_2.1.8 not in cache"
tar xzf "$TRAVIS_BUILD_DIR/extern/phidget/libphidget_2.1.8.20151217.tar.gz" -C ~
(cd ~/libphidget-2.1.8.20151217 && ./configure --enable-jni=no --prefix="$CACHE_DIR/libphidget_2.1.8")
make -C ~/libphidget-2.1.8.20151217 -j$(nproc) install
else
echo "libphidget_2.1.8 already in cache"
fi
- export PKG_CONFIG_PATH="$CACHE_DIR/libphidget_2.1.8/lib/pkgconfig:$PKG_CONFIG_PATH"

#-- Install color-debug
- >
source "$TRAVIS_BUILD_DIR/scripts/travis/git-cache-dependency.sh"
--package-name COLOR_DEBUG
--repo-url https://github.com/roboticslab-uc3m/color-debug
--repo-checkout master
#-- Install AMOR API (for AmorCartesianControl)
- >
source "$TRAVIS_BUILD_DIR/scripts/travis/git-cache-dependency.sh"
--package-name AMOR_API
--repo-url [email protected]:roboticslab-uc3m/amor-api
--repo-checkout develop
--additional-cmake-options "-DENABLE_udev_rules:BOOL=OFF"
--prepend-to-linker-path lib
before_script:
- mkdir -p build && cd build
- cmake .. -DENABLE_coverage=ON
- mkdir -p "$TRAVIS_BUILD_DIR/build" && cd "$_"
- cmake .. -DCMAKE_INSTALL_PREFIX="$PWD/install" -DENABLE_coverage:BOOL=ON
- make install
- export LD_LIBRARY_PATH=$PWD/install/lib:$LD_LIBRARY_PATH
- export YARP_DATA_DIRS=$PWD/install/share/roboticslab-yarp-devices:$YARP_DATA_DIRS

script:
- make
- sudo make install
- echo "No unit tests available"

after_success:
# - cd ${TRAVIS_BUILD_DIR}
# capture coverage info
- if [ "$CXX" = "g++" ]; then lcov --directory . --capture --output-file coverage.info; fi
# filter out system and test code
- if [ "$CXX" = "g++" ]; then lcov --remove coverage.info '/usr/*' 'test/*' --output-file coverage.info; fi
# debug before upload
- if [ "$CXX" = "g++" ]; then lcov --list coverage.info; fi
# uploads to coveralls
#- if [ "$CXX" = "g++" ]; then coveralls-lcov --source-encoding=ISO-8859-1 --repo-token InWqFy6VWMrEUzr2Rn8XV0cGqv3wXWo2d coverage.info; fi
- if [ "$CXX" = "g++" ]; then coveralls-lcov --source-encoding=ISO-8859-1 coverage.info; fi

- sudo make uninstall
#-- Code coverage
- if [ "$CXX" = "g++" ]; then source "$TRAVIS_BUILD_DIR/scripts/travis/coverage.sh"; fi

- make uninstall
19 changes: 19 additions & 0 deletions scripts/travis/configure-ssh.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/usr/bin/env bash

set -e

#-- Register SSH deploy key for AMOR API private repository
#-- https://gist.github.com/lukewpatterson/4242707#gistcomment-2382443
#-- http://anil.recoil.org/2013/10/06/travis-secure-ssh-integration.html

mkdir -p ~/.ssh

echo $DEPLOY_KEY_AMOR_API | base64 --decode | openssl aes-256-cbc -K $encrypted_7b486c11a122_key -iv $encrypted_7b486c11a122_iv -out ~/.ssh/id_rsa -d

chmod 600 ~/.ssh/id_rsa

echo "Host *" >> ~/.ssh/config
echo " StrictHostKeyChecking no" >> ~/.ssh/config
echo " CheckHostIP no" >> ~/.ssh/config
echo " PasswordAuthentication no" >> ~/.ssh/config
echo " UserKnownHostsFile=/dev/null" >> ~/.ssh/config
17 changes: 17 additions & 0 deletions scripts/travis/coverage.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#!/usr/bin/env bash

set +e

# see http://gronlier.fr/blog/2015/01/adding-code-coverage-to-your-c-project/

#-- Capture coverage info
lcov --directory . --capture --output-file coverage.info

#-- Filter out system and test code
lcov --remove coverage.info '/usr/*' 'tests/*' --output-file coverage.info

#-- Debug before upload
lcov --list coverage.info

#-- Upload to coveralls
coveralls-lcov --source-encoding=ISO-8859-1 coverage.info
139 changes: 139 additions & 0 deletions scripts/travis/git-cache-dependency.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
#!/usr/bin/env bash

set -e

#-- Initialize variables
package_name=
repo_url=
repo_checkout=
clone_only_branches="master devel develop production"
cmake_home_dir=
additional_cmake_options=
prepend_to_linker_path=
prepend_to_standard_path=
additional_export_paths=

#-- Available getopt long option names
#-- https://gist.github.com/magnetikonline/22c1eb412daa350eeceee76c97519da8
ARGUMENT_LIST=(
"package-name"
"repo-url"
"repo-checkout"
"clone-only-branches"
"cmake-home-dir"
"additional-cmake-options"
"prepend-to-linker-path"
"prepend-to-standard-path"
"additional-export-paths"
)

#-- Read arguments
opts=$(getopt \
--longoptions "$(printf "%s:," "${ARGUMENT_LIST[@]}")" \
--name "$(basename "${BASH_SOURCE[0]}")" \
--options "" \
-- "$@"
)

eval set -- $opts

#-- Parse options
while [ "$#" -gt 1 ]; do
in=$(echo "$1" | sed -e 's/^--//')
for v in "${ARGUMENT_LIST[@]}"; do
if [ "$v" = "$in" ]; then
declare "$(echo "$v" | tr '-' '_')"="$2"
break
fi
done
shift 2
done

#-- Check required arguments
if [ -z "$package_name" ] || [ -z "$repo_url" ] || [ -z "$repo_checkout" ]; then
echo "Missing required options. Traceback:"
for v in "${ARGUMENT_LIST[@]}"; do
v_param=$(echo $v | tr '-' '_')
echo " --$v=${!v_param}"
done
return 1
fi

#-- Configure paths
repo_source_dir=~/"$package_name-$repo_checkout"
repo_build_dir="$repo_source_dir/build"
repo_cache_dir="$CACHE_DIR/$package_name-$repo_checkout"
cmake_home_dir="$repo_source_dir/$cmake_home_dir"

#-- Configure CMake command line options
repo_cmake_options="$additional_cmake_options -DCMAKE_INSTALL_PREFIX:PATH=$repo_cache_dir"

is_clone_only_branch=false

for branch in $clone_only_branches; do
if [ "$repo_checkout" = "$branch" ]; then
is_clone_only_branch=true
break
fi
done

if $is_clone_only_branch; then

#-- Clone, build and store in cache

echo "Cloning $package_name's $repo_checkout branch"
git clone --depth=1 --branch="$repo_checkout" "$repo_url" "$repo_source_dir"
last_commit_sha=$(git -C "$repo_source_dir" rev-parse HEAD)

if [ ! -d "$repo_cache_dir" ] || \
[ ! -f "$repo_cache_dir/.last_commit_sha" ] || \
[ ! "$(cat $repo_cache_dir/.last_commit_sha)" = "$last_commit_sha" ];
then
echo "$package_name not in cache or not the latest commit of $repo_checkout branch"
rm -rf "$repo_cache_dir"/*
cmake -H"$cmake_home_dir" -B"$repo_build_dir" $repo_cmake_options
make -C "$repo_build_dir" -j$(nproc) install
echo "$last_commit_sha" > "$repo_cache_dir/.last_commit_sha"
else
echo "$package_name found in cache ($(cat $repo_cache_dir/.last_commit_sha))"
fi

else

#-- Download zipped file from archive, build and store in cache

if [ ! -d "$repo_cache_dir" ]; then
echo "Downloading $package_name $repo_checkout from archive"
wget -q "$repo_url/archive/$repo_checkout.tar.gz" -P "$repo_source_dir"
tar xzf "$repo_source_dir/$repo_checkout.tar.gz" -C "$repo_source_dir" --strip-components=1
cmake -H"$cmake_home_dir" -B"$repo_build_dir" $repo_cmake_options
make -C "$repo_build_dir" -j$(nproc) install
else
echo "$package_name $repo_checkout already in cache"
fi

fi

#-- Make installed package discoverable by CMake's find_package() command
export CMAKE_PREFIX_PATH="$CMAKE_PREFIX_PATH:$repo_cache_dir"

#-- Miscellanea, prepends stuff to LD_LIBRARY_PATH and PATH

if [ ! -z "$prepend_to_linker_path" ]; then
export LD_LIBRARY_PATH="$repo_cache_dir/$prepend_to_linker_path:$LD_LIBRARY_PATH"
fi

if [ ! -z "$prepend_to_standard_path" ]; then
export PATH="$repo_cache_dir/$prepend_to_standard_path:$PATH"
fi

#-- Expands lists of values of the form 'VAR1;val1;VAR2;val2;...' to:
#-- export VAR1=val1
#-- export VAR2=val2
#-- ...
if [ ! -z "$additional_export_paths" ]; then
IFS=';' read -ra ITEMS <<< "$additional_export_paths"
for (( count=0; count<"${#ITEMS[@]}"; count+=2 )); do
export "${ITEMS[$count]}"="$repo_cache_dir/${ITEMS[$(( $count+1 ))]}:${!ITEMS[$count]}"
done
fi

0 comments on commit c93c7fb

Please sign in to comment.