| # 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: Release Java Binding |
| |
| on: |
| push: |
| tags: |
| # Staging JARs on Apache Nexus repository for RCs. Read more on |
| # https://opendal.apache.org/community/committers/release/#release-maven-artifacts |
| - "v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+" |
| pull_request: |
| branches: |
| - main |
| paths: |
| - ".github/workflows/release_java.yml" |
| - "bindings/java/tools/build.py" |
| workflow_dispatch: |
| |
| env: |
| CARGO_BUILD_ENABLE_ZIGBUILD: "true" |
| |
| jobs: |
| stage-snapshot: |
| runs-on: ${{ matrix.os }} |
| strategy: |
| matrix: |
| include: |
| - os: ubuntu-latest |
| classifier: linux-x86_64 |
| - os: ubuntu-latest |
| classifier: linux-x86_64-musl |
| - os: ubuntu-24.04-arm |
| classifier: linux-aarch_64 |
| - os: ubuntu-24.04-arm |
| classifier: linux-aarch_64-musl |
| - os: windows-latest |
| classifier: windows-x86_64 |
| - os: macos-latest |
| classifier: osx-x86_64 |
| - os: macos-latest |
| classifier: osx-aarch_64 |
| steps: |
| - uses: actions/checkout@v7 |
| - name: Set up JDK 8 |
| uses: actions/setup-java@v5 |
| with: |
| distribution: zulu |
| java-version: "8" |
| cache: "maven" |
| server-id: apache.releases.https |
| server-username: MAVEN_USERNAME |
| server-password: MAVEN_CENTRAL_TOKEN |
| gpg-private-key: ${{ secrets.GPG_SECRET_KEY }} |
| gpg-passphrase: MAVEN_GPG_PASSPHRASE |
| - uses: actions/setup-python@v6 |
| with: |
| python-version: "3.11" |
| - name: Setup Rust toolchain |
| uses: ./.github/actions/setup |
| with: |
| need-protoc: true |
| github-token: ${{ secrets.GITHUB_TOKEN }} |
| |
| - name: Setup linux for zigbuild |
| if: ${{ contains(matrix.os, 'ubuntu') }} |
| run: pip install cargo-zigbuild |
| |
| - name: Build linux musl JNI library in Alpine |
| if: ${{ contains(matrix.os, 'ubuntu') && contains(matrix.classifier, 'musl') }} |
| shell: bash |
| run: | |
| set -euo pipefail |
| HOST_UID="$(id -u)" |
| HOST_GID="$(id -g)" |
| PLATFORM="linux/amd64" |
| if [[ "${{ matrix.classifier }}" == *"aarch_64"* ]]; then |
| PLATFORM="linux/arm64" |
| fi |
| |
| docker run --rm \ |
| --platform "$PLATFORM" \ |
| -e HOST_UID="$HOST_UID" \ |
| -e HOST_GID="$HOST_GID" \ |
| -v "$GITHUB_WORKSPACE":/work \ |
| -w /work/bindings/java \ |
| rust:1.91-alpine3.20 \ |
| sh -lc ' |
| set -eu |
| apk add --no-cache python3 build-base cmake pkgconfig git protobuf sqlite-dev zlib-dev |
| export PATH=/usr/local/cargo/bin:$PATH |
| |
| python3 tools/build.py \ |
| --classifier "${{ matrix.classifier }}" \ |
| --profile release \ |
| --enable-zigbuild false |
| |
| chown -R "$HOST_UID:$HOST_GID" /work/bindings/java/target |
| ' |
| |
| - name: Local staging |
| working-directory: bindings/java |
| shell: bash |
| run: | |
| EXTRA_MVN_ARGS="" |
| if [[ "${{ matrix.classifier }}" == *"musl" ]]; then |
| EXTRA_MVN_ARGS="-Dexec.skip=true" |
| fi |
| |
| MVN_GOALS="package verify" |
| if [[ "${{ github.event_name }}" != "pull_request" ]]; then |
| MVN_GOALS="$MVN_GOALS org.sonatype.plugins:nexus-staging-maven-plugin:deploy" |
| EXTRA_MVN_ARGS="$EXTRA_MVN_ARGS \ |
| -DaltStagingDirectory=local-staging \ |
| -DskipRemoteStaging=true \ |
| -DserverId=apache.releases.https \ |
| -DnexusUrl=https://repository.apache.org" |
| fi |
| |
| ./mvnw -Papache-release $MVN_GOALS \ |
| -DskipTests=true \ |
| -Djni.classifier=${{ matrix.classifier }} \ |
| -Dcargo-build.profile=release \ |
| -Dcargo-build.enableZigbuild=${{ env.CARGO_BUILD_ENABLE_ZIGBUILD }} \ |
| $EXTRA_MVN_ARGS |
| env: |
| MAVEN_USERNAME: ${{ secrets.NEXUS_STAGE_DEPLOYER_USER }} |
| MAVEN_CENTRAL_TOKEN: ${{ secrets.NEXUS_STAGE_DEPLOYER_PW }} |
| MAVEN_GPG_PASSPHRASE: "" |
| - name: Smoke linux musl JNI library in Alpine |
| if: ${{ contains(matrix.os, 'ubuntu') && contains(matrix.classifier, 'musl') }} |
| shell: bash |
| run: | |
| set -euo pipefail |
| PLATFORM="linux/amd64" |
| if [[ "${{ matrix.classifier }}" == *"aarch_64"* ]]; then |
| PLATFORM="linux/arm64" |
| fi |
| |
| docker run --rm \ |
| --platform "$PLATFORM" \ |
| -v "$GITHUB_WORKSPACE":/work \ |
| -w /work/bindings/java \ |
| alpine:3.20 \ |
| sh -lc ' |
| set -eu |
| apk add --no-cache openjdk17-jdk libgcc |
| BASE_JAR="$(find target -maxdepth 1 -name "opendal-*.jar" ! -name "*-linux-*.jar" ! -name "*-sources.jar" ! -name "*-javadoc.jar" | head -n 1)" |
| NATIVE_JAR="$(find target -maxdepth 1 -name "opendal-*-${{ matrix.classifier }}.jar" | head -n 1)" |
| test -n "$BASE_JAR" |
| test -n "$NATIVE_JAR" |
| |
| { |
| echo "import org.apache.opendal.NativeLibrary;" |
| echo "public class OpenDALSmoke {" |
| echo " public static void main(String[] args) {" |
| echo " NativeLibrary.loadLibrary();" |
| echo " }" |
| echo "}" |
| } > /tmp/OpenDALSmoke.java |
| |
| java -cp "$BASE_JAR:$NATIVE_JAR" /tmp/OpenDALSmoke.java |
| ' |
| - name: Upload local staging directory |
| if: ${{ github.event_name != 'pull_request' }} |
| uses: actions/upload-artifact@v7 |
| with: |
| name: ${{ matrix.classifier }}-local-staging |
| path: bindings/java/local-staging |
| if-no-files-found: error |
| include-hidden-files: true |
| |
| deploy-staged-snapshots: |
| if: ${{ github.event_name != 'pull_request' }} |
| runs-on: ubuntu-latest |
| needs: [stage-snapshot] |
| steps: |
| - uses: actions/checkout@v7 |
| with: |
| repository: apache/opendal |
| ref: ${{ github.ref }} |
| - name: Set up JDK 8 |
| uses: actions/setup-java@v5 |
| with: |
| distribution: zulu |
| java-version: "8" |
| cache: "maven" |
| server-id: apache.releases.https |
| server-username: MAVEN_USERNAME |
| server-password: MAVEN_CENTRAL_TOKEN |
| gpg-private-key: ${{ secrets.GPG_SECRET_KEY }} |
| gpg-passphrase: MAVEN_GPG_PASSPHRASE |
| |
| - name: Prepare environment variables |
| run: echo "LOCAL_STAGING_DIR=$HOME/local-staging" >> $GITHUB_ENV |
| |
| - name: Download windows staging directory |
| uses: actions/download-artifact@v8 |
| with: |
| name: windows-x86_64-local-staging |
| path: ~/windows-x86_64-local-staging |
| - name: Download linux x86_64 staging directory |
| uses: actions/download-artifact@v8 |
| with: |
| name: linux-x86_64-local-staging |
| path: ~/linux-x86_64-local-staging |
| - name: Download linux x86_64 (musl) staging directory |
| uses: actions/download-artifact@v8 |
| with: |
| name: linux-x86_64-musl-local-staging |
| path: ~/linux-x86_64-musl-local-staging |
| - name: Download linux aarch_64 staging directory |
| uses: actions/download-artifact@v8 |
| with: |
| name: linux-aarch_64-local-staging |
| path: ~/linux-aarch_64-local-staging |
| - name: Download linux aarch_64 (musl) staging directory |
| uses: actions/download-artifact@v8 |
| with: |
| name: linux-aarch_64-musl-local-staging |
| path: ~/linux-aarch_64-musl-local-staging |
| - name: Download darwin staging directory |
| uses: actions/download-artifact@v8 |
| with: |
| name: osx-x86_64-local-staging |
| path: ~/osx-x86_64-local-staging |
| - name: Download darwin (aarch64) staging directory |
| uses: actions/download-artifact@v8 |
| with: |
| name: osx-aarch_64-local-staging |
| path: ~/osx-aarch_64-local-staging |
| |
| - uses: actions/checkout@v7 |
| with: |
| path: ci-opendal |
| - name: Merge staging repositories |
| working-directory: ci-opendal |
| run: | |
| python ./scripts/merge_local_staging.py $LOCAL_STAGING_DIR/staging \ |
| ~/windows-x86_64-local-staging/staging \ |
| ~/linux-x86_64-local-staging/staging \ |
| ~/linux-x86_64-musl-local-staging/staging \ |
| ~/linux-aarch_64-local-staging/staging \ |
| ~/linux-aarch_64-musl-local-staging/staging \ |
| ~/osx-x86_64-local-staging/staging \ |
| ~/osx-aarch_64-local-staging/staging |
| |
| - name: Deploy local staged artifacts |
| if: ${{ github.event_name != 'pull_request' }} |
| working-directory: bindings/java |
| run: | |
| ./mvnw org.sonatype.plugins:nexus-staging-maven-plugin:deploy-staged \ |
| -DaltStagingDirectory=$LOCAL_STAGING_DIR \ |
| -DserverId=apache.releases.https \ |
| -DnexusUrl=https://repository.apache.org |
| env: |
| MAVEN_USERNAME: ${{ secrets.NEXUS_STAGE_DEPLOYER_USER }} |
| MAVEN_CENTRAL_TOKEN: ${{ secrets.NEXUS_STAGE_DEPLOYER_PW }} |
| MAVEN_GPG_PASSPHRASE: "" |