blob: 64b607b87aa912eed6e58f2a586c987a01d12943 [file] [log] [blame]
.. Licensed to the Apache Software Foundation (ASF) under one
.. or more contributor license agreements. See the NOTICE file
.. distributed with this work for additional information
.. regarding copyright ownership. The ASF licenses this file
.. to you under the Apache License, Version 2.0 (the
.. "License"); you may not use this file except in compliance
.. with the License. You may obtain a copy of the License at
.. http://www.apache.org/licenses/LICENSE-2.0
.. Unless required by applicable law or agreed to in writing,
.. software distributed under the License is distributed on an
.. "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
.. KIND, either express or implied. See the License for the
.. specific language governing permissions and limitations
.. under the License.
Packaging and Testing with Crossbow
===================================
The content of ``arrow/dev/tasks`` directory aims for automating the process of
Arrow packaging and integration testing.
Packages:
- C++ and Python `conda-forge packages`_ for Linux, Mac and Windows
- Python `Wheels`_ for Linux, Mac and Windows
- C++ and GLib `Linux packages`_ for multiple distributions
- Java for Gandiva
Integration tests:
- Various docker tests
- Pandas
- Dask
- Turbodbc
- HDFS
- Spark
Architecture
------------
Executors
~~~~~~~~~
Individual jobs are executed on public CI services, currently:
- Linux: TravisCI, CircleCI, Azure Pipelines
- Mac: TravisCI, Azure Pipelines
- Windows: AppVeyor, Azure Pipelines
Queue
~~~~~
Because of the nature of how the CI services work, the scheduling of
jobs happens through an additional git repository, which acts like a job
queue for the tasks. Anyone can host a ``queue`` repository which is usually
called as ``crossbow``.
A job is a git commit on a particular git branch, containing only the required
configuration file to run the requested build (like ``.travis.yml``,
``appveyor.yml`` or ``azure-pipelines.yml``).
Scheduler
~~~~~~~~~
`Crossbow.py`_ handles version generation, task rendering and
submission. The tasks are defined in ``tasks.yml``.
Install
-------
The following guide depends on GitHub, but theoretically any git
server can be used.
1. `Create the queue repository`_
2. Enable `TravisCI`_, `Appveyor`_, `Azure Pipelines_` and `CircleCI`_
integrations on for the newly created queue repository.
- turn off Travis’ `auto cancellation`_ feature on branches
3. Clone the newly created repository next to the arrow repository:
By default the scripts looks for ``crossbow`` next to arrow repository, but
this can configured through command line arguments.
.. code:: bash
git clone https://github.com/<user>/crossbow crossbow
**Important note:** Crossbow only supports GitHub token based
authentication. Although it overwrites the repository urls provided with ssh
protocol, it's advisable to use the HTTPS repository URLs.
4. `Create a Personal Access Token`_ with ``repo`` permissions (other
permissions are not needed)
5. Locally export the token as an environment variable:
.. code:: bash
export CROSSBOW_GITHUB_TOKEN=<token>
..
or pass as an argument to the CLI script ``--github-token``
6. Export the previously created GitHub token on both CI services:
Use ``CROSSBOW_GITHUB_TOKEN`` encrypted environment variable. You can
set them at the following URLs, where ``ghuser`` is the GitHub
username and ``ghrepo`` is the GitHub repository name (typically
``crossbow``):
- TravisCI: ``https://travis-ci.org/<ghuser>/<ghrepo>/settings``
- Appveyor:
``https://ci.appveyor.com/project/<ghuser>/<ghrepo>/settings/environment``
- CircleCI:
``https://circleci.com/gh/<ghuser>/<ghrepo>/edit#env-vars``
On Appveyor check the ``skip branches without appveyor.yml`` checkbox
on the web UI under crossbow repository’s settings.
7. Install Python (minimum supported version is 3.6):
Miniconda is preferred, see installation instructions:
https://conda.io/docs/user-guide/install/index.html
8. Install the python dependencies for the script:
.. code:: bash
conda install -c conda-forge -y --file arrow/ci/conda_env_crossbow.txt
.. code:: bash
# pygit2 requires libgit2: http://www.pygit2.org/install.html
pip install \
jinja2 \
pygit2 \
click \
ruamel.yaml \
setuptools_scm \
github3.py \
toolz \
jira
9. Try running it:
.. code:: bash
$ python crossbow.py --help
Usage
-----
The script does the following:
1. Detects the current repository, thus supports forks. The following
snippet will build kszucs’s fork instead of the upstream apache/arrow
repository.
.. code:: bash
$ git clone https://github.com/kszucs/arrow
$ git clone https://github.com/kszucs/crossbow
$ cd arrow/dev/tasks
$ python crossbow.py submit --help # show the available options
$ python crossbow.py submit conda-win conda-linux conda-osx
2. Gets the HEAD commit of the currently checked out branch and
generates the version number based on `setuptools_scm`_. So to build
a particular branch check out before running the script:
.. code:: bash
git checkout ARROW-<ticket number>
python dev/tasks/crossbow.py submit --dry-run conda-linux conda-osx
..
Note that the arrow branch must be pushed beforehand, because the
script will clone the selected branch.
3. Reads and renders the required build configurations with the
parameters substituted.
4. Create a branch per task, prefixed with the job id. For example to
build conda recipes on linux it will create a new branch:
``crossbow@build-<id>-conda-linux``.
5. Pushes the modified branches to GitHub which triggers the builds. For
authentication it uses GitHub OAuth tokens described in the install
section.
Query the build status
~~~~~~~~~~~~~~~~~~~~~~
Build id (which has a corresponding branch in the queue repository) is returned
by the ``submit`` command.
.. code:: bash
python crossbow.py status <build id / branch name>
Download the build artifacts
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: bash
python crossbow.py artifacts <build id / branch name>
Examples
~~~~~~~~
Submit command accepts a list of task names and/or a list of task-group names
to select which tasks to build.
Run multiple builds:
.. code:: bash
$ python crossbow.py submit debian-stretch conda-linux-gcc-py37-r40
Repository: https://github.com/kszucs/arrow@tasks
Commit SHA: 810a718836bb3a8cefc053055600bdcc440e6702
Version: 0.9.1.dev48+g810a7188.d20180414
Pushed branches:
- debian-stretch
- conda-linux-gcc-py37-r40
Just render without applying or committing the changes:
.. code:: bash
$ python crossbow.py submit --dry-run task_name
Run only ``conda`` package builds and a Linux one:
.. code:: bash
$ python crossbow.py submit --group conda centos-7
Run ``wheel`` builds:
.. code:: bash
$ python crossbow.py submit --group wheel
There are multiple task groups in the ``tasks.yml`` like docker, integration
and cpp-python for running docker based tests.
``python crossbow.py submit`` supports multiple options and arguments, for more
see its help page:
.. code:: bash
$ python crossbow.py submit --help
.. _conda-forge packages: conda-recipes
.. _Wheels: python-wheels
.. _Linux packages: linux-packages
.. _Crossbow.py: crossbow.py
.. _Create the queue repository: https://help.github.com/articles/creating-a-new-repository
.. _TravisCI: https://travis-ci.org/getting_started
.. _Appveyor: https://www.appveyor.com/docs/
.. _CircleCI: https://circleci.com/docs/2.0/getting-started/
.. _Azure Pipelines: https://docs.microsoft.com/en-us/azure/devops/pipelines/get-started/pipelines-sign-up
.. _auto cancellation: https://docs.travis-ci.com/user/customizing-the-build/#Building-only-the-latest-commit
.. _Create a Personal Access Token: https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/
.. _setuptools_scm: https://pypi.python.org/pypi/setuptools_scm