This is an automated email from the ASF dual-hosted git repository.

agrove pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-ray.git


The following commit(s) were added to refs/heads/main by this push:
     new 6217cbe  Add CI to build python wheels (#76)
6217cbe is described below

commit 6217cbe588303e01877f372f9a08325783bb6e11
Author: robtandy <[email protected]>
AuthorDate: Wed Mar 5 12:55:19 2025 -0500

    Add CI to build python wheels (#76)
---
 .github/workflows/build.yml      | 293 +++++++++++++++++++++++++++++++++++++++
 Cargo.lock                       |  19 +++
 Cargo.toml                       |   1 +
 LICENSE => LICENSE.txt           |   0
 LICENSE => dev/create_license.py |  51 +++++++
 5 files changed, 364 insertions(+)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..11ff562
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,293 @@
+# 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.
+
+name: Python Release Build
+on:
+  pull_request:
+    branches: ["main"]
+  push:
+    tags: ["*-rc*"]
+    branches: ["branch-*"]
+  workflow_dispatch:
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+
+      - uses: astral-sh/setup-uv@v5
+        with:
+          enable-cache: true
+          python_version: "3.12"
+
+      # Use the --no-install-package to only install the dependencies
+      # but do not yet build the rust library
+      - name: Install dependencies
+        run: uv sync --dev --no-install-package datafusion-ray
+
+  generate-license:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - uses: astral-sh/setup-uv@v5
+        with:
+          enable-cache: true
+
+      - name: Generate license file
+        run: uv run --no-project python ./dev/create_license.py
+      - uses: actions/upload-artifact@v4
+        with:
+          name: python-wheel-license
+          path: LICENSE.txt
+
+  build-python-mac-win:
+    needs: [generate-license]
+    name: Mac/Win
+    runs-on: ${{ matrix.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        python-version: ["3.13"]
+        #os: [macos-latest, windows-latest]
+        os: [macos-latest]
+    steps:
+      - uses: actions/checkout@v4
+
+      - uses: actions/setup-python@v5
+        with:
+          python-version: ${{ matrix.python-version }}
+
+      - uses: dtolnay/rust-toolchain@stable
+
+      - run: rm LICENSE.txt
+      - name: Download LICENSE.txt
+        uses: actions/download-artifact@v4
+        with:
+          name: python-wheel-license
+          path: .
+
+      - name: Install Protoc
+        uses: arduino/setup-protoc@v3
+        with:
+          version: "27.4"
+          repo-token: ${{ secrets.GITHUB_TOKEN }}
+
+      - uses: astral-sh/setup-uv@v5
+        with:
+          enable-cache: true
+
+      - name: Build Python package
+        run: |
+          uv sync --dev --no-install-package datafusion-ray
+          uv run --no-project maturin build --release --strip
+
+      - name: List Windows wheels
+        if: matrix.os == 'windows-latest'
+        run: dir target\wheels\
+        # since the runner is dynamic shellcheck (from actionlint) can't infer 
this is powershell
+        # so we specify it explicitly
+        shell: powershell
+
+      - name: List Mac wheels
+        if: matrix.os != 'windows-latest'
+        run: find target/wheels/
+
+      - name: Archive wheels
+        uses: actions/upload-artifact@v4
+        with:
+          name: dist-${{ matrix.os  }}
+          path: target/wheels/*
+
+  build-macos-x86_64:
+    needs: [generate-license]
+    name: Mac x86_64
+    runs-on: macos-13
+    strategy:
+      fail-fast: false
+      matrix:
+        python-version: ["3.12"]
+    steps:
+      - uses: actions/checkout@v4
+
+      - uses: actions/setup-python@v5
+        with:
+          python-version: ${{ matrix.python-version }}
+
+      - uses: dtolnay/rust-toolchain@stable
+
+      - run: rm LICENSE.txt
+      - name: Download LICENSE.txt
+        uses: actions/download-artifact@v4
+        with:
+          name: python-wheel-license
+          path: .
+
+      - name: Install Protoc
+        uses: arduino/setup-protoc@v3
+        with:
+          version: "27.4"
+          repo-token: ${{ secrets.GITHUB_TOKEN }}
+
+      - uses: astral-sh/setup-uv@v5
+        with:
+          enable-cache: true
+
+      - name: Build Python package
+        run: |
+          uv sync --dev --no-install-package datafusion-ray
+          uv run --no-project maturin build --release --strip
+
+      - name: List Mac wheels
+        run: find target/wheels/
+
+      - name: Archive wheels
+        uses: actions/upload-artifact@v4
+        with:
+          name: dist-macos-aarch64
+          path: target/wheels/*
+
+  build-manylinux-x86_64:
+    needs: [generate-license]
+    name: Manylinux x86_64
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - run: rm LICENSE.txt
+      - name: Download LICENSE.txt
+        uses: actions/download-artifact@v4
+        with:
+          name: python-wheel-license
+          path: .
+
+      - name: Build wheels
+        uses: PyO3/maturin-action@v1
+        env:
+          RUST_BACKTRACE: 1
+        with:
+          rust-toolchain: nightly
+          target: x86_64
+          manylinux: auto
+          rustup-components: rust-std rustfmt # Keep them in one line due to 
https://github.com/PyO3/maturin-action/issues/153
+          args: --release --manylinux 2014
+          before-script-linux: |
+            yum install -y wget
+            cd /
+            wget 
https://github.com/protocolbuffers/protobuf/releases/download/v29.3/protoc-29.3-linux-x86_64.zip
+            unzip -o proto*zip
+            cd -
+            which protoc
+            protoc --version
+
+      - name: Archive wheels
+        uses: actions/upload-artifact@v4
+        with:
+          name: dist-manylinux-x86_64
+          path: target/wheels/*
+
+  build-manylinux-aarch64:
+    needs: [generate-license]
+    name: Manylinux arm64
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - run: rm LICENSE.txt
+      - name: Download LICENSE.txt
+        uses: actions/download-artifact@v4
+        with:
+          name: python-wheel-license
+          path: .
+
+      - name: Build wheels
+        uses: PyO3/maturin-action@v1
+        env:
+          RUST_BACKTRACE: 1
+        with:
+          rust-toolchain: nightly
+          target: aarch64
+          # Use manylinux_2_28-cross because the manylinux2014-cross has GCC 
4.8.5, which causes the build to fail
+          manylinux: 2_28
+          rustup-components: rust-std rustfmt # Keep them in one line due to 
https://github.com/PyO3/maturin-action/issues/153
+          args: --release
+          before-script-linux: |
+            apt-get install -y unzip
+            cd /
+            wget 
https://github.com/protocolbuffers/protobuf/releases/download/v29.3/protoc-29.3-linux-x86_64.zip
+            unzip -o proto*zip
+            cd -
+            which protoc
+            protoc --version
+
+      - name: Archive wheels
+        uses: actions/upload-artifact@v4
+        with:
+          name: dist-manylinux-aarch64
+          path: target/wheels/*
+
+  build-sdist:
+    needs: [generate-license]
+    name: Source distribution
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - run: rm LICENSE.txt
+      - name: Download LICENSE.txt
+        uses: actions/download-artifact@v4
+        with:
+          name: python-wheel-license
+          path: .
+
+      - name: Build sdist
+        uses: PyO3/maturin-action@v1
+        with:
+          rust-toolchain: stable
+          manylinux: auto
+          rustup-components: rust-std rustfmt
+          args: --release --sdist --out dist
+          before-script-linux: |
+            yum install -y wget
+            cd /
+            wget 
https://github.com/protocolbuffers/protobuf/releases/download/v29.3/protoc-29.3-linux-x86_64.zip
+            unzip -o proto*zip
+            cd -
+            which protoc
+            protoc --version
+
+      - name: Assert sdist build does not generate wheels
+        run: |
+          if [ "$(ls -A target/wheels)" ]; then
+            echo "Error: Sdist build generated wheels"
+            exit 1
+          else
+            echo "Directory is clean"
+          fi
+        shell: bash
+
+  merge-build-artifacts:
+    runs-on: ubuntu-latest
+    needs:
+      - build-python-mac-win
+      - build-macos-x86_64
+      - build-manylinux-x86_64
+      - build-manylinux-aarch64
+      - build-sdist
+    steps:
+      - name: Merge Build Artifacts
+        uses: actions/upload-artifact/merge@v4
+        with:
+          name: dist
+          pattern: dist-*
diff --git a/Cargo.lock b/Cargo.lock
index 38244d8..e5c5ffb 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -887,6 +887,15 @@ dependencies = [
  "phf_codegen",
 ]
 
+[[package]]
+name = "cmake"
+version = "0.1.54"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "colorchoice"
 version = "1.0.3"
@@ -1616,6 +1625,7 @@ dependencies = [
  "parking_lot",
  "prost 0.13.5",
  "prost-types 0.13.5",
+ "protobuf-src",
  "pyo3",
  "pyo3-async-runtimes",
  "pyo3-pylogger",
@@ -3120,6 +3130,15 @@ dependencies = [
  "prost 0.13.5",
 ]
 
+[[package]]
+name = "protobuf-src"
+version = "2.1.1+27.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "6217c3504da19b85a3a4b2e9a5183d635822d83507ba0986624b5c05b83bfc40"
+dependencies = [
+ "cmake",
+]
+
 [[package]]
 name = "psm"
 version = "0.1.25"
diff --git a/Cargo.toml b/Cargo.toml
index 0638fea..fa4dc89 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -85,6 +85,7 @@ tonic-build = { version = "0.8", default-features = false, 
features = [
   "prost",
 ] }
 url = "2"
+protobuf-src = "2.1"
 
 [dev-dependencies]
 tempfile = "3.17"
diff --git a/LICENSE b/LICENSE.txt
similarity index 100%
copy from LICENSE
copy to LICENSE.txt
diff --git a/LICENSE b/dev/create_license.py
similarity index 86%
rename from LICENSE
rename to dev/create_license.py
index 261eeb9..2a67cb8 100644
--- a/LICENSE
+++ b/dev/create_license.py
@@ -1,3 +1,40 @@
+#!/usr/bin/python
+#
+# 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.
+#
+
+# This file is a mirror of 
https://github.com/apache/arrow-datafusion/blob/master/dev/create_license.py
+
+import json
+import subprocess
+
+subprocess.check_output(["cargo", "install", "cargo-license"])
+data = subprocess.check_output(
+    [
+        "cargo",
+        "license",
+        "--avoid-build-deps",
+        "--avoid-dev-deps",
+        "--do-not-bundle",
+        "--json",
+    ]
+)
+data = json.loads(data)
+
+result = """
                                  Apache License
                            Version 2.0, January 2004
                         http://www.apache.org/licenses/
@@ -199,3 +236,17 @@
    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.
+"""
+result += "\n------------------\n\n"
+result += "This software is built and contains the following software:\n\n"
+result += "(automatically generated via 
[cargo-license](https://crates.io/crates/cargo-license))\n\n"
+for item in data:
+    license = item["license"]
+    name = item["name"]
+    version = item["version"]
+    repository = item["repository"]
+    result += "------------------\n\n"
+    result += f"### {name} {version}\n* source: 
[{repository}]({repository})\n* license: {license}\n\n"
+
+with open("LICENSE.txt", "w") as f:
+    f.write(result)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to