| # 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. |
| |
| # Publish paimon and paimon-datafusion crates to crates.io. |
| # |
| # Trigger: push a version tag (e.g. v0.1.0, v0.1.0-rc1). |
| # Pre-release tags (containing '-') only run dry-run checks without publishing. |
| # |
| # Token auth: add secret CARGO_REGISTRY_TOKEN for crates.io publishing. |
| |
| name: Release Rust |
| |
| on: |
| push: |
| tags: |
| - "v[0-9]+.[0-9]+.[0-9]+" |
| - "v[0-9]+.[0-9]+.[0-9]+-rc[0-9]+" |
| workflow_dispatch: |
| |
| jobs: |
| publish: |
| runs-on: ubuntu-latest |
| permissions: |
| contents: read |
| strategy: |
| # Publish crates sequentially to respect dependency order |
| max-parallel: 1 |
| matrix: |
| # Order matters: paimon must be published before paimon-datafusion |
| package: |
| - paimon |
| - paimon-datafusion |
| steps: |
| - uses: actions/checkout@v7 |
| |
| - name: Setup Rust toolchain |
| run: | |
| rustup update stable |
| rustup default stable |
| |
| - name: Dry run |
| # Only dry-run paimon since paimon-datafusion depends on it |
| if: matrix.package == 'paimon' |
| run: cargo publish -p ${{ matrix.package }} --all-features --dry-run |
| |
| - name: Publish ${{ matrix.package }} to crates.io |
| if: startsWith(github.ref, 'refs/tags/') && !contains(github.ref, '-') |
| run: cargo publish -p ${{ matrix.package }} --all-features |
| env: |
| CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} |
| |
| - name: Wait for crates.io to update |
| if: startsWith(github.ref, 'refs/tags/') && !contains(github.ref, '-') && matrix.package == 'paimon' |
| run: | |
| VERSION=${GITHUB_REF_NAME#v} |
| for i in {1..10}; do |
| CURRENT=$(curl -s https://crates.io/api/v1/crates/paimon | jq -r '.crate.max_version') |
| [ "$CURRENT" = "$VERSION" ] && echo "✅ paimon $VERSION available" && exit 0 |
| echo "Waiting for $VERSION (currently $CURRENT)... $i/10" |
| sleep 30 |
| done |