使用 Crossbow 进行打包和测试#

arrow/dev/tasks 目录的内容旨在自动化 Arrow 打包和集成测试流程。

  • 适用于 Linux、macOS 和 Windows 的 C++ 和 Python conda-forge 包

  • 适用于 Linux、macOS 和 Windows 的 Python Wheels

  • 适用于多个发行版的 C++ 和 GLib Linux 包

  • 用于 Gandiva 的 Java

集成测试
  • 各种 docker 测试

  • Pandas

  • Dask

  • Turbodbc

  • HDFS

  • Spark

架构#

执行器#

各个作业在公共 CI 服务上执行,目前包括

  • Linux: GitHub Actions、Travis CI、Azure Pipelines

  • macOS: GitHub Actions、Azure Pipelines

  • Windows: GitHub Actions、Azure Pipelines

队列#

由于 CI 服务工作方式的特性,作业的调度通过一个额外的 git 仓库进行,该仓库充当任务的作业队列。任何人都可以托管一个 queue 仓库(通常命名为 <ghuser>/crossbow)。

一个作业是在特定 git 分支上的 git 提交,包含运行请求的构建所需的配置文件(例如 .travis.ymlazure-pipelines.ymlcrossbow.yml 用于 GitHub Actions)。

调度程序#

Crossbow 处理版本生成、任务渲染和提交。任务定义在 tasks.yml 中。

安装#

以下指南依赖于 GitHub,但理论上可以使用任何 git 服务器。

如果您没有使用 ursacomputing/crossbow 仓库,您需要完成前两步,否则请继续执行步骤 3

  1. 创建队列仓库

  2. 为新创建的队列仓库启用 Travis CIAzure Pipelines 集成。

  3. 克隆 ursacomputing/crossbow(如果您正在使用它),或者克隆新创建的仓库,使其位于 arrow 仓库旁边

    默认情况下,脚本会在 arrow 目录旁边寻找一个名为 crossbow 的克隆,但这可以通过命令行参数进行配置。

    git clone https://github.com/<user>/crossbow crossbow
    

    **重要提示:** Crossbow 仅支持基于 GitHub 令牌的身份验证。虽然它使用 ssh 协议覆盖了提供的仓库 URL,但建议使用 HTTPS 仓库 URL。

  4. 创建个人访问令牌,并具有 repoworkflow 权限(其他权限不需要)

  5. 在本地将令牌导出为环境变量

    export CROSSBOW_GITHUB_TOKEN=<token>
    

    或将其作为参数传递给 CLI 脚本 --github-token

  6. 将先前创建的 GitHub 令牌添加到 **Travis CI**

    使用加密的环境变量 CROSSBOW_GITHUB_TOKEN。您可以在以下 URL 设置它,其中 ghuser 是 GitHub 用户名,ghrepo 是 GitHub 仓库名称(通常为 crossbow

    https://www.travis-ci.cn/<ghuser>/<ghrepo>/settings

    • 确认 自动取消 功能已为分支构建关闭。这应该是默认设置。

  7. 安装 Python(最低支持版本为 3.9)

    建议使用 Miniconda,请查看安装说明
  8. 安装包含 crossbow 本身的 archery 工具集

    $ pip install -e "arrow/dev/archery[crossbow]"
    
  9. 尝试运行它

    $ archery crossbow --help
    

用法#

该脚本执行以下操作

  1. 检测当前仓库,因此支持分支。以下代码片段将构建 kszucs 的分支,而不是上游 apache/arrow 仓库。

    $ git clone https://github.com/kszucs/arrow
    $ git clone https://github.com/kszucs/crossbow
    
    $ cd arrow/dev/tasks
    $ archery crossbow submit --help  # show the available options
    $ archery crossbow submit conda-win conda-linux conda-osx
    
  2. 获取当前签出分支的 HEAD 提交,并根据 setuptools_scm 生成版本号。因此,要构建特定分支,请在运行脚本之前签出它

    $ git checkout ARROW-<ticket number>
    $ archery crossbow submit --dry-run conda-linux conda-osx
    

    请注意,arrow 分支必须事先被推送,因为脚本会克隆选定的分支。

  3. 读取并渲染所需的构建配置,并替换参数。

  4. 为每个任务创建一个分支,以作业 ID 为前缀。例如,要构建 Linux 上的 conda 食谱,它将创建一个新分支:crossbow@build-<id>-conda-linux

  5. 将修改后的分支推送到 GitHub,这将触发构建。为了进行身份验证,它使用安装部分中描述的 GitHub OAuth 令牌。

查询构建状态#

构建 ID(在队列仓库中有一个对应的分支)由 submit 命令返回。

$ archery crossbow status <build id / branch name>

下载构建工件#

$ archery crossbow artifacts <build id / branch name>

示例#

Submit 命令接受任务名称列表和/或任务组名称列表来选择要构建的任务。

运行多个构建

$ archery crossbow 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

仅渲染而不应用或提交更改

$ archery crossbow submit --dry-run task_name

仅运行 conda 包构建和一个 Linux 构建

$ archery crossbow submit --group conda centos-7

运行 wheel 构建

$ archery crossbow submit --group wheel

tasks.yml 中有多个任务组,例如 docker、integration 和 cpp-python,用于运行基于 docker 的测试。

archery crossbow submit 支持多个选项和参数,有关更多信息,请参见其帮助页面

$ archery crossbow submit --help