diff --git a/.editorconfig b/.editorconfig index 77b65fb57d30..c14889663d5e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -38,13 +38,16 @@ indent_size = 2 [*.yml] indent_size = 2 +[*.toml] +indent_size = 2 + [*.json] indent_size = 2 -[*.{ts, tsx}] +[*.{ts,tsx}] indent_size = 2 -[*.{js, jsx}] +[*.{js,jsx}] indent_size = 2 [*.css] diff --git a/.github/workflows/bindings_java.yml b/.github/workflows/bindings_java.yml index f2584c837034..169b2935b2fe 100644 --- a/.github/workflows/bindings_java.yml +++ b/.github/workflows/bindings_java.yml @@ -57,7 +57,13 @@ jobs: run: ./mvnw spotless:check test: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + strategy: + matrix: + include: + - os: ubuntu-latest + - os: windows-latest + - os: macos-latest steps: - uses: actions/checkout@v3 - name: Set up JDK 8 @@ -66,8 +72,11 @@ jobs: distribution: 'temurin' java-version: '8' cache: 'maven' - - name: Set up protoc - run: sudo apt install -y protobuf-compiler + - name: Install Protoc + uses: arduino/setup-protoc@v2 + with: + version: "23.4" + repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Build and test working-directory: bindings/java # `install` is required to verify reproducible builds: diff --git a/.github/workflows/release_java.yml b/.github/workflows/release_java.yml new file mode 100644 index 000000000000..4b9223f6ca94 --- /dev/null +++ b/.github/workflows/release_java.yml @@ -0,0 +1,137 @@ +# 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: Bindings Java Release + +on: + push: + tags: + # Staging JARs on Apache Nexus repository for RCs. Read more on + # https://opendal.apache.org/docs/contributing/release#release-maven-artifacts + - 'v[0-9]+.[0-9]+.[0-9]+-rc[0-9]+' + workflow_dispatch: + +jobs: + stage-snapshot: + runs-on: ${{ matrix.os }} + strategy: + matrix: + include: + - os: ubuntu-latest + classifier: linux-x86_64 + - 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@v3 + - name: Set up JDK 8 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + 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@v4 + with: + python-version: '3.10' + - name: Install Protoc + uses: arduino/setup-protoc@v2 + with: + version: "23.4" + repo-token: ${{ secrets.GITHUB_TOKEN }} + - name: Local staging + working-directory: bindings/java + run: | + ./mvnw -Papache-release package verify org.sonatype.plugins:nexus-staging-maven-plugin:deploy "-Djni.classifier=${{ matrix.classifier }}" -DskipTests=true -DaltStagingDirectory=local-staging -DskipRemoteStaging=true "-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: "" + - name: Upload local staging directory + uses: actions/upload-artifact@v3 + with: + name: ${{ matrix.classifier }}-local-staging + path: bindings/java/local-staging + if-no-files-found: error + + deploy-staged-snapshots: + runs-on: ubuntu-latest + needs: [stage-snapshot] + steps: + - uses: actions/checkout@v3 + with: + repository: apache/incubator-opendal + ref: ${{ inputs.ref }} + - name: Set up JDK 8 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + 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@v3 + with: + name: windows-x86_64-local-staging + path: ~/windows-x86_64-local-staging + - name: Download linux staging directory + uses: actions/download-artifact@v3 + with: + name: linux-x86_64-local-staging + path: ~/linux-x86_64-local-staging + - name: Download darwin staging directory + uses: actions/download-artifact@v3 + with: + name: osx-x86_64-local-staging + path: ~/osx-x86_64-local-staging + - name: Download darwin (aarch64) staging directory + uses: actions/download-artifact@v3 + with: + name: osx-aarch_64-local-staging + path: ~/osx-aarch_64-local-staging + + - uses: actions/checkout@v3 + with: + path: ci-opendal + - name: Merge staging repositories + working-directory: ci-opendal + run: bash ./scripts/merge_local_staging.sh $LOCAL_STAGING_DIR/staging ~/windows-x86_64-local-staging/staging ~/linux-x86_64-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 -DskipStagingRepositoryClose=true -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: "" diff --git a/bindings/java/Cargo.toml b/bindings/java/Cargo.toml index 94a495675ee4..7d94cd71bdff 100644 --- a/bindings/java/Cargo.toml +++ b/bindings/java/Cargo.toml @@ -41,44 +41,52 @@ tokio = { version = "1.28.1", features = ["full"] } [dependencies.opendal] workspace = true features = [ - "services-azblob", - "services-azdfs", - "services-cacache", - "services-cos", - "services-dashmap", - "services-dropbox", - "services-etcd", - # FIXME this requires a preinstalled fdb library - # "services-foundationdb", - "services-fs", - "services-ftp", - "services-gcs", - "services-gdrive", - "services-ghac", - # FIXME how to support HDFS services in bindings? - # "services-hdfs", - "services-http", - "services-ipfs", - "services-memcached", - "services-memory", - "services-mini-moka", - "services-moka", - "services-obs", - "services-onedrive", - "services-oss", - "services-persy", - "services-postgresql", - "services-redb", - "services-redis", - "services-redis-rustls", - "services-rocksdb", - "services-s3", - "services-sftp", - "services-sled", - "services-supabase", - "services-tikv", - "services-vercel-artifacts", - "services-wasabi", - "services-webdav", - "services-webhdfs", + "services-azblob", + "services-azdfs", + "services-cacache", + "services-cos", + "services-dashmap", + "services-dropbox", + "services-etcd", + # FIXME this requires a preinstalled fdb library + # "services-foundationdb", + "services-fs", + "services-ftp", + "services-gcs", + "services-gdrive", + "services-ghac", + # FIXME how to support HDFS services in bindings? + # "services-hdfs", + "services-http", + "services-ipfs", + "services-memcached", + "services-memory", + "services-mini-moka", + "services-moka", + "services-obs", + "services-onedrive", + "services-oss", + "services-persy", + "services-postgresql", + "services-redb", + "services-redis", + "services-redis-rustls", + "services-rocksdb", + "services-s3", + "services-sled", + "services-supabase", + "services-tikv", + "services-vercel-artifacts", + "services-wasabi", + "services-webdav", + "services-webhdfs", +] + +# This is not optimal. See also the Cargo issue: +# https://github.com/rust-lang/cargo/issues/1197#issuecomment-1641086954 +[target.'cfg(unix)'.dependencies.opendal] +workspace = true +features = [ + # Depend on "openssh" which depends on "tokio-pipe" that is unavailable on Windows. + "services-sftp", ] diff --git a/licenserc.toml b/licenserc.toml index f4ea72855069..7d83bcc2db32 100644 --- a/licenserc.toml +++ b/licenserc.toml @@ -35,4 +35,7 @@ excludes = [ # Documents "**/*.md", "**/*.mdx", + + # Third-party source files + "scripts/merge_local_staging.sh", ] diff --git a/scripts/merge_local_staging.sh b/scripts/merge_local_staging.sh new file mode 100644 index 000000000000..d28445df307c --- /dev/null +++ b/scripts/merge_local_staging.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# ---------------------------------------------------------------------------- +# Copyright 2021 The Netty Project +# +# The Netty Project 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: +# +# https://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. +# ---------------------------------------------------------------------------- + +# This file is copied from +# https://github.com/netty/netty-tcnative/blob/67a73e0c/.github/scripts/merge_local_staging.sh + +set -e +if [ "$#" -lt 2 ]; then + echo "Expected target directory and at least one local staging directory" + exit 1 +fi +TARGET=$1 + +for ((i=2; i<=$#; i++)) +do + DIR="${!i}" + SUB_DIR=$(ls -d "${DIR}"/* | awk -F / '{print $NF}') + + if [ ! -d "${TARGET}/${SUB_DIR}" ] + then + mkdir -p "${TARGET}/${SUB_DIR}" + fi + cat "${DIR}"/"${SUB_DIR}"/.index >> "${TARGET}/${SUB_DIR}"/.index + cp -r "${DIR}"/"${SUB_DIR}"/* "${TARGET}/${SUB_DIR}"/ +done