From e45a973e22a01e3cc23a4b6dfd78f3dd7eff852d Mon Sep 17 00:00:00 2001 From: Joe Jevnik Date: Wed, 24 Feb 2016 21:25:55 -0500 Subject: [PATCH] DEV: add conda_build_matrix.py to help upload packages --- docs/source/release-process.rst | 22 ++++++++ etc/conda_build_matrix.py | 92 ++++++++++++++++++++++++++++++--- 2 files changed, 108 insertions(+), 6 deletions(-) diff --git a/docs/source/release-process.rst b/docs/source/release-process.rst index d29bbc3f90..c2d48484dd 100644 --- a/docs/source/release-process.rst +++ b/docs/source/release-process.rst @@ -169,6 +169,28 @@ Once we are happy, push the updated docs to the GitHub ``gh-pages`` branch. `zipline.io `__ will update in a few moments. +Uploading conda packages +~~~~~~~~~~~~~~~~~~~~~~~~ + +To build the conda packages for zipline run: + +.. code-block:: bash + + $ python etc/conda_build_matrix.py + +If all of the builds succeed, then this will not print anything and exit with +``EXIT_SUCCESS``. If there are build issues, we must address them and decide +what to do. + +Once all of the builds in the matrix pass, we can upload them to anaconda with: + +.. code-block:: bash + + $ python etc/conda_build_matrix.py --upload + +If you would like to test this command by uploading to a different user, this +may be specified with the ``--user`` flag. + Next Commit ~~~~~~~~~~~ diff --git a/etc/conda_build_matrix.py b/etc/conda_build_matrix.py index 39f70b1db7..a58df2b511 100644 --- a/etc/conda_build_matrix.py +++ b/etc/conda_build_matrix.py @@ -1,15 +1,95 @@ from itertools import product import os +import subprocess + +import click py_versions = ('2.7', '3.4') -numpy_versions = ('1.9', '1.10') +npy_versions = ('1.9', '1.10') +zipline_path = os.path.join( + os.path.dirname(__file__), + '..', + 'conda', + 'zipline', +) + + +def mkargs(py_version, npy_version, output=False): + return { + 'args': [ + 'conda', + 'build', + zipline_path, + '-c', 'quantopian', + '--python=%s' % py_version, + '--numpy=%s' % npy_version, + ] + (['--output'] if output else []), + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + +@click.command() +@click.option( + '--upload', + is_flag=True, + default=False, + help='Upload packages after building', +) +@click.option( + '--upload-only', + is_flag=True, + default=False, + help='Upload the last built packages without rebuilding.', +) +@click.option( + '--user', + default='quantopian', + help='The anaconda account to upload to.', +) +def main(upload, upload_only, user): + if upload_only: + # if you are only uploading you shouldn't need to specify both flags + upload = True + procs = ( + ( + py_version, + npy_version, + (subprocess.Popen(**mkargs(py_version, npy_version)) + if not upload_only else + None), + ) + for py_version, npy_version in product(py_versions, npy_versions) + ) + status = 0 + files = [] + for py_version, npy_version, proc in procs: + if not upload_only: + out, err = proc.communicate() + if proc.returncode: + status = 1 + print('build failure: python=%s numpy=%s\n%s' % ( + py_version, + npy_version, + err.decode('utf-8'), + )) + elif upload: + files.append(subprocess.Popen( + **mkargs(py_version, npy_version, output=True) + ).communicate()[0].decode('utf-8').strip()) -def main(): - for pair in product(py_versions, numpy_versions): - os.system('conda build conda/zipline -c quantopian ' - '--python=%s --numpy=%s' % pair) + if not status and upload: + for f in files: + p = subprocess.Popen( + ['anaconda', 'upload', '-u', user, f], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + out, err = p.communicate() + if p.returncode: + print('failed to upload: %s\n%s' % (f, err.decode('utf-8'))) + return status if __name__ == '__main__': - main() + exit(main())