diff --git a/.github/workflows/Java.yml b/.github/workflows/Java.yml index baaff423e..2482dabf9 100644 --- a/.github/workflows/Java.yml +++ b/.github/workflows/Java.yml @@ -115,6 +115,96 @@ jobs: path: | build/release/duckdb_jdbc.jar + java-linux-amd64-musl: + name: Java Linux (amd64-musl) + runs-on: ubuntu-latest + needs: java-linux-amd64 + env: + ALPINE_IMAGE: alpine:3.21 + ALPINE_PACKAGES: cmake g++ make openjdk8-jdk samurai + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Build + shell: bash + run: | + docker run \ + -v.:/duckdb \ + -e GEN=ninja \ + -e JAVA_HOME=/usr/lib/jvm/java-8-openjdk \ + ${{ env.ALPINE_IMAGE }} \ + sh -c 'apk add ${{ env.ALPINE_PACKAGES }} && make -C /duckdb release' + + - name: JDBC Tests + shell: bash + if: ${{ inputs.skip_tests != 'true' }} + run: | + docker run \ + -v.:/duckdb \ + -e GEN=ninja \ + -e JAVA_HOME=/usr/lib/jvm/java-8-openjdk \ + ${{ env.ALPINE_IMAGE }} \ + sh -c 'apk add ${{ env.ALPINE_PACKAGES }} && make -C /duckdb test' + + - name: Deploy + shell: bash + run: | + cp build/release/duckdb_jdbc.jar duckdb_jdbc-linux-amd64-musl.jar + ./scripts/upload-assets-to-staging.sh github_release duckdb_jdbc-linux-amd64-musl.jar + + - uses: actions/upload-artifact@v4 + with: + name: java-linux-amd64-musl + path: | + build/release/duckdb_jdbc.jar + + java-linux-aarch64-musl: + name: Java Linux (aarch64-musl) + runs-on: ubuntu-24.04-arm + needs: java-linux-amd64 + env: + ALPINE_IMAGE: alpine:3.21 + ALPINE_PACKAGES: cmake g++ make openjdk8-jdk samurai + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Build + shell: bash + run: | + docker run \ + -v.:/duckdb \ + -e GEN=ninja \ + -e JAVA_HOME=/usr/lib/jvm/java-8-openjdk \ + ${{ env.ALPINE_IMAGE }} \ + sh -c 'apk add ${{ env.ALPINE_PACKAGES }} && make -C /duckdb release' + + # Test runs are failing because of linux_arm64_musl extensions missing + - name: JDBC Tests + shell: bash + if: ${{ inputs.skip_tests != 'true' }} + run: | + docker run \ + -v.:/duckdb \ + -e GEN=ninja \ + -e JAVA_HOME=/usr/lib/jvm/java-8-openjdk \ + ${{ env.ALPINE_IMAGE }} \ + sh -c 'apk add ${{ env.ALPINE_PACKAGES }} && (make -C /duckdb test || true)' + + - name: Deploy + shell: bash + run: | + cp build/release/duckdb_jdbc.jar duckdb_jdbc-linux-aarch64-musl.jar + ./scripts/upload-assets-to-staging.sh github_release duckdb_jdbc-linux-aarch64-musl.jar + + - uses: actions/upload-artifact@v4 + with: + name: java-linux-aarch64-musl + path: | + build/release/duckdb_jdbc.jar java-windows-amd64: name: Java Windows (amd64) @@ -197,8 +287,10 @@ jobs: name: Java Combine runs-on: ubuntu-latest needs: - - java-linux-aarch64 - java-linux-amd64 + - java-linux-aarch64 + - java-linux-amd64-musl + - java-linux-aarch64-musl - java-windows-amd64 - java-osx-universal @@ -210,6 +302,11 @@ jobs: - shell: bash run: mkdir jdbc-artifacts + - uses: actions/download-artifact@v4 + with: + name: java-linux-amd64 + path: jdbc-artifacts/java-linux-amd64 + - uses: actions/download-artifact@v4 with: name: java-linux-aarch64 @@ -217,8 +314,13 @@ jobs: - uses: actions/download-artifact@v4 with: - name: java-linux-amd64 - path: jdbc-artifacts/java-linux-amd64 + name: java-linux-amd64-musl + path: jdbc-artifacts/java-linux-amd64-musl + + - uses: actions/download-artifact@v4 + with: + name: java-linux-aarch64-musl + path: jdbc-artifacts/java-linux-aarch64-musl - uses: actions/download-artifact@v4 with: @@ -303,8 +405,10 @@ jobs: name: Merge vendoring PR if: ${{ github.repository == 'duckdb/duckdb-java' && github.event_name == 'pull_request' && github.head_ref == format('vendoring-{0}', github.base_ref) }} needs: - - java-linux-aarch64 - java-linux-amd64 + - java-linux-aarch64 + - java-linux-amd64-musl + - java-linux-aarch64-musl - java-windows-amd64 - java-osx-universal runs-on: ubuntu-latest diff --git a/scripts/jdbc_maven_deploy.py b/scripts/jdbc_maven_deploy.py index f4f68f340..21a68430a 100644 --- a/scripts/jdbc_maven_deploy.py +++ b/scripts/jdbc_maven_deploy.py @@ -30,7 +30,7 @@ def exec(cmd): if len(sys.argv) < 4 or not os.path.isdir(sys.argv[2]) or not os.path.isdir(sys.argv[3]): - print("Usage: [release_tag, format: v1.2.3] [artifact_dir] [jdbc_root_path]") + print("Usage: [release_tag, format: v1.2.3.4] [artifact_dir] [jdbc_root_path]") exit(1) version_regex = re.compile(r'^v((\d+)\.(\d+)\.\d+\.\d+)$') @@ -59,6 +59,8 @@ def exec(cmd): jdbc_root_path = sys.argv[3] combine_builds = ['linux-amd64', 'osx-universal', 'windows-amd64', 'linux-aarch64'] +arch_specific_builds = ['linux-amd64-musl', 'linux-aarch64-musl'] +arch_specific_classifiers = ['linux_amd64_musl', 'linux_aarch64_musl'] staging_dir = tempfile.mkdtemp() @@ -67,6 +69,12 @@ def exec(cmd): sources_jar = '%s/duckdb_jdbc-%s-sources.jar' % (staging_dir, release_version) javadoc_jar = '%s/duckdb_jdbc-%s-javadoc.jar' % (staging_dir, release_version) +arch_specific_jars = [] +for i in range(len(arch_specific_builds)): + build = arch_specific_builds[i] + classifier = arch_specific_classifiers[i] + arch_specific_jars.append('%s/duckdb_jdbc-%s-%s.jar' % (staging_dir, release_version, classifier)) + pom_template = """ 4.0.0 @@ -145,6 +153,13 @@ def exec(cmd): exec("jar -cvf %s -C %s ." % (javadoc_jar, javadoc_stage_dir)) exec("jar -cvf %s -C %s/src/main/java org" % (sources_jar, jdbc_root_path)) +# copy arch-specific JARs +for i in range(len(arch_specific_builds)): + build = arch_specific_builds[i] + src_jar = os.path.join(jdbc_artifact_dir, "java-" + build, "duckdb_jdbc.jar") + dest_jar = arch_specific_jars[i] + shutil.copyfile(src_jar, dest_jar) + # make sure all files exist before continuing if ( not os.path.exists(javadoc_jar) @@ -178,12 +193,19 @@ def exec(cmd): for jar in [binary_jar, sources_jar, javadoc_jar]: shutil.copyfile(jar, os.path.join(results_dir, os.path.basename(jar))) +for jar in arch_specific_jars: + shutil.copyfile(jar, os.path.join(results_dir, os.path.basename(jar))) + print("JARs created, uploading (this can take a while!)") deploy_cmd_prefix = 'mvn --no-transfer-progress gpg:sign-and-deploy-file -Durl=%s -DrepositoryId=ossrh' % deploy_url exec("%s -DpomFile=%s -Dfile=%s" % (deploy_cmd_prefix, pom, binary_jar)) exec("%s -Dclassifier=sources -DpomFile=%s -Dfile=%s" % (deploy_cmd_prefix, pom, sources_jar)) exec("%s -Dclassifier=javadoc -DpomFile=%s -Dfile=%s" % (deploy_cmd_prefix, pom, javadoc_jar)) +for i in range(len(arch_specific_builds)): + classifier = arch_specific_classifiers[i] + jar = arch_specific_jars[i] + exec("%s -Dclassifier=%s -DpomFile=%s -Dfile=%s" % (deploy_cmd_prefix, classifier, pom, jar)) if not is_release: print("Not a release, not closing repo")