Skip to content

Commit ad1cdbd

Browse files
committed
feat: enhance CI/CD workflows for multi-architecture builds
- Updated the build workflow to support both amd64 and arm64 architectures for packaging the application as a Debian package. - Introduced a new workflow for testing Linux ARM64 builds, including setup for QEMU and Docker Buildx for cross-platform compatibility. - Adjusted artifact naming conventions to clearly indicate architecture in the output files.
1 parent 3d5b20e commit ad1cdbd

2 files changed

Lines changed: 186 additions & 4 deletions

File tree

.github/workflows/build.yml

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ jobs:
9999
path: "DataCaterer-1.0.0.exe"
100100
overwrite: true
101101

102-
linux:
102+
linux-amd64:
103103
needs: build
104104
runs-on: [ubuntu-latest]
105105

@@ -120,13 +120,65 @@ jobs:
120120
with:
121121
name: jars
122122
path: app/build/libs/
123-
- name: Package jar as debian package
123+
- name: Package jar as debian package (amd64)
124124
run: 'jpackage --main-jar data-caterer.jar "@misc/jpackage/jpackage.cfg" "@misc/jpackage/jpackage-linux.cfg"'
125125
- name: List directory
126126
run: ls -lart
127-
- name: Upload deb
127+
- name: Upload deb (amd64)
128128
uses: actions/upload-artifact@v4
129129
with:
130-
name: data-caterer-linux
130+
name: data-caterer-linux-amd64
131131
path: "datacaterer_1.0.0_amd64.deb"
132132
overwrite: true
133+
134+
linux-arm64:
135+
needs: build
136+
runs-on: [ubuntu-latest]
137+
138+
steps:
139+
- uses: actions/checkout@v4
140+
with:
141+
fetch-depth: 2
142+
- name: Set version
143+
run: echo "APP_VERSION=$(grep version gradle.properties | cut -d= -f2)" >> $GITHUB_ENV
144+
145+
# Set up QEMU for cross-platform builds
146+
- name: Set up QEMU
147+
uses: docker/setup-qemu-action@v3
148+
with:
149+
platforms: arm64
150+
151+
# Set up Docker Buildx
152+
- name: Set up Docker Buildx
153+
uses: docker/setup-buildx-action@v3
154+
155+
- name: Download fat jar
156+
uses: actions/download-artifact@v4
157+
with:
158+
name: jars
159+
path: app/build/libs/
160+
161+
# Use Docker container with ARM64 JDK for jpackage
162+
- name: Package jar as debian package (arm64)
163+
run: |
164+
docker run --rm --platform linux/arm64 \
165+
-v $(pwd):/workspace \
166+
-w /workspace \
167+
arm64v8/eclipse-temurin:21-jdk \
168+
bash -c "jpackage --main-jar data-caterer.jar '@misc/jpackage/jpackage.cfg' '@misc/jpackage/jpackage-linux.cfg'"
169+
170+
- name: List directory
171+
run: ls -lart
172+
173+
- name: Rename output to indicate arm64
174+
run: |
175+
if [ -f "datacaterer_1.0.0_amd64.deb" ]; then
176+
mv datacaterer_1.0.0_amd64.deb datacaterer_1.0.0_arm64.deb
177+
fi
178+
179+
- name: Upload deb (arm64)
180+
uses: actions/upload-artifact@v4
181+
with:
182+
name: data-caterer-linux-arm64
183+
path: "datacaterer_1.0.0_arm64.deb"
184+
overwrite: true
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
name: Test Linux ARM64 Build
2+
3+
on:
4+
push:
5+
branches:
6+
- feature/**
7+
workflow_dispatch:
8+
9+
jobs:
10+
linux-amd64:
11+
runs-on: ubuntu-latest
12+
name: Build Linux AMD64 (x86_64)
13+
14+
steps:
15+
- uses: actions/checkout@v4
16+
with:
17+
fetch-depth: 2
18+
- name: Set version
19+
run: echo "APP_VERSION=$(grep version gradle.properties | cut -d= -f2)" >> $GITHUB_ENV
20+
- uses: actions/setup-java@v4
21+
with:
22+
java-version: '21'
23+
java-package: jdk
24+
architecture: x64
25+
distribution: oracle
26+
- name: Build fat jar
27+
run: ./gradlew :app:shadowJar
28+
- name: Package jar as debian package (amd64)
29+
run: 'jpackage --main-jar data-caterer.jar "@misc/jpackage/jpackage.cfg" "@misc/jpackage/jpackage-linux.cfg"'
30+
- name: List directory
31+
run: ls -lart
32+
- name: Upload deb (amd64)
33+
uses: actions/upload-artifact@v4
34+
with:
35+
name: data-caterer-linux-amd64
36+
path: "datacaterer_1.0.0_amd64.deb"
37+
overwrite: true
38+
39+
linux-arm64:
40+
runs-on: ubuntu-latest
41+
name: Build Linux ARM64 (aarch64)
42+
43+
steps:
44+
- uses: actions/checkout@v4
45+
with:
46+
fetch-depth: 2
47+
- name: Set version
48+
run: echo "APP_VERSION=$(grep version gradle.properties | cut -d= -f2)" >> $GITHUB_ENV
49+
50+
# Set up QEMU for cross-platform builds
51+
- name: Set up QEMU
52+
uses: docker/setup-qemu-action@v3
53+
with:
54+
platforms: arm64
55+
56+
# Set up Docker Buildx
57+
- name: Set up Docker Buildx
58+
uses: docker/setup-buildx-action@v3
59+
60+
# Use x64 JDK to build the fat jar (architecture independent)
61+
- uses: actions/setup-java@v4
62+
with:
63+
java-version: '21'
64+
java-package: jdk
65+
architecture: x64
66+
distribution: oracle
67+
68+
- name: Build fat jar
69+
run: ./gradlew :app:shadowJar
70+
71+
# Use Docker container with ARM64 JDK for jpackage
72+
- name: Package jar as debian package (arm64)
73+
run: |
74+
docker run --rm --platform linux/arm64 \
75+
-v $(pwd):/workspace \
76+
-w /workspace \
77+
arm64v8/eclipse-temurin:21-jdk \
78+
bash -c "jpackage --main-jar data-caterer.jar '@misc/jpackage/jpackage.cfg' '@misc/jpackage/jpackage-linux.cfg'"
79+
80+
- name: List directory
81+
run: ls -lart
82+
83+
- name: Rename output to indicate arm64
84+
run: |
85+
if [ -f "datacaterer_1.0.0_amd64.deb" ]; then
86+
mv datacaterer_1.0.0_amd64.deb datacaterer_1.0.0_arm64.deb
87+
fi
88+
89+
- name: Upload deb (arm64)
90+
uses: actions/upload-artifact@v4
91+
with:
92+
name: data-caterer-linux-arm64
93+
path: "datacaterer_1.0.0_arm64.deb"
94+
overwrite: true
95+
96+
# Alternative approach: Use native ARM64 runners (requires GitHub paid plan)
97+
linux-arm64-native:
98+
runs-on: ubuntu-24.04-arm64
99+
name: Build Linux ARM64 (native runner)
100+
continue-on-error: true # In case ARM64 runners aren't available
101+
102+
steps:
103+
- uses: actions/checkout@v4
104+
with:
105+
fetch-depth: 2
106+
- name: Set version
107+
run: echo "APP_VERSION=$(grep version gradle.properties | cut -d= -f2)" >> $GITHUB_ENV
108+
- uses: actions/setup-java@v4
109+
with:
110+
java-version: '21'
111+
java-package: jdk
112+
architecture: aarch64
113+
distribution: oracle
114+
- name: Build fat jar
115+
run: ./gradlew :app:shadowJar
116+
- name: Package jar as debian package (arm64)
117+
run: 'jpackage --main-jar data-caterer.jar "@misc/jpackage/jpackage.cfg" "@misc/jpackage/jpackage-linux.cfg"'
118+
- name: List directory
119+
run: ls -lart
120+
- name: Rename output to indicate arm64
121+
run: |
122+
if [ -f "datacaterer_1.0.0_amd64.deb" ]; then
123+
mv datacaterer_1.0.0_amd64.deb datacaterer_1.0.0_arm64.deb
124+
fi
125+
- name: Upload deb (arm64 native)
126+
uses: actions/upload-artifact@v4
127+
with:
128+
name: data-caterer-linux-arm64-native
129+
path: "datacaterer_1.0.0_arm64.deb"
130+
overwrite: true

0 commit comments

Comments
 (0)