ARROW-6963: [Packaging][Wheel][OSX] Use crossbow's command to deploy artifacts from travis builds
Closes #5726 from kszucs/osx-wheel-upload and squashes the following commits:
320b76e90 <Krisztián Szűcs> install requests security for system python
4b42380ea <Krisztián Szűcs> pass default paths as strings
80e2e5b09 <Krisztián Szűcs> better error if pygit2 is missing
1bc93a869 <Krisztián Szűcs> make pygit2 and github3 optional dependencies for crossbow
Authored-by: Krisztián Szűcs <szucs.krisztian@gmail.com>
Signed-off-by: Krisztián Szűcs <szucs.krisztian@gmail.com>
diff --git a/dev/tasks/crossbow.py b/dev/tasks/crossbow.py
index 50f965f..5fe5063 100755
--- a/dev/tasks/crossbow.py
+++ b/dev/tasks/crossbow.py
@@ -32,13 +32,21 @@
import click
import toolz
-import pygit2
-import github3
-import jira.client
-from jinja2 import Template, StrictUndefined
from setuptools_scm.git import parse as parse_git_version
from ruamel.yaml import YAML
+try:
+ import github3
+except ImportError:
+ github3 = object
+
+try:
+ import pygit2
+except ImportError:
+ PygitRemoteCallbacks = object
+else:
+ PygitRemoteCallbacks = pygit2.RemoteCallbacks
+
CWD = Path(__file__).parent.absolute()
@@ -117,6 +125,7 @@
def __init__(self, version, username, password,
server='https://issues.apache.org/jira'):
+ import jira.client
self.server = server
# clean version to the first numbers
self.version = '.'.join(version.split('.')[:3])
@@ -201,7 +210,7 @@
return out.getvalue().strip()
-class GitRemoteCallbacks(pygit2.RemoteCallbacks):
+class GitRemoteCallbacks(PygitRemoteCallbacks):
def __init__(self, token):
self.token = token
@@ -249,10 +258,10 @@
def __init__(self, path, github_token=None, remote_url=None,
require_https=False):
self.path = Path(path)
- self.repo = pygit2.Repository(str(self.path))
self.github_token = github_token
self.require_https = require_https
self._remote_url = remote_url
+ self._pygit_repo = None
self._github_repo = None # set by as_github_repo()
self._updated_refs = []
@@ -268,6 +277,12 @@
)
@property
+ def repo(self):
+ if self._pygit_repo is None:
+ self._pygit_repo = pygit2.Repository(str(self.path))
+ return self._pygit_repo
+
+ @property
def origin(self):
remote = self.repo.remotes['origin']
if self.require_https and remote.url.startswith('git@github.com'):
@@ -398,6 +413,10 @@
def _parse_github_user_repo(self):
m = re.match(r'.*\/([^\/]+)\/([^\/\.]+)(\.git)?$', self.remote_url)
+ if m is None:
+ raise ValueError("Unable to parse the github owner and repository "
+ "from the repository's remote url '{}'"
+ .format(self.remote_url))
user, repo = m.group(1), m.group(2)
return user, repo
@@ -671,6 +690,7 @@
self._status = None # status cache
def render_files(self, **extra_params):
+ from jinja2 import Template, StrictUndefined
path = CWD / self.template
params = toolz.merge(self.params, extra_params)
template = Template(path.read_text(), undefined=StrictUndefined)
@@ -1028,11 +1048,11 @@
@click.option('--github-token', '-t', default=None,
help='OAuth token for GitHub authentication')
@click.option('--arrow-path', '-a',
- type=click.Path(exists=True), default=DEFAULT_ARROW_PATH,
+ type=click.Path(exists=True), default=str(DEFAULT_ARROW_PATH),
help='Arrow\'s repository path. Defaults to the repository of '
'this script')
@click.option('--queue-path', '-q',
- type=click.Path(exists=True), default=DEFAULT_QUEUE_PATH,
+ type=click.Path(exists=True), default=str(DEFAULT_QUEUE_PATH),
help='The repository path used for scheduling the tasks. '
'Defaults to crossbow directory placed next to arrow')
@click.option('--queue-remote', '-qr', default=None,
@@ -1059,7 +1079,7 @@
@crossbow.command()
@click.option('--changelog-path', '-c', type=click.Path(exists=True),
- default=DEFAULT_ARROW_PATH / 'CHANGELOG.md',
+ default=str(DEFAULT_ARROW_PATH / 'CHANGELOG.md'),
help='Path of changelog to update')
@click.option('--arrow-version', '-v', default=None,
help='Set target version explicitly')
@@ -1232,7 +1252,8 @@
@crossbow.command()
@click.argument('job-name', required=True)
-@click.option('-t', '--target-dir', default=DEFAULT_ARROW_PATH / 'packages',
+@click.option('-t', '--target-dir',
+ default=str(DEFAULT_ARROW_PATH / 'packages'),
type=click.Path(file_okay=False, dir_okay=True),
help='Directory to download the build artifacts')
@click.pass_obj
diff --git a/dev/tasks/python-wheels/travis.osx.yml b/dev/tasks/python-wheels/travis.osx.yml
index 7d4177f..cdf39bc 100644
--- a/dev/tasks/python-wheels/travis.osx.yml
+++ b/dev/tasks/python-wheels/travis.osx.yml
@@ -25,10 +25,10 @@
global:
- PLAT=x86_64
- TRAVIS_TAG={{ task.tag }}
- - MACOSX_DEPLOYMENT_TARGET="10.9"
- PYARROW_VERSION={{ arrow.no_rc_version }}
- PYARROW_BUILD_VERBOSE=1
- MB_PYTHON_VERSION={{ python_version }}
+ - MACOSX_DEPLOYMENT_TARGET="10.9"
before_install:
- git clone https://github.com/matthew-brett/multibuild # TODO pin it
@@ -40,29 +40,26 @@
# ARROW-3976 Old versions of git can cause failures when Homebrew prints a
# donation solicitation. Attempt to update git
- - git --version
- - brew upgrade git
+ - brew upgrade git python
# Also remove artifacts that depend on Boost
- brew uninstall boost cgal postgis sfcgal
- brew update
- brew upgrade cmake
- travis_wait 30 brew install bison flex grpc openssl@1.1 llvm@7 zlib gperftools
- # Remove shared grpc libraries installed by brew to make sure
+ # remove shared grpc libraries installed by brew to make sure
# we are linked against the static ones.
- rm -f /usr/local/opt/grpc/lib/*.dylib
+ # source utilities required for wheel builds
- export CONFIG_PATH=`pwd`/arrow/dev/tasks/python-wheels/osx-build.sh
- source multibuild/common_utils.sh
- source multibuild/travis_osx_steps.sh
-
- before_install
# Fix SSL TLS issue for Python 3.5 on macOS
- pip install requests[security]
install:
- - mkdir -p dist
-
# the following functions are defined in osx-build.sh
- build_wheel arrow
@@ -78,19 +75,13 @@
# run the import tests
- run_import_tests
- # move built wheels to a top level directory
- - mv -v arrow/python/dist/* dist/
- # reinstall openssl because travis' deployment script depends on it
- brew install openssl@1.1
-
-deploy:
- provider: releases
- api_key: $CROSSBOW_GITHUB_TOKEN
- file_glob: true
- file: dist/*.whl
- skip_cleanup: true
- on:
- tags: true
+ # before_install activates a virtualenv but we need the system python3
+ - deactivate
+ # crossbow dependencies for deployment
+ - unset MACOSX_DEPLOYMENT_TARGET
+ - pip3 install click ruamel.yaml setuptools_scm github3.py toolz requests[security]
+ - python3 arrow/dev/tasks/crossbow.py --queue-path $(pwd) --queue-remote {{ queue.remote_url }} upload-artifacts --sha {{ task.branch }} --tag {{ task.tag }} --pattern "arrow/python/dist/*.whl"
notifications:
email: