Commit 8a766fa3 authored by jlaura's avatar jlaura Committed by Jason R Laura
Browse files

AppVeyor Upload Support

parent 6f0a25e3
Loading
Loading
Loading
Loading
+59 −22
Original line number Diff line number Diff line
environment:
   BINSTAR_USER: jlaura
   PYTHON_VERSION: 3.4

  CONDA_INSTALL_LOCN: "C:\\conda"

  # SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the
  # /E:ON and /V:ON options are not enabled in the batch script intepreter
  # See: http://stackoverflow.com/a/13751649/163740
  CMD_IN_ENV: "cmd /E:ON /V:ON /C obvci_appveyor_python_build_env.cmd"

  # We set a default Python version for the miniconda that is to be installed. This can be
  # overridden in the matrix definition where appropriate.
  CONDA_PY: "27"

  matrix:

    - TARGET_ARCH: x64
      CONDA_PY: 34

# We always use a 64-bit machine, but can build x86 distributions
# with the TARGET_ARCH variable.
platform:
    - x64

install:
   - cmd: set PATH=C:\Miniconda3;C:\Miniconda3\Scripts;%PATH%
   - cmd: conda config --set always_yes yes --set changeps1 no
   - cmd: conda update -q conda
    # If there is a newer build queued for the same PR, cancel this one.
    # The AppVeyor 'rollout builds' option is supposed to serve the same
    # purpose but it is problematic because it tends to cancel builds pushed
    # directly to master instead of just PR builds (or the converse).
    # credits: JuliaLang developers.
    - ps: if ($env:APPVEYOR_PULL_REQUEST_NUMBER -and $env:APPVEYOR_BUILD_NUMBER -ne ((Invoke-RestMethod `
        https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG/history?recordsNumber=50).builds | `
        Where-Object pullRequestId -eq $env:APPVEYOR_PULL_REQUEST_NUMBER)[0].buildNumber) { `
          throw "There are newer queued builds for this pull request, failing early." }

    # Cywing's git breaks conda-build. (See https://github.com/conda-forge/conda-smithy-feedstock/pull/2.)
    - cmd: rmdir C:\cygwin /s /q
    - appveyor DownloadFile "https://raw.githubusercontent.com/pelson/Obvious-CI/master/bootstrap-obvious-ci-and-miniconda.py"
    - cmd: python bootstrap-obvious-ci-and-miniconda.py %CONDA_INSTALL_LOCN% %TARGET_ARCH% %CONDA_PY:~0,1% --without-obvci
    - cmd: set PATH=%CONDA_INSTALL_LOCN%;%CONDA_INSTALL_LOCN%\scripts;%PATH%
    - cmd: set PYTHONUNBUFFERED=1

   # Useful for debugging any issues with conda
   - cmd: conda info -a
    - cmd: conda config --set show_channel_urls true
    - cmd: conda install -c pelson/channel/development --yes --quiet obvious-ci
    - cmd: conda config --add channels conda-forge
    - cmd: conda info
    - cmd: conda install -n root --quiet --yes conda-build anaconda-client jinja2 setuptools
    # Workaround for Python 3.4 and x64 bug in latest conda-build.
    # FIXME: Remove once there is a release that fixes the upstream issue
    # ( https://github.com/conda/conda-build/issues/895 ).
    - cmd: if "%TARGET_ARCH%" == "x64" if "%CONDA_PY%" == "34" conda install conda-build=1.20.0 --yes

   # Install not using env because build needs to be in root env
    # Now install the pacakge dependencies
    - cmd: conda config --add channels conda-forge
    - cmd: conda config --add channels jlaura
    - cmd: conda install -c conda-forge gdal h5py
    - cmd: conda install pandas sqlalchemy pyyaml
   - cmd: pip install pvl
   - cmd: pip install protobuf==3.0.0b2
    - cmd: conda install -c jlaura protobuf pvl

    # Development installation
   - cmd: conda install nose coverage anaconda-client
    - cmd: conda install nose coverage
    - cmd: pip install coveralls

# Skip .NET project specific build phase.
build: off

test_script:
    - cmd: nosetests --with-coverage --cover-package=plio
    - "%CMD_IN_ENV% conda build conda --quiet"

deploy_script:

after_test:
   # Afte test success, package and upload to Anaconda
   - cmd: python ci_tools/condaci.py build ./conda
    - 'python ci_support\upload_or_check_non_existence.py .\conda jlaura --channel=main'
+119 −0
Original line number Diff line number Diff line
#!/usr/bin/env python
from __future__ import print_function

import argparse
import hashlib
import os
import subprocess
import sys

from binstar_client.utils import get_binstar
import binstar_client.errors
import conda.config
from conda_build.metadata import MetaData
from conda_build.build import bldpkg_path


def built_distribution_already_exists(cli, meta, owner):
    """
    Checks to see whether the built recipe (aka distribution) already
    exists on the owner/user's binstar account.
    """
    distro_name = '{}/{}.tar.bz2'.format(conda.config.subdir, meta.dist())
    fname = bldpkg_path(meta)
    try:
        dist_info = cli.distribution(owner, meta.name(), meta.version(),
                                     distro_name)
    except binstar_client.errors.NotFound:
        dist_info = {}

    exists = bool(dist_info)
    # Unfortunately, we cannot check the md5 quality of the built distribution, as
    # this will depend on fstat information such as modification date (because
    # distributions are tar files). Therefore we can only assume that the distribution
    # just built, and the one on anaconda.org are the same.
#    if exists:
#        md5_on_binstar = dist_info.get('md5')
#        with open(fname, 'rb') as fh:
#            md5_of_build = hashlib.md5(fh.read()).hexdigest()
#
#        if md5_on_binstar != md5_of_build:
#            raise ValueError('This build ({}), and the build already on binstar '
#                             '({}) are different.'.format(md5_of_build, md5_on_binstar))
    return exists


def upload(cli, meta, owner, channels):
    try:
        with open('binstar.token', 'w') as fh:
            fh.write(cli.token)
        subprocess.check_call(['anaconda', '--quiet', '-t', 'binstar.token',
                               'upload', bldpkg_path(meta),
                               '--user={}'.format(owner),
                               '--channel={}'.format(channels)],
                              env=os.environ)
    finally:
        os.remove('binstar.token')


def distribution_exists_on_channel(binstar_cli, meta, owner, channel='main'):
    """
    Determine whether a distribution exists on a specific channel.
    Note from @pelson: As far as I can see, there is no easy way to do this on binstar.
    """
    fname = '{}/{}.tar.bz2'.format(conda.config.subdir, meta.dist())
    distributions_on_channel = [dist['basename'] for dist in
                                binstar_cli.show_channel(owner=owner, channel=channel)['files']]
    return fname in distributions_on_channel


def add_distribution_to_channel(binstar_cli, meta, owner, channel='main'):
    """
    Add a(n already existing) distribution on binstar to another channel.
    Note - the addition is done based on name and version - no build strings etc.
    so if you have a foo-0.1-np18 and foo-0.1-np19 *both* will be added to the channel.
    """
    package_fname = '{}/{}.tar.bz2'.format(conda.config.subdir, meta.dist())
    binstar_cli.add_channel(channel, owner, meta.name(), meta.version())


def main():
    token = os.environ.get('BINSTAR_KEY')

    description = ('Upload or check consistency of a built version of a '
                   'conda recipe with binstar. Note: The existence of the '
                   'BINSTAR_KEY environment variable determines '
                   'whether the upload should actually take place.')
    parser = argparse.ArgumentParser(description=description)
    parser.add_argument('recipe_dir', help='the conda recipe directory')
    parser.add_argument('owner', help='the binstar owner/user')
    parser.add_argument('--channel', help='the binstar channel', default='main')
    args = parser.parse_args()
    recipe_dir, owner, channel = args.recipe_dir, args.owner, args.channel

    cli = get_binstar(argparse.Namespace(token=token, site=None))
    meta = MetaData(recipe_dir)
    if meta.skip():
        print("No upload to take place - this configuration was skipped in build/skip.")
        return
    exists = built_distribution_already_exists(cli, meta, owner)
    if token:
        on_channel = distribution_exists_on_channel(cli, meta, owner, channel)
        if not exists:
            upload(cli, meta, owner, channel)
            print('Uploaded {}'.format(bldpkg_path(meta)))
        elif not on_channel:
            print('Adding distribution {} to {}\'s {} channel'
                  ''.format(bldpkg_path(meta), owner, channel))
            add_distribution_to_channel(cli, meta, owner, channel)
        else:
            print('Distribution {} already \nexists on {}\'s {} channel.'
                  ''.format(bldpkg_path(meta), owner, channel))
    else:
        print("No BINSTAR_KEY present, so no upload is taking place. "
              "The distribution just built {} already available on {}'s "
              "{} channel.".format('is' if exists else 'is not',
                                   owner, channel))

if __name__ == '__main__':
    main()
 No newline at end of file

ci_tools/condaci.py

deleted100644 → 0
+0 −764

File deleted.

Preview size limit exceeded, changes collapsed.