diff --git a/.github/actions/overwrite-package-version/action.yml b/.github/actions/overwrite-package-version/action.yml new file mode 100644 index 0000000000..087e6401d1 --- /dev/null +++ b/.github/actions/overwrite-package-version/action.yml @@ -0,0 +1,46 @@ +# 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: 'Update Package Version' +description: 'Updates pyproject.toml version with timestamp' +runs: + using: "composite" + steps: + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install toml + run: pip install toml + shell: bash + + - name: Get and update version + shell: bash + run: | + CURRENT_VERSION=$(python -c "import toml; print(toml.load('bindings/python/pyproject.toml')['project']['version'])") + TIMESTAMP=$(date +%Y%m%d%H%M%S) + NEW_VERSION="${CURRENT_VERSION}.dev${TIMESTAMP}" + NEW_VERSION=$NEW_VERSION python -c " + import toml + import os + config = toml.load('bindings/python/pyproject.toml') + config['project']['version'] = os.environ['NEW_VERSION'] + with open('bindings/python/pyproject.toml', 'w') as f: + toml.dump(config, f) + print(f'Updated version to: {config[\"project\"][\"version\"]}') + " \ No newline at end of file diff --git a/.github/workflows/release_python.yml b/.github/workflows/release_python.yml index 9fc6f2c97f..b5ee3a50a1 100644 --- a/.github/workflows/release_python.yml +++ b/.github/workflows/release_python.yml @@ -113,31 +113,3 @@ jobs: with: skip-existing: true packages-dir: bindings/python/dist - - testpypi-publish: - name: Publish Python 🐍 distribution 📦 to TestPypi - needs: [ sdist, wheels ] - runs-on: ubuntu-latest - # Only publish to TestPyPi if the tag is a pre-release - if: ${{ startsWith(github.ref, 'refs/tags/') && contains(github.ref, '-')}} - - environment: - name: testpypi - url: https://test.pypi.org/p/pyiceberg_core - - permissions: - id-token: write # IMPORTANT: mandatory for trusted publishing - - steps: - - name: Download all the dists - uses: actions/download-artifact@v4 - with: - pattern: wheels-* - merge-multiple: true - path: bindings/python/dist - - name: Publish to TestPyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - repository-url: https://test.pypi.org/legacy/ - skip-existing: true - packages-dir: bindings/python/dist diff --git a/.github/workflows/release_python_nightly.yml b/.github/workflows/release_python_nightly.yml new file mode 100644 index 0000000000..5091d0e38d --- /dev/null +++ b/.github/workflows/release_python_nightly.yml @@ -0,0 +1,110 @@ +# 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: "Nightly PyPI Build" + +on: + schedule: + - cron: "0 0 * * *" # Runs at midnight UTC every day + workflow_dispatch: # Allows manual triggering + +env: + rust_msrv: "1.77.1" + +permissions: + contents: read + +jobs: + sdist: + if: github.repository == 'apache/iceberg-rust' # Only run for apache repo + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: ./.github/actions/overwrite-package-version # overwrite the pacakge version with current timestamp + + - uses: PyO3/maturin-action@v1 + with: + working-directory: "bindings/python" + command: sdist + args: -o dist + - name: Upload sdist + uses: actions/upload-artifact@v4 + with: + name: wheels-sdist + path: bindings/python/dist + + wheels: + if: github.repository == 'apache/iceberg-rust' # Only run for apache repo + runs-on: "${{ matrix.os }}" + strategy: + matrix: + include: + - { os: windows-latest } + - { os: macos-latest, target: "universal2-apple-darwin" } + - { os: ubuntu-latest, target: "x86_64" } + - { os: ubuntu-latest, target: "aarch64", manylinux: "manylinux_2_28" } + - { os: ubuntu-latest, target: "armv7l" } + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/overwrite-package-version # overwrite the pacakge version with current timestamp + - uses: actions/setup-python@v5 + with: + python-version: 3.9 + - name: Setup Rust toolchain + uses: ./.github/actions/setup-builder + with: + rust-version: ${{ env.rust_msrv }} + - uses: PyO3/maturin-action@v1 + with: + target: ${{ matrix.target }} + manylinux: ${{ matrix.manylinux || 'auto' }} + working-directory: "bindings/python" + command: build + args: --release -o dist + - name: Upload wheels + uses: actions/upload-artifact@v4 + with: + name: wheels-${{ matrix.os }}-${{ matrix.target }} + path: bindings/python/dist + + testpypi-publish: + needs: [ sdist, wheels ] + runs-on: ubuntu-latest + + environment: + name: testpypi + url: https://test.pypi.org/p/pyiceberg_core + + permissions: + id-token: write # IMPORTANT: mandatory for trusted publishing + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + pattern: wheels-* + merge-multiple: true + path: bindings/python/dist + - name: List downloaded artifacts + run: ls -R bindings/python/dist + - name: Publish to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ + skip-existing: true + packages-dir: bindings/python/dist