Version 7 (modified by 7 years ago) ( diff ) | ,
---|
Travis and Coveralls integration
Travis and Coveralls Setup
We'll be adding TravisCI and Coveralls integration to a Boost library. Let's take a Boost.LexicalCast as an example. At the end we'll get the following.
Travis requires some access permissions to the repository that are usually provided by Boostorg Admins. However bothering Admins is actually not required:
- go to the Boost project page (in our example it would be https://github.com/boostorg/lexical_cast)
- press the "Fork" button at the top right corner. Now you have a copy of the boost project in your account.
- clone the original boostorg repo or use an existing clone. Change directory to the clone folder (
cd boost_maintain/boost/libs/lexical_cast/
) - add our forked repo as another remote host for default push:
git remote set-url --add origin git@github.com:<your_login>/lexical_cast.git
. If everything is right, you'll see something like this if you executegit remote -v
:origin git@github.com:boostorg/lexical_cast.git (fetch) origin git@github.com:boostorg/lexical_cast.git (push) origin git@github.com:<your_login>/lexical_cast.git (push)
- log in into Travis
- go to the https://travis-ci.org/profile/ and enable builds for the forked project.
- log into Coverals.
- go to the https://coveralls.io/repos/new and add a forked repo.
- now add the
.travis.yml
file, tune theREADME.md
and commit changes:git checkout develop # We'll be applying all the changes to the develop branch cp ../variant/.travis.yml ./ # Copying .travis.yml from Boost.Variant sed -i 's/IGNORE_COVERAGE=.*/IGNORE_COVERAGE=/g' .travis.yml # Reseting files to ignore in coverage tests report git add .travis.yml # Adding .travis.yml for next commit cp ../variant/README.md ./ # Copying README.md from Boost.Variant sed -i 's/variant/lexical_cast/g' README.md # Replacing `variant` with `lexical_cast` sed -i 's/apolukhin/<your_login>/g' README.md # Replace `apolukhin` login name wuth your own login name gedit README.md # ... editing README.md in editor git add README.md # Adding README.md for next commit git commit -m "Travis and Coveralls integration" # Committing changes to GIT git push # push changes to boostorg and forked repo using one command
That's it! If everything is done right, you'll see the build process going on TravisCI and after ~20 minutes results will be visible in README.md view on github.
Coveralls tuning
Investigating the results
After successful run of TravisCI and Coveralls we'll see tests coverage results displayed in README.md view on github. Time to investigate the results!
- click on the results https://coveralls.io/r/apolukhin/lexical_cast?branch=develop
- click on the build number to see detailed coverage description
- click on the source file you wish to investigate
Setting sources location
Chances are high, that Coveralls will fail to automatically detect source location. In that case you need to
- set "Git repo root directory:" to /home/travis/boost-local/
- set "Git repo sub directory: :" to include/ (or src/ in case of a source file in src/ folder)
If everything is done right you'll see the source file with highlighted lines. Green lines are covered by tests, red lines are in binary file and are not covered by test, gray lines are not in a test's binary file (there's no code in tests that uses/compile that line).
Ignoring specified files coverage
Sometimes files from other projects could appear in coverage reports. To disable those files edit .travis.yml
file and set IGNORE_COVERAGE=
to files that must be ignored. IGNORE_COVERAGE
variable understands wildcards, so you could disable files just like this:
- IGNORE_COVERAGE='*/boost/progress.hpp */filesystem/src/path.cpp */numeric/conversion/converter_policies.hpp'
Profits =
Travis is a continuous integration system that builds and run tests on each push to github repository. It helps you to find and report errors faster.
Coveralls shows tests coverage. This is a useful feature, that allows you to make sure that newly created code is covered by tests. Even 100% coverage does not mean that there's no errors. However it motivates people to write tests, helps to find trivial errors and typos and sometimes even helps to find hard detectable errors (bug that have been in Variant for years and was highlighted by Coveralls)
.travis.yml
content (22.08.2015)
# Use, modification, and distribution are # subject to the Boost Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) # # Copyright Antony Polukhin 2014-2015. # # See https://svn.boost.org/trac/boost/wiki/TravisCoverals for description of this file # and how it can be used with Boost libraries. # language: cpp os: - linux env: - CXX_STANDARD=c++98 - CXX_STANDARD=c++0x before_install: # Set this to the name of your Boost library # Autodetect library name by using the following code: - PROJECT_TO_TEST=$(basename $(pwd)) - PROJECT_TO_TEST=$(basename $(pwd)) # Autodetect Boost branch by using the following code: - BRANCH_TO_TEST=`git rev-parse --abbrev-ref HEAD` # or by - BRANCH_TO_TEST=$TRAVIS_BRANCH or just directly specify it - BRANCH_TO_TEST=$TRAVIS_BRANCH # Files, which coverage results must be ignored (files from other projects). Example: - IGNORE_COVERAGE='*/boost/progress.hpp */filesystem/src/path.cpp' - IGNORE_COVERAGE='*/boost/progress.hpp */filesystem/src/path.cpp */numeric/conversion/converter_policies.hpp' # From this point and below code is same for all the Boost libs # Cloning Boost libraries (fast nondeep cloning) - PROJECT_DIR=`pwd` - BOOST=$HOME/boost-local - git init $BOOST - cd $BOOST - git remote add --no-tags -t $BRANCH_TO_TEST origin https://github.com/boostorg/boost.git - git fetch --depth=1 - git checkout $BRANCH_TO_TEST - git submodule update --init --merge - git remote set-branches --add origin $BRANCH_TO_TEST - git pull --recurse-submodules - git submodule update --init - git checkout $BRANCH_TO_TEST - git submodule foreach "git reset --quiet --hard; git clean -fxd" - git reset --hard; git clean -fxd - git status - rm -rf $BOOST/libs/$PROJECT_TO_TEST - mv $PROJECT_DIR/../$PROJECT_TO_TEST/ $BOOST/libs/$PROJECT_TO_TEST - PROJECT_DIR=$BOOST/libs/$PROJECT_TO_TEST - ./bootstrap.sh - ./b2 headers - sudo apt-get update -qq - sudo apt-get install -qq valgrind script: - if [ "$CCFLAGS" != "" ]; then FLAGS="cxxflags=\"$CCFLAGS\" linkflags=\"$LINKFLAGS\""; else FLAGS=""; fi - cd $BOOST/libs/$PROJECT_TO_TEST/test/ # `--coverage` flags required to generate coverage info for Coveralls - ../../../b2 testing.launcher=valgrind cxxflags="--coverage -std=$CXX_STANDARD" linkflags="--coverage" after_success: # Copying Coveralls data to a separate folder - mkdir -p $PROJECT_DIR/coverals - find ../../../bin.v2/ -name "*.gcda" -exec cp "{}" $PROJECT_DIR/coverals/ \; - find ../../../bin.v2/ -name "*.gcno" -exec cp "{}" $PROJECT_DIR/coverals/ \; # Preparing Coveralls data by # ... installing the tools - sudo apt-get install -qq python-yaml lcov # ... changind data format to a readable one - lcov --directory $PROJECT_DIR/coverals --base-directory ./ --capture --output-file $PROJECT_DIR/coverals/coverage.info # ... erasing /test/ /example/ folder data - cd $BOOST - lcov --remove $PROJECT_DIR/coverals/coverage.info "/usr*" "*/$PROJECT_TO_TEST/test/*" $IGNORE_COVERAGE "*/$PROJECT_TO_TEST/tests/*" "*/$PROJECT_TO_TEST/examples/*" "*/$PROJECT_TO_TEST/example/*" -o $PROJECT_DIR/coverals/coverage.info # ... erasing data that is not related to this project directly - OTHER_LIBS=`grep "submodule .*" .gitmodules | sed 's/\[submodule\ "\(.*\)"\]/"\*\/boost\/\1\.hpp" "\*\/boost\/\1\/\*"/g'| sed "/\"\*\/boost\/$PROJECT_TO_TEST\/\*\"/d" | sed ':a;N;$!ba;s/\n/ /g'` - echo $OTHER_LIBS - eval "lcov --remove $PROJECT_DIR/coverals/coverage.info $OTHER_LIBS -o $PROJECT_DIR/coverals/coverage.info" # Sending data to Coveralls - cd $PROJECT_DIR - gem install coveralls-lcov - coveralls-lcov coverals/coverage.info