| # 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: Docs |
| |
| on: |
| push: |
| branches: |
| - main |
| tags: |
| - "v*" |
| pull_request: |
| branches: |
| - main |
| paths: |
| - "core/**" |
| - "bindings/**" |
| - "integrations/**" |
| - "website/**" |
| - ".github/workflows/docs.yml" |
| |
| concurrency: |
| group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} |
| cancel-in-progress: true |
| |
| env: |
| # This is the toolchain used by docs.rs |
| # |
| # Check this page for updating: https://docs.rs/crate/opendal/0.54.1/builds |
| RUST_DOC_TOOLCHAIN: nightly-2025-10-12 |
| # Enable cfg docsrs to make sure docs are built. |
| RUSTDOCFLAGS: "--cfg docsrs" |
| |
| jobs: |
| build-rust-doc: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - name: Setup Rust toolchain |
| uses: ./.github/actions/setup |
| with: |
| need-rocksdb: true |
| need-protoc: true |
| github-token: ${{ secrets.GITHUB_TOKEN }} |
| |
| - name: Setup Rust Nightly |
| run: | |
| rustup toolchain install ${{ env.RUST_DOC_TOOLCHAIN }} |
| |
| - uses: actions/setup-java@v5 |
| with: |
| distribution: zulu |
| java-version: 25 |
| |
| - name: Build OpenDAL doc |
| working-directory: core |
| run: cargo +${{ env.RUST_DOC_TOOLCHAIN }} doc --lib --no-deps --all-features |
| env: |
| LD_LIBRARY_PATH: ${{ env.JAVA_HOME }}/lib/server:${{ env.LD_LIBRARY_PATH }} |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: rust-docs |
| path: ./core/target/doc |
| |
| build-java-doc: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - uses: actions/setup-java@v5 |
| with: |
| distribution: zulu |
| java-version: 25 |
| |
| - name: Build and test |
| working-directory: bindings/java |
| run: ./mvnw javadoc:javadoc |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: java-docs |
| path: ./bindings/java/target/site/apidocs |
| |
| build-nodejs-doc: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - uses: pnpm/action-setup@v4 |
| with: |
| version: 8 |
| run_install: false |
| |
| - uses: actions/setup-node@v6 |
| with: |
| node-version: "20" |
| cache: pnpm |
| cache-dependency-path: "bindings/nodejs/pnpm-lock.yaml" |
| |
| - name: Install dependencies |
| working-directory: bindings/nodejs |
| run: pnpm install --frozen-lockfile |
| |
| - name: Build docs theme |
| working-directory: bindings/nodejs |
| run: pnpm run build:theme |
| |
| - name: Build bindings/nodejs Docs |
| working-directory: bindings/nodejs |
| run: pnpm run docs |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: nodejs-docs |
| path: ./bindings/nodejs/docs |
| |
| build-python-doc: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - uses: actions/setup-python@v6 |
| with: |
| python-version: "3.11" |
| - name: Setup Rust toolchain |
| uses: ./.github/actions/setup |
| |
| - name: Setup uv |
| uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 |
| with: |
| enable-cache: true |
| |
| - name: Build and install dependencies |
| working-directory: bindings/python |
| run: | |
| uv sync --group docs |
| |
| - name: Build Docs |
| working-directory: bindings/python |
| run: uv run mkdocs build |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: python-docs |
| path: ./bindings/python/site |
| |
| build-ruby-doc: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - uses: ruby/setup-ruby@v1 |
| with: |
| working-directory: bindings/ruby |
| bundler-cache: true |
| |
| - name: Setup Rust toolchain |
| uses: ./.github/actions/setup |
| |
| - name: Setup Rust Nightly |
| run: | |
| rustup toolchain install ${{ env.RUST_DOC_TOOLCHAIN }} |
| |
| - name: Build Docs |
| working-directory: bindings/ruby |
| run: bundle exec rake doc |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: ruby-docs |
| path: ./bindings/ruby/doc |
| |
| build-c-doc: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - name: Setup Rust toolchain |
| uses: ./.github/actions/setup |
| with: |
| github-token: ${{ secrets.GITHUB_TOKEN }} |
| |
| - name: Setup doxygen |
| run: sudo apt-get install doxygen |
| |
| - name: Build Docs |
| working-directory: bindings/c |
| run: make doc |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: C-docs |
| path: ./bindings/c/docs/doxygen/html |
| |
| build-lua-doc: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - name: Setup lua-ldoc |
| run: sudo apt-get install lua-ldoc |
| |
| - name: Build Docs |
| working-directory: "bindings/lua" |
| run: ldoc ./src |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: lua-docs |
| path: ./bindings/lua/doc/ |
| |
| build-haskell-doc: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - name: Setup Haskell toolchain (ghc-9.2.8) |
| run: | |
| sudo apt-get update |
| sudo apt-get install -y alex happy |
| curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh |
| ghcup install ghc 9.2.8 --set |
| ghcup install cabal --set |
| cabal update |
| |
| - name: Setup cache |
| uses: actions/cache@v5 |
| env: |
| cache-name: cache-cabal |
| with: |
| path: ~/.cabal |
| key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/*.cabal') }}-${{ hashFiles('**/cabal.project') }} |
| restore-keys: | |
| ${{ runner.os }}-build-${{ env.cache-name }}- |
| ${{ runner.os }}-build- |
| ${{ runner.os }}- |
| |
| - name: Setup Rust toolchain |
| uses: ./.github/actions/setup |
| |
| - name: Build Docs |
| working-directory: "bindings/haskell" |
| run: | |
| cabal haddock --haddock-html --haddock-quickjump --haddock-hyperlink-source -j |
| find dist-newstyle -path '**/build/**/doc' -exec cp -r {}/html/opendal/ doc \; |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: haskell-docs |
| path: ./bindings/haskell/doc/ |
| |
| build-cpp-doc: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - name: Setup Rust toolchain |
| uses: ./.github/actions/setup |
| with: |
| github-token: ${{ secrets.GITHUB_TOKEN }} |
| |
| - name: Install dependencies |
| run: | |
| sudo apt-get install doxygen graphviz ninja-build |
| |
| - name: Build Cpp docs |
| working-directory: "bindings/cpp" |
| run: | |
| mkdir build |
| cd build |
| cmake -GNinja -DOPENDAL_DOCS_ONLY=ON .. |
| ninja docs |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: cpp-docs |
| path: ./bindings/cpp/build/docs_doxygen/html |
| |
| build-ocaml-doc: |
| runs-on: ubuntu-22.04 |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - name: Cache OPAM dependencies |
| uses: actions/cache@v5 |
| with: |
| path: ~/.opam |
| key: ${{ runner.os }}-opam-doc-${{ hashFiles('bindings/ocaml/dune-project') }} |
| restore-keys: | |
| ${{ runner.os }}-opam-doc- |
| ${{ runner.os }}-opam- |
| |
| - name: Cache Dune build artifacts |
| uses: actions/cache@v5 |
| with: |
| path: bindings/ocaml/_build |
| key: ${{ runner.os }}-dune-doc-${{ hashFiles('bindings/ocaml/**/*.{ml,mli,opam}') }} |
| restore-keys: | |
| ${{ runner.os }}-dune-doc- |
| ${{ runner.os }}-dune- |
| |
| - name: Setup Rust toolchain |
| uses: ./.github/actions/setup |
| with: |
| github-token: ${{ secrets.GITHUB_TOKEN }} |
| |
| - name: Setup OCaml toolchain |
| uses: ./.github/actions/setup-ocaml |
| |
| - name: Build OCaml docs |
| working-directory: "bindings/ocaml" |
| run: | |
| opam install -y dune odoc |
| eval $(opam env) |
| dune build @doc |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: ocaml-docs |
| path: ./bindings/ocaml/_build/default/_doc/_html |
| |
| build-object-store-opendal-doc: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - name: Setup Rust toolchain |
| uses: ./.github/actions/setup |
| |
| - name: Setup Rust Nightly |
| run: | |
| rustup toolchain install ${{ env.RUST_DOC_TOOLCHAIN }} |
| |
| - name: Build object-store-opendal doc |
| working-directory: "integrations/object_store" |
| run: cargo +${{ env.RUST_DOC_TOOLCHAIN }} doc --lib --no-deps --all-features |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: object-store-opendal-docs |
| path: ./integrations/object_store/target/doc |
| |
| build-dav-server-opendalfs-doc: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - name: Setup Rust toolchain |
| uses: ./.github/actions/setup |
| |
| # Revert to nightly after https://github.com/apache/opendal/issues/4161 addressed |
| - name: Setup Rust Nightly |
| run: | |
| rustup toolchain install ${{ env.RUST_DOC_TOOLCHAIN }} |
| |
| - name: Build dav-server-opendalfs doc |
| working-directory: "integrations/dav-server" |
| run: cargo +${{ env.RUST_DOC_TOOLCHAIN }} doc --lib --no-deps --all-features |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: dav-server-opendalfs-docs |
| path: ./integrations/dav-server/target/doc |
| |
| build-unftp-sbe-opendal-doc: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - name: Setup Rust toolchain |
| uses: ./.github/actions/setup |
| |
| - name: Setup Rust Nightly |
| run: | |
| rustup toolchain install ${{ env.RUST_DOC_TOOLCHAIN }} |
| |
| - name: Build unftp-sbe-opendal doc |
| working-directory: "integrations/unftp-sbe" |
| run: cargo +${{ env.RUST_DOC_TOOLCHAIN }} doc --lib --no-deps --all-features |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: unftp-sbe-opendal-docs |
| path: ./integrations/unftp-sbe/target/doc |
| |
| build-parquet-opendal-doc: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@v6 |
| |
| - name: Setup Rust toolchain |
| uses: ./.github/actions/setup |
| |
| - name: Setup Rust Nightly |
| run: | |
| rustup toolchain install ${{ env.RUST_DOC_TOOLCHAIN }} |
| |
| - name: Build parquet-opendal doc |
| working-directory: "integrations/parquet" |
| run: cargo +${{ env.RUST_DOC_TOOLCHAIN }} doc --lib --no-deps --all-features |
| |
| - name: Upload docs |
| uses: actions/upload-artifact@v6 |
| with: |
| name: object-parquet-docs |
| path: ./integrations/parquet/target/doc |
| |
| build-website: |
| runs-on: ubuntu-latest |
| permissions: |
| contents: write |
| needs: |
| - build-rust-doc |
| - build-java-doc |
| - build-nodejs-doc |
| - build-python-doc |
| - build-ruby-doc |
| - build-c-doc |
| - build-lua-doc |
| - build-haskell-doc |
| - build-cpp-doc |
| - build-ocaml-doc |
| - build-object-store-opendal-doc |
| - build-dav-server-opendalfs-doc |
| - build-unftp-sbe-opendal-doc |
| - build-parquet-opendal-doc |
| |
| steps: |
| - uses: actions/checkout@v6 |
| with: |
| fetch-depth: 0 |
| |
| - uses: pnpm/action-setup@v4 |
| with: |
| version: 8 |
| run_install: false |
| |
| - uses: actions/setup-node@v6 |
| with: |
| node-version: "20" |
| cache: pnpm |
| cache-dependency-path: "website/pnpm-lock.yaml" |
| |
| - name: Corepack |
| working-directory: website |
| run: npm i -g --force corepack && corepack enable |
| |
| - name: Download rust docs |
| uses: actions/download-artifact@v7 |
| with: |
| name: rust-docs |
| path: ./website/static/docs/rust |
| |
| - name: Download nodejs docs |
| uses: actions/download-artifact@v7 |
| with: |
| name: nodejs-docs |
| path: ./website/static/docs/nodejs |
| |
| - name: Download python docs |
| uses: actions/download-artifact@v7 |
| with: |
| name: python-docs |
| path: ./website/static/docs/python |
| |
| - name: Download ruby docs |
| uses: actions/download-artifact@v7 |
| with: |
| name: ruby-docs |
| path: ./website/static/docs/ruby |
| |
| - name: Download java docs |
| uses: actions/download-artifact@v7 |
| with: |
| name: java-docs |
| path: ./website/static/docs/java |
| |
| - name: Download C docs |
| uses: actions/download-artifact@v7 |
| with: |
| name: C-docs |
| path: ./website/static/docs/c |
| |
| - name: Download lua docs |
| uses: actions/download-artifact@v7 |
| with: |
| name: lua-docs |
| path: ./website/static/docs/lua |
| |
| - name: Download haskell docs |
| uses: actions/download-artifact@v7 |
| with: |
| name: haskell-docs |
| path: ./website/static/docs/haskell |
| |
| - name: Download cpp docs |
| uses: actions/download-artifact@v7 |
| with: |
| name: cpp-docs |
| path: ./website/static/docs/cpp |
| |
| - name: Download ocaml docs |
| uses: actions/download-artifact@v7 |
| with: |
| name: ocaml-docs |
| path: ./website/static/docs/ocaml |
| |
| - name: Download object-store-opendal docs |
| uses: actions/download-artifact@v7 |
| with: |
| name: object-store-opendal-docs |
| path: ./website/static/docs/object-store-opendal |
| |
| - name: Download dav-server-opendalfs docs |
| uses: actions/download-artifact@v7 |
| with: |
| name: dav-server-opendalfs-docs |
| path: ./website/static/docs/dav-server-opendalfs |
| |
| - name: Download unftp-sbe-opendal docs |
| uses: actions/download-artifact@v7 |
| with: |
| name: unftp-sbe-opendal-docs |
| path: ./website/static/docs/unftp-sbe-opendal |
| |
| - name: Install Dependencies |
| working-directory: website |
| run: pnpm install --frozen-lockfile |
| |
| - name: Build |
| working-directory: website |
| run: pnpm build |
| |
| - name: Copy asf file |
| run: cp .asf.yaml ./website/build/.asf.yaml |
| |
| - name: Deploy to gh-pages |
| uses: peaceiris/actions-gh-pages@v4.0.0 |
| if: ${{ (github.event_name == 'push' && github.ref_name == 'main') || (startsWith(github.ref, 'refs/tags/') && !contains(github.ref, 'rc')) }} |
| with: |
| github_token: ${{ secrets.GITHUB_TOKEN }} |
| publish_dir: website/build |
| publish_branch: gh-pages |
| # This allows us to make our publish branch with only the latest commit. |
| force_orphan: true |
| |
| - name: Clear build |
| run: rm -rf ./website/build |
| |
| - name: Build for staging version |
| if: ${{ startsWith(github.ref, 'refs/tags/') && contains(github.ref, 'rc') }} |
| working-directory: website |
| run: pnpm build |
| env: |
| OPENDAL_WEBSITE_STAGING: true |
| |
| - name: Copy asf file |
| if: ${{ startsWith(github.ref, 'refs/tags/') && contains(github.ref, 'rc') }} |
| run: cp .asf.yaml ./website/build/.asf.yaml |
| |
| - name: Prepare staged name |
| if: ${{ startsWith(github.ref, 'refs/tags/') && contains(github.ref, 'rc') }} |
| run: | |
| export OPENDAL_WEBSITE_STAGED_NAME=$(echo ${{ github.ref_name }} | sed 's/[._]/-/g') |
| echo OPENDAL_WEBSITE_STAGED_NAME=${OPENDAL_WEBSITE_STAGED_NAME} |
| echo OPENDAL_WEBSITE_STAGED_NAME=${OPENDAL_WEBSITE_STAGED_NAME} >> $GITHUB_ENV |
| |
| - name: Deploy to staged |
| uses: peaceiris/actions-gh-pages@v4.0.0 |
| if: ${{ startsWith(github.ref, 'refs/tags/') && contains(github.ref, 'rc') }} |
| with: |
| github_token: ${{ secrets.GITHUB_TOKEN }} |
| publish_dir: website/build |
| publish_branch: site/${{ env.OPENDAL_WEBSITE_STAGED_NAME }}-staging |
| |
| - name: Clear build |
| if: ${{ startsWith(github.ref, 'refs/tags/') && contains(github.ref, 'rc') }} |
| run: rm -rf ./website/build |
| |
| - name: Build for nightlies with tagged version |
| working-directory: website |
| run: pnpm build |
| env: |
| # Keep this same with the remote_path below |
| OPENDAL_WEBSITE_BASE_URL: /opendal/opendal-docs-release-${{ github.ref_name }}/ |
| OPENDAL_WEBSITE_NOT_LATEST: true |
| |
| - name: Deploy to nightlies for tagged version |
| if: ${{ startsWith(github.ref, 'refs/tags/') && !contains(github.ref, 'rc') }} |
| shell: bash |
| env: |
| NIGHTLIES_RSYNC_HOST: ${{ secrets.NIGHTLIES_RSYNC_HOST }} |
| NIGHTLIES_RSYNC_KEY: ${{ secrets.NIGHTLIES_RSYNC_KEY }} |
| NIGHTLIES_RSYNC_PATH: ${{ secrets.NIGHTLIES_RSYNC_PATH }} |
| NIGHTLIES_RSYNC_PORT: ${{ secrets.NIGHTLIES_RSYNC_PORT }} |
| NIGHTLIES_RSYNC_USER: ${{ secrets.NIGHTLIES_RSYNC_USER }} |
| run: | |
| mkdir -p "${HOME}/.ssh" |
| printf '%s' "${NIGHTLIES_RSYNC_KEY}" > "${HOME}/.ssh/nightlies_rsync" |
| chmod 0600 "${HOME}/.ssh/nightlies_rsync" |
| rsync -avzr \ |
| -e "ssh -i ${HOME}/.ssh/nightlies_rsync -p ${NIGHTLIES_RSYNC_PORT} -o StrictHostKeyChecking=no" \ |
| website/build/ \ |
| "${NIGHTLIES_RSYNC_USER}@${NIGHTLIES_RSYNC_HOST}:${NIGHTLIES_RSYNC_PATH}/opendal/opendal-docs-release-${{ github.ref_name }}/" |
| |
| - name: Clear build |
| run: rm -rf ./website/build |
| |
| - name: Build for nightlies with stable version |
| working-directory: website |
| run: pnpm build |
| env: |
| OPENDAL_WEBSITE_BASE_URL: /opendal/opendal-docs-stable/ |
| |
| - name: Deploy to nightlies for stable version |
| if: ${{ startsWith(github.ref, 'refs/tags/') && !contains(github.ref, 'rc') }} |
| shell: bash |
| env: |
| NIGHTLIES_RSYNC_HOST: ${{ secrets.NIGHTLIES_RSYNC_HOST }} |
| NIGHTLIES_RSYNC_KEY: ${{ secrets.NIGHTLIES_RSYNC_KEY }} |
| NIGHTLIES_RSYNC_PATH: ${{ secrets.NIGHTLIES_RSYNC_PATH }} |
| NIGHTLIES_RSYNC_PORT: ${{ secrets.NIGHTLIES_RSYNC_PORT }} |
| NIGHTLIES_RSYNC_USER: ${{ secrets.NIGHTLIES_RSYNC_USER }} |
| run: | |
| mkdir -p "${HOME}/.ssh" |
| printf '%s' "${NIGHTLIES_RSYNC_KEY}" > "${HOME}/.ssh/nightlies_rsync" |
| chmod 0600 "${HOME}/.ssh/nightlies_rsync" |
| rsync -avzr --delete \ |
| -e "ssh -i ${HOME}/.ssh/nightlies_rsync -p ${NIGHTLIES_RSYNC_PORT} -o StrictHostKeyChecking=no" \ |
| website/build/ \ |
| "${NIGHTLIES_RSYNC_USER}@${NIGHTLIES_RSYNC_HOST}:${NIGHTLIES_RSYNC_PATH}/opendal/opendal-docs-stable/" |