This project is no longer actively developed or maintained.
Generation and storage of Python wheels for building
gcloud-python on Travis. This allows use of tox
environments without excessively slow builds.
Inspired by the proof-of-concept pelson/travis-wheels.
This repository builds all the dependencies for a given project as Python wheels by running
tox --notest
to determine the dependencies and then builds them into a specific directory:
pip wheel --wheel-dir=${WHEELHOUSE}
In order to avoid adding a wheel for the main project, .gitignore
contains *gcloud*.
After building a wheelhouse of dependencies for a project's build,
the wheels can be reused to drastically (YMMV) speed up build time.
This can be done in two main parts:
-
Specify a custom install command in your project's
toxconfig:... [testenv] install_command = {toxinidir}/scripts/custom_pip_install.sh {opts} {packages} ... -
Instead of the default
pip install, install from the wheelhouse with no connection and then (optionally) try to update if your pre-built wheels are out-of-date:#!/bin/bash if [[ -d ${WHEELHOUSE} ]]; then pip install --no-index --find-links=${WHEELHOUSE} "$@" fi # Update if the locally cached wheels are out-of-date. pip install --upgrade "$@"
This presumes your project build clones the wheelhouse
as a before_install step in Travis and refers to the pre-built wheels
as ${WHEELHOUSE}.
A new build occurs on any commit to master that is not a pull request.
A possible strategy for forcing new builds would be to add a small file
from a build of a dependent project (here that is gcloud-python).
After doing that, push a new commit to this project from the dependent
project's build and it will kick off a new Travis build. If no
dependencies have changed, no wheelhouse commit will be added.
For example a file LATEST_COMMIT containing the most recent commit in
the dependent project could be added by the dependent project.
The main project (i.e. not the wheelhouse) is determined by the values
REPO="https://github.com/GoogleCloudPlatform/gcloud-python"REPO_BRANCH="master"
set as Travis environment variables (see below).
After a new commit is pushed, the Travis build will check out the
repository (${REPO}) we are building for and then replace the
scripts/custom_pip_install.sh file in that repository.
This assumes that ${REPO} defines a custom pip install command
and registers it with tox as discussed above.
NOTE: The project relative path to that command is set via:
CODEBASE_DIR="gcloud-python" PIP_INSTALL="${CODEBASE_DIR}/scripts/custom_pip_install.sh"as Travis environment variables (see below).
The custom pip install script is replaced with
#!/bin/bash
pip install wheel
pip wheel --wheel-dir=${WHEELHOUSE}
which simply creates the wheels without installing them into
the current tox virtual environment.
In addition, the variable
EXTRA_TOX_ENVS="coveralls regression"
allows building for extra tox environments not defined in the
default envlist.
After building the dependencies in the Travis environment, the script
push_wheels.sh checks with new files / versions have been created,
then removes obsolete wheels, adds any new ones and then creates
and pushes a new commit to this repository.
In order to use gcloud-python-wheels, you'll need to set Travis
environment variables to allow building for the right project
and providing authentication to allow Travis to make commits
to your wheelhouse project.
To do this:
-
Install the
traviscommand-line tool. -
Visit your GitHub Applications settings to generate an OAuth token to use with the
travisCLI tool. Be sure to selectpublic_repoanduser:email(oruser) for the token scopes. -
Copy the token and save it in a read-only file called
travis.token. Put this in the root of yourgitrepository fork ofgcloud-python-wheels. -
Log in to Travis via the CLI tool:
travis login --github-token=`cat travis.token` -
Define and export the following environment variables:
# Variables used to push new commits to the wheelhouse. export GH_OWNER="GoogleCloudPlatform" export GH_PROJECT_NAME="gcloud-python-wheels" # Variables used to build wheels for ${REPO}. export REPO="https://github.com/GoogleCloudPlatform/gcloud-python" export REPO_BRANCH="master" export CODEBASE_DIR="gcloud-python" export PIP_INSTALL="${CODEBASE_DIR}/scripts/custom_pip_install.sh" export EXTRA_TOX_ENVS="coveralls regression" # Variables used to git commit and push new wheels. export FRESH_REPO_DIR="gcloud-python-wheels"Notice that these variables are closely tied to this repository. If you'd like to use a similar wheel build process, you'll need to tailor these values to your main project repository (
${REPO}) and your wheelhouse repository (${GH_PROJECT_NAME}). -
Set the Travis environment variables:
# Variables used to push new commits to the wheelhouse. travis env set GH_OWNER "${GH_OWNER}" --repo "${GH_OWNER}/${GH_PROJECT_NAME}" travis env set GH_PROJECT_NAME "${GH_PROJECT_NAME}" --repo "${GH_OWNER}/${GH_PROJECT_NAME}" travis env set GH_OAUTH_TOKEN `cat travis.token` --repo "${GH_OWNER}/${GH_PROJECT_NAME}" # Variables used to build wheels for ${REPO}. travis env set REPO "${REPO}" --repo "${GH_OWNER}/${GH_PROJECT_NAME}" travis env set REPO_BRANCH "${REPO_BRANCH}" --repo "${GH_OWNER}/${GH_PROJECT_NAME}" travis env set CODEBASE_DIR "${CODEBASE_DIR}" --repo "${GH_OWNER}/${GH_PROJECT_NAME}" travis env set PIP_INSTALL "${PIP_INSTALL}" --repo "${GH_OWNER}/${GH_PROJECT_NAME}" # Make EXTRA_TOX_ENVS public since it may change. travis env set --public EXTRA_TOX_ENVS "${EXTRA_TOX_ENVS}" --repo "${GH_OWNER}/${GH_PROJECT_NAME}" # Variables used to git commit and push new wheels. travis env set FRESH_REPO_DIR "${FRESH_REPO_DIR}" --repo "${GH_OWNER}/${GH_PROJECT_NAME}" -
Log out of Travis:
travis logout