Skip to content

Commit 2007bd0

Browse files
staticlibshrl20
andcommitted
Add musl-libc experimental builds
This change adds experimental support for building JDBC driver with musl libc on x86_64 and aarch64 Linux. It is based on #120 PR. New artifacts are NOT combined into the unified JAR, instead they are published to Maven with custom classifiers `linux_amd64_musl` and `linux_aarch64_musl`. Co-authored-by: hrl20 <[email protected]>
1 parent b304de4 commit 2007bd0

File tree

2 files changed

+131
-5
lines changed

2 files changed

+131
-5
lines changed

.github/workflows/Java.yml

Lines changed: 108 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,96 @@ jobs:
115115
path: |
116116
build/release/duckdb_jdbc.jar
117117
118+
java-linux-amd64-musl:
119+
name: Java Linux (amd64-musl)
120+
runs-on: ubuntu-latest
121+
needs: java-linux-amd64
122+
env:
123+
ALPINE_IMAGE: alpine:3.21
124+
ALPINE_PACKAGES: cmake g++ make openjdk8-jdk samurai
125+
steps:
126+
- uses: actions/checkout@v4
127+
with:
128+
fetch-depth: 0
129+
130+
- name: Build
131+
shell: bash
132+
run: |
133+
docker run \
134+
-v.:/duckdb \
135+
-e GEN=ninja \
136+
-e JAVA_HOME=/usr/lib/jvm/java-8-openjdk \
137+
${{ env.ALPINE_IMAGE }} \
138+
sh -c 'apk add ${{ env.ALPINE_PACKAGES }} && make -C /duckdb release'
139+
140+
- name: JDBC Tests
141+
shell: bash
142+
if: ${{ inputs.skip_tests != 'true' }}
143+
run: |
144+
docker run \
145+
-v.:/duckdb \
146+
-e GEN=ninja \
147+
-e JAVA_HOME=/usr/lib/jvm/java-8-openjdk \
148+
${{ env.ALPINE_IMAGE }} \
149+
sh -c 'apk add ${{ env.ALPINE_PACKAGES }} && make -C /duckdb test'
150+
151+
- name: Deploy
152+
shell: bash
153+
run: |
154+
cp build/release/duckdb_jdbc.jar duckdb_jdbc-linux-amd64-musl.jar
155+
./scripts/upload-assets-to-staging.sh github_release duckdb_jdbc-linux-amd64-musl.jar
156+
157+
- uses: actions/upload-artifact@v4
158+
with:
159+
name: java-linux-amd64-musl
160+
path: |
161+
build/release/duckdb_jdbc.jar
162+
163+
java-linux-aarch64-musl:
164+
name: Java Linux (aarch64-musl)
165+
runs-on: ubuntu-24.04-arm
166+
needs: java-linux-amd64
167+
env:
168+
ALPINE_IMAGE: alpine:3.21
169+
ALPINE_PACKAGES: cmake g++ make openjdk8-jdk samurai
170+
steps:
171+
- uses: actions/checkout@v4
172+
with:
173+
fetch-depth: 0
174+
175+
- name: Build
176+
shell: bash
177+
run: |
178+
docker run \
179+
-v.:/duckdb \
180+
-e GEN=ninja \
181+
-e JAVA_HOME=/usr/lib/jvm/java-8-openjdk \
182+
${{ env.ALPINE_IMAGE }} \
183+
sh -c 'apk add ${{ env.ALPINE_PACKAGES }} && make -C /duckdb release'
184+
185+
# Test runs are failing because of linux_arm64_musl extensions missing
186+
- name: JDBC Tests
187+
shell: bash
188+
if: ${{ inputs.skip_tests != 'true' }}
189+
run: |
190+
docker run \
191+
-v.:/duckdb \
192+
-e GEN=ninja \
193+
-e JAVA_HOME=/usr/lib/jvm/java-8-openjdk \
194+
${{ env.ALPINE_IMAGE }} \
195+
sh -c 'apk add ${{ env.ALPINE_PACKAGES }} && (make -C /duckdb test || true)'
196+
197+
- name: Deploy
198+
shell: bash
199+
run: |
200+
cp build/release/duckdb_jdbc.jar duckdb_jdbc-linux-aarch64-musl.jar
201+
./scripts/upload-assets-to-staging.sh github_release duckdb_jdbc-linux-aarch64-musl.jar
202+
203+
- uses: actions/upload-artifact@v4
204+
with:
205+
name: java-linux-aarch64-musl
206+
path: |
207+
build/release/duckdb_jdbc.jar
118208
119209
java-windows-amd64:
120210
name: Java Windows (amd64)
@@ -197,8 +287,10 @@ jobs:
197287
name: Java Combine
198288
runs-on: ubuntu-latest
199289
needs:
200-
- java-linux-aarch64
201290
- java-linux-amd64
291+
- java-linux-aarch64
292+
- java-linux-amd64-musl
293+
- java-linux-aarch64-musl
202294
- java-windows-amd64
203295
- java-osx-universal
204296

@@ -210,15 +302,25 @@ jobs:
210302
- shell: bash
211303
run: mkdir jdbc-artifacts
212304

305+
- uses: actions/download-artifact@v4
306+
with:
307+
name: java-linux-amd64
308+
path: jdbc-artifacts/java-linux-amd64
309+
213310
- uses: actions/download-artifact@v4
214311
with:
215312
name: java-linux-aarch64
216313
path: jdbc-artifacts/java-linux-aarch64
217314

218315
- uses: actions/download-artifact@v4
219316
with:
220-
name: java-linux-amd64
221-
path: jdbc-artifacts/java-linux-amd64
317+
name: java-linux-amd64-musl
318+
path: jdbc-artifacts/java-linux-amd64-musl
319+
320+
- uses: actions/download-artifact@v4
321+
with:
322+
name: java-linux-aarch64-musl
323+
path: jdbc-artifacts/java-linux-aarch64-musl
222324

223325
- uses: actions/download-artifact@v4
224326
with:
@@ -303,8 +405,10 @@ jobs:
303405
name: Merge vendoring PR
304406
if: ${{ github.repository == 'duckdb/duckdb-java' && github.event_name == 'pull_request' && github.head_ref == format('vendoring-{0}', github.base_ref) }}
305407
needs:
306-
- java-linux-aarch64
307408
- java-linux-amd64
409+
- java-linux-aarch64
410+
- java-linux-amd64-musl
411+
- java-linux-aarch64-musl
308412
- java-windows-amd64
309413
- java-osx-universal
310414
runs-on: ubuntu-latest

scripts/jdbc_maven_deploy.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def exec(cmd):
3030

3131

3232
if len(sys.argv) < 4 or not os.path.isdir(sys.argv[2]) or not os.path.isdir(sys.argv[3]):
33-
print("Usage: [release_tag, format: v1.2.3] [artifact_dir] [jdbc_root_path]")
33+
print("Usage: [release_tag, format: v1.2.3.4] [artifact_dir] [jdbc_root_path]")
3434
exit(1)
3535

3636
version_regex = re.compile(r'^v((\d+)\.(\d+)\.\d+\.\d+)$')
@@ -59,6 +59,8 @@ def exec(cmd):
5959
jdbc_root_path = sys.argv[3]
6060

6161
combine_builds = ['linux-amd64', 'osx-universal', 'windows-amd64', 'linux-aarch64']
62+
arch_specific_builds = ['linux-amd64-musl', 'linux-aarch64-musl']
63+
arch_specific_classifiers = ['linux_amd64_musl', 'linux_aarch64_musl']
6264

6365
staging_dir = tempfile.mkdtemp()
6466

@@ -67,6 +69,12 @@ def exec(cmd):
6769
sources_jar = '%s/duckdb_jdbc-%s-sources.jar' % (staging_dir, release_version)
6870
javadoc_jar = '%s/duckdb_jdbc-%s-javadoc.jar' % (staging_dir, release_version)
6971

72+
arch_specific_jars = []
73+
for i in range(len(arch_specific_builds)):
74+
build = arch_specific_builds[i]
75+
classifier = arch_specific_classifiers[i]
76+
arch_specific_jars.append('%s/duckdb_jdbc-%s-%s.jar' % (staging_dir, release_version, classifier))
77+
7078
pom_template = """
7179
<project>
7280
<modelVersion>4.0.0</modelVersion>
@@ -145,6 +153,13 @@ def exec(cmd):
145153
exec("jar -cvf %s -C %s ." % (javadoc_jar, javadoc_stage_dir))
146154
exec("jar -cvf %s -C %s/src/main/java org" % (sources_jar, jdbc_root_path))
147155

156+
# copy arch-specific JARs
157+
for i in range(len(arch_specific_builds)):
158+
build = arch_specific_builds[i]
159+
src_jar = os.path.join(jdbc_artifact_dir, "java-" + build, "duckdb_jdbc.jar")
160+
dest_jar = arch_specific_jars[i]
161+
shutil.copyfile(src_jar, dest_jar)
162+
148163
# make sure all files exist before continuing
149164
if (
150165
not os.path.exists(javadoc_jar)
@@ -178,12 +193,19 @@ def exec(cmd):
178193
for jar in [binary_jar, sources_jar, javadoc_jar]:
179194
shutil.copyfile(jar, os.path.join(results_dir, os.path.basename(jar)))
180195

196+
for jar in arch_specific_jars:
197+
shutil.copyfile(jar, os.path.join(results_dir, os.path.basename(jar)))
198+
181199
print("JARs created, uploading (this can take a while!)")
182200
deploy_cmd_prefix = 'mvn --no-transfer-progress gpg:sign-and-deploy-file -Durl=%s -DrepositoryId=ossrh' % deploy_url
183201
exec("%s -DpomFile=%s -Dfile=%s" % (deploy_cmd_prefix, pom, binary_jar))
184202
exec("%s -Dclassifier=sources -DpomFile=%s -Dfile=%s" % (deploy_cmd_prefix, pom, sources_jar))
185203
exec("%s -Dclassifier=javadoc -DpomFile=%s -Dfile=%s" % (deploy_cmd_prefix, pom, javadoc_jar))
186204

205+
for i in range(len(arch_specific_builds)):
206+
classifier = arch_specific_classifiers[i]
207+
jar = arch_specific_jars[i]
208+
exec("%s -Dclassifier=%s -DpomFile=%s -Dfile=%s" % (deploy_cmd_prefix, classifier, pom, jar))
187209

188210
if not is_release:
189211
print("Not a release, not closing repo")

0 commit comments

Comments
 (0)