diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..ce92d5a52 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,312 @@ +# 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-*"] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install ruff + # Update output format to enable automatic inline annotations. +# - name: Run Ruff +# run: | +# ruff check --output-format=github python/ +# ruff format --check python/ + + generate-license: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + - name: Generate license file + run: 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.10"] + os: [macos-latest, windows-latest] + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Upgrade pip + run: python -m pip install --upgrade pip + + - name: Install maturin + run: pip install maturin==1.5.1 + + - 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 }} + + - name: Cargo build + run: cd python && cargo build + + - name: Build Python package + run: cd python && maturin build --release --strip + + - name: List Windows wheels + if: matrix.os == 'windows-latest' + run: dir python\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: cd python/target/wheels/ + + - name: Archive wheels + uses: actions/upload-artifact@v4 + with: + name: dist-${{ matrix.os }} + path: python/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.10"] + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Upgrade pip + run: python -m pip install --upgrade pip + + - name: Install maturin + run: pip install maturin==1.5.1 + + - 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 }} + - name: Cargo build + run: cd python && cargo build + - name: Build Python package + run: cd python && maturin build --release --strip + - name: List Mac wheels + run: cd python/target/wheels/ + + - name: Archive wheels + uses: actions/upload-artifact@v4 + with: + name: dist-macos-aarch64 + path: python/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: . + + - run: cat LICENSE.txt + - name: Install Protoc + uses: arduino/setup-protoc@v3 + with: + version: "27.4" + repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Upgrade pip + run: python -m pip install --upgrade pip + + - name: Install maturin + run: pip install maturin==1.5.1 + - name: Cargo Build + run: cd python && cargo build + + - name: Build Python package + run: cd python && maturin build --release --strip + - name: Archive wheels + uses: actions/upload-artifact@v4 + with: + name: dist-manylinux-x86_64 + path: python/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: . + + - run: cat LICENSE.txt + + - name: Install Protoc + uses: arduino/setup-protoc@v3 + with: + version: "27.4" + repo-token: ${{ secrets.GITHUB_TOKEN }} + - name: Upgrade pip + run: python -m pip install --upgrade pip + + - name: Install maturin + run: pip install maturin==1.5.1 + - name: Cargo Build + run: cd python && cargo build + + - name: Build Python package + run: cd python && maturin build --release --strip + - name: Archive wheels + uses: actions/upload-artifact@v4 + with: + name: dist-manylinux-aarch64 + path: python/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: . + + - run: cat LICENSE.txt + + - name: Install Protoc + uses: arduino/setup-protoc@v3 + with: + version: "27.4" + repo-token: ${{ secrets.GITHUB_TOKEN }} + - name: Upgrade pip + run: python -m pip install --upgrade pip + + - name: Install maturin + run: pip install maturin==1.5.1 + - name: Cargo Build + run: cd python && cargo build + - name: Build Python package + run: cd python && maturin build --release --sdist --out dist --strip + + - 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-* + + # NOTE: PyPI publish needs to be done manually for now after release passed the vote + # release: + # name: Publish in PyPI + # needs: [build-manylinux, build-python-mac-win] + # runs-on: ubuntu-latest + # steps: + # - uses: actions/download-artifact@v4 + # - name: Publish to PyPI + # uses: pypa/gh-action-pypi-publish@master + # with: + # user: __token__ + # password: ${{ secrets.pypi_password }} diff --git a/python/pyproject.toml b/python/pyproject.toml index 2d06b225d..cce88fd3b 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -16,7 +16,7 @@ # under the License. [build-system] -requires = ["maturin>=0.15,<0.16"] +requires = ["maturin>=1.5.1,<1.6.0"] build-backend = "maturin" [project] @@ -24,7 +24,7 @@ name = "ballista" description = "Python client for Apache Arrow Ballista Distributed SQL Query Engine" readme = "README.md" license = {file = "LICENSE.txt"} -requires-python = ">=3.6" +requires-python = ">=3.7" keywords = ["ballista", "sql", "rust", "distributed"] classifier = [ "Development Status :: 2 - Pre-Alpha", @@ -61,4 +61,4 @@ include = [ ] exclude = [".github/**", "ci/**", ".asf.yaml"] # Require Cargo.lock is up to date -locked = true \ No newline at end of file +locked = true