Skip to content

Instantly share code, notes, and snippets.

@dan-blanchard
Last active December 11, 2019 22:38
Show Gist options
  • Star 65 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save dan-blanchard/7045057 to your computer and use it in GitHub Desktop.
Save dan-blanchard/7045057 to your computer and use it in GitHub Desktop.
Quicker Travis builds that rely on numpy and scipy using Miniconda

For ETS's SKLL project, we found out the hard way that Travis-CI's support for numpy and scipy is pretty abysmal. There are pre-installed versions of numpy for some versions of Python, but those are seriously out of date, and scipy is not there are at all. The two most popular approaches for working around this are to (1) build everything from scratch, or (2) use apt-get to install more recent (but still out of date) versions of numpy and scipy. Both of these approaches lead to longer build times, and with the second approach, you still don't have the most recent versions of anything. To circumvent these issues, we've switched to using Miniconda (Anaconda's lightweight cousin) to install everything.

A template for installing a simple Python package that relies on numpy and scipy using Miniconda is provided below. Since it's a common setup, I've also included steps to use Coveralls for calculating test coverage.

All you need to do is replace the YOUR_PACKAGE_NAME_HERE parts with your package's name in both .coveragerc and .travis.yml, and include both files in your project's root directory. Then just activate Travis and you should be set.

You may also consider adding the latest Miniconda shell script to your repository, and modifying your .travis.yml to just use that instead of downloading it every time. It can make building slightly faster, and is more resistent to server issues on Continuum's side (although you still are downloading the packages from them).

Additional files (only show up on roughdraft.io)

.coveragerc

.coveragerc

.travis.yml

.travis.yml

[run]
source = YOUR_PACKAGE_NAME_HERE
omit =
*/python?.?/*
*/lib-python/?.?/*.py
*/lib_pypy/_*.py
*/site-packages/ordereddict.py
*/site-packages/nose/*
*/unittest2/*
language: python
python:
- 2.7
- 3.3
notifications:
email: false
# Setup anaconda
before_install:
- wget http://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh
- chmod +x miniconda.sh
- ./miniconda.sh -b
- export PATH=/home/travis/miniconda/bin:$PATH
- conda update --yes conda
# The next couple lines fix a crash with multiprocessing on Travis and are not specific to using Miniconda
- sudo rm -rf /dev/shm
- sudo ln -s /run/shm /dev/shm
# Install packages
install:
- conda install --yes python=$TRAVIS_PYTHON_VERSION atlas numpy scipy matplotlib nose dateutil pandas statsmodels
# Coverage packages are on my binstar channel
- conda install --yes -c dan_blanchard python-coveralls nose-cov
- python setup.py install
# Run test
script:
- nosetests --with-cov --cov YOUR_PACKAGE_NAME_HERE --cov-config .coveragerc --logging-level=INFO
# Calculate coverage
after_success:
- coveralls --config_file .coveragerc
@Jorge-C
Copy link

Jorge-C commented Jan 3, 2014

This is great! Notice that you don't need to use miniconda3 to run python3 code (I modified your approach so that it creates a conda environment with the right python version).

@danielballan
Copy link

A warning to others, miniconda is not always updated with conda, which can cause builds to break. Add conda update --yes conda to the before_install.

@dan-blanchard
Copy link
Author

Wow, I didn't know people were commenting on this. (Weird that GitHub doesn't send notifications for Gists.)

Anyway, I should probably update this to use the latest version of miniconda.

Oh, and the reason I make it explicitly download miniconda3 for Python 3 code is that it's less to download (and therefore slightly faster).

@dan-blanchard
Copy link
Author

Just updated to:

  • include the conda update suggestion from @danielballan
  • use my binstar channel for installing coverage tools
  • use latest version of Miniconda

@zonca
Copy link

zonca commented Apr 3, 2014

@dan-blanchard, you can directly use:

http://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh

to get the latest version of miniconda!

@moconnell
Copy link

@dan-blanchard thanks for this. found one erratum found, should be:

  • export PATH=/home/travis/miniconda/bin:$PATH

@rowanc1
Copy link

rowanc1 commented May 17, 2014

Thanks!

@dan-blanchard
Copy link
Author

Thanks for the catch @moconnell. I've fixed that.

I've also switched to using @zonca's URL.

@vr2262
Copy link

vr2262 commented Aug 8, 2014

I was having issues with the environment when using this as well as pip. In order to fix it, in .travis.yml I had to put:

- conda update --yes conda
- conda create --yes -n condaenv python=2.7
- conda install --yes -n condaenv pip
- source activate condaenv

That allowed me to use pip without any problem.

@KelSolaar
Copy link

Is there a version of that recipe for Python 2.6?

@metakermit
Copy link

Thanks @dan-blanchard & @vr2262. Just to clarify, the addition would go into before_install as well and if you don't want to hardcode the Python version you can write:

- conda create --yes -n condaenv python=$TRAVIS_PYTHON_VERSION

@metakermit
Copy link

Also, the coverage flags didn't work for me, so I set them to:

script: nosetests --with-coverage --cover-package=packagename --logging-level=INFO

and I added to install:

- pip install coveralls

Now coveralls.io is not showing my organisation's repos, so I can't really test this, but that's another problem...

@xanderdunn
Copy link

Many thanks for this! My Travis CI build was actually timing out trying to install scipy with pip! This saved me.

@douglasrizzo
Copy link

If anyone is interested, there is a tutorial on the conda website teaching how to configure Miniconda with Travis.

@estroz
Copy link

estroz commented Nov 14, 2016

The - export PATH=/home/travis/miniconda/bin:$PATH step should be updated to - export PATH=/home/travis/miniconda2/bin:$PATH to reflect install path changes in the miniconda install script.
esheldon/fitsio#71

@AlJohri
Copy link

AlJohri commented Nov 15, 2016

@dan-blanchard can you update the script as per @estroz's last comment?

@johnyf
Copy link

johnyf commented Aug 24, 2017

No need to use Miniconda.

pip install --upgrade pip setuptools wheel
pip install --only-binary=numpy,scipy numpy scipy

travis-ci/travis-ci#2650 (comment)

@Seanny123
Copy link

Seanny123 commented Apr 27, 2018

@johnyf based off my experience, the pip installed version is still way slower than conda. Will continue to monitor the situation as it evolves.

@mroberge
Copy link

I also had a great improvement to my build time by using the --only-binary option for numpy and scipy. Travis has recently put numpy into its Python 3.5 and 3.6 environments, so these build in just a minute. However, testing against 3.4 was taking 9 minutes. The pip install --only-binary=numpy,scipy numpy scipy cut the running time down to seven minutes, so I added some of my other dependencies like pandas, and now the Python 3.4 build only takes one minute.
My final .travis.yml file
Travis already uses virtual environments to test against different python versions, so using conda essentially creates an environment inside an environment.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment