Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 108 additions & 4 deletions .github/workflows/Java.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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

Expand All @@ -210,15 +302,25 @@ 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
path: jdbc-artifacts/java-linux-aarch64

- 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:
Expand Down Expand Up @@ -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
Expand Down
24 changes: 23 additions & 1 deletion scripts/jdbc_maven_deploy.py
Original file line number Diff line number Diff line change
Expand Up @@ -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+)$')
Expand Down Expand Up @@ -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()

Expand All @@ -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 = """
<project>
<modelVersion>4.0.0</modelVersion>
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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")
Expand Down