Add aarch64 architecture support to CI

Extend CI workflow to build for both `x86_64` and `aarch64` architectures:
- Add ARM variants for Ubuntu and macOS in the build matrix
- Skip tests on `aarch64` builds with `-x test` flag as JavaFX 21.x.x
  doesn't currently support the ARM64 architecture
- Update artifact naming to include architecture identifiers
- Configure architecture-specific build paths and release outputs

This change enables native builds for ARM-based systems like Apple Silicon
Macs and ARM servers, improving performance for users on these platforms
while maintaining full test coverage on `x86_64` where supported.

Make localnet cache OS-specific

Prevent Error: Failed to CreateArtifact: Received non-retryable
error: Failed request: (409) Conflict: an artifact with this name
already exists on the workflow run

Add a warning about `linux/aarch64` tests being skipped

Simplify GitHub Actions workflow conditions

Replace verbose condition syntax with simpler `runner.os` expressions to
improve readability and maintainability. This change:

- Uses `runner.os` instead of specific `matrix.os` version strings
- Removes unnecessary `${{ }}` expression wrappers in if conditions
- Consolidates OS-specific conditions (e.g. `ubuntu-22.04` or
  `ubuntu-22.04-arm`) into simpler checks (`runner.os == 'Linux'`)

Fix JavaFX loading on Mac ARM64 architecture

JavaFX 21.0.2 supports Mac ARM64 (Apple Silicon) but was failing to
load with `UnsatisfiedLinkError` because the build system wasn't
detecting ARM architecture properly.

This change allows the build system to correctly identify Mac ARM64
systems and use the appropriate JavaFX libraries, resolving the
compatibility issues when running on Apple Silicon Macs.

Split Build and Package Installer steps

Cleaner CI output, split Build and Package installer step into two steps
This commit is contained in:
Robbie Blaine 2025-05-08 18:30:46 +02:00
parent fe3283f3b0
commit 1a42336ba5
No known key found for this signature in database
GPG key ID: 4110110C2C38B0C1
3 changed files with 102 additions and 44 deletions

View file

@ -14,7 +14,25 @@ jobs:
build: build:
strategy: strategy:
matrix: matrix:
os: [ubuntu-22.04, macos-13, windows-latest] os: [ubuntu-22.04, ubuntu-22.04-arm, macos-13, macos-15, windows-latest]
include:
- os: ubuntu-22.04
arch: x86_64
skip_tests: false
- os: ubuntu-22.04-arm
arch: aarch64
# JavaFX 21.x.x doesn't support `linux/aarch64`
# So skip tests until JavaFX is updated
skip_tests: true
- os: macos-13
arch: x86_64
skip_tests: false
- os: macos-15
arch: aarch64
skip_tests: false
- os: windows-latest
arch: x86_64
skip_tests: false
fail-fast: false fail-fast: false
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
@ -27,8 +45,16 @@ jobs:
java-version: '21' java-version: '21'
distribution: 'adopt' distribution: 'adopt'
cache: gradle cache: gradle
- name: Build with Gradle - name: Build with Gradle with tests
if: matrix.skip_tests == false
run: ./gradlew build --stacktrace --scan run: ./gradlew build --stacktrace --scan
- name: Build with Gradle without tests
if: matrix.skip_tests == true
run: |
./gradlew build --stacktrace --scan -x test
echo "::warning title=Tests Skipped::Tests were intentionally skipped for linux/aarch64 builds \
as JavaFX 21.x.x doesn't currently support the linux/aarch64 architecture. \
This should be revisited when JavaFX is next updated."
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
if: failure() if: failure()
with: with:
@ -38,115 +64,127 @@ jobs:
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
include-hidden-files: true include-hidden-files: true
name: cached-localnet name: cached-localnet-${{ matrix.os }}
path: .localnet path: .localnet
overwrite: true overwrite: true
- name: Install dependencies - name: Install dependencies
if: ${{ matrix.os == 'ubuntu-22.04' }} if: runner.os == 'Linux'
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install -y rpm libfuse2 flatpak flatpak-builder appstream sudo apt-get install -y rpm libfuse2 flatpak flatpak-builder appstream
flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo
- name: Install WiX Toolset - name: Install WiX Toolset
if: ${{ matrix.os == 'windows-latest' }} if: runner.os == 'Windows'
run: | run: |
Invoke-WebRequest -Uri 'https://github.com/wixtoolset/wix3/releases/download/wix314rtm/wix314.exe' -OutFile wix314.exe Invoke-WebRequest -Uri 'https://github.com/wixtoolset/wix3/releases/download/wix314rtm/wix314.exe' -OutFile wix314.exe
.\wix314.exe /quiet /norestart .\wix314.exe /quiet /norestart
shell: powershell shell: powershell
- name: Build Haveno Installer - name: Build Haveno Installer with tests
if: matrix.skip_tests == false
run: ./gradlew clean build --refresh-keys --refresh-dependencies
working-directory: .
- name: Build Haveno Installer without tests
if: matrix.skip_tests == true
run: | run: |
./gradlew clean build --refresh-keys --refresh-dependencies ./gradlew clean build --refresh-keys --refresh-dependencies -x test
./gradlew packageInstallers echo "::warning title=Tests Skipped::Tests were intentionally skipped for linux/aarch64 builds \
as JavaFX 21.x.x doesn't currently support the linux/aarch64 architecture. \
This should be revisited when JavaFX is next updated."
working-directory: .
- name: Package Haveno Installer
run: ./gradlew packageInstallers
working-directory: . working-directory: .
# get version from jar # get version from jar
- name: Set Version Unix - name: Set Version Unix
if: ${{ matrix.os == 'ubuntu-22.04' || matrix.os == 'macos-13' }} if: runner.os != 'Windows'
run: | run: |
export VERSION=$(ls desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 | grep -Eo 'desktop-[0-9]+\.[0-9]+\.[0-9]+' | sed 's/desktop-//') export VERSION=$(ls desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 | grep -Eo 'desktop-[0-9]+\.[0-9]+\.[0-9]+' | sed 's/desktop-//')
echo "VERSION=$VERSION" >> $GITHUB_ENV echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Set Version Windows - name: Set Version Windows
if: ${{ matrix.os == 'windows-latest' }} if: runner.os == 'Windows'
run: | run: |
$VERSION = (Get-ChildItem -Path desktop\build\temp-*/binaries\desktop-*.jar.SHA-256).Name -replace 'desktop-', '' -replace '-.*', '' $VERSION = (Get-ChildItem -Path desktop\build\temp-*/binaries\desktop-*.jar.SHA-256).Name -replace 'desktop-', '' -replace '-.*', ''
"VERSION=$VERSION" | Out-File -FilePath $env:GITHUB_ENV -Append "VERSION=$VERSION" | Out-File -FilePath $env:GITHUB_ENV -Append
shell: powershell shell: powershell
- name: Move Release Files for Linux - name: Move Release Files for Linux
if: ${{ matrix.os == 'ubuntu-22.04' }} if: runner.os == 'Linux'
run: | run: |
mkdir ${{ github.workspace }}/release-linux-rpm mkdir ${{ github.workspace }}/release-linux-rpm
mkdir ${{ github.workspace }}/release-linux-deb mkdir ${{ github.workspace }}/release-linux-deb
mkdir ${{ github.workspace }}/release-linux-flatpak mkdir ${{ github.workspace }}/release-linux-flatpak
mkdir ${{ github.workspace }}/release-linux-appimage mkdir ${{ github.workspace }}/release-linux-appimage
mv desktop/build/temp-*/binaries/haveno-*.rpm ${{ github.workspace }}/release-linux-rpm/haveno-v${{ env.VERSION }}-linux-x86_64-installer.rpm mv desktop/build/temp-*/binaries/haveno-*.rpm ${{ github.workspace }}/release-linux-rpm/haveno-v${{ env.VERSION }}-linux-${{ matrix.arch }}-installer.rpm
mv desktop/build/temp-*/binaries/haveno_*.deb ${{ github.workspace }}/release-linux-deb/haveno-v${{ env.VERSION }}-linux-x86_64-installer.deb mv desktop/build/temp-*/binaries/haveno_*.deb ${{ github.workspace }}/release-linux-deb/haveno-v${{ env.VERSION }}-linux-${{ matrix.arch }}-installer.deb
mv desktop/build/temp-*/binaries/*.flatpak ${{ github.workspace }}/release-linux-flatpak/haveno-v${{ env.VERSION }}-linux-x86_64.flatpak mv desktop/build/temp-*/binaries/*.flatpak ${{ github.workspace }}/release-linux-flatpak/haveno-v${{ env.VERSION }}-linux-${{ matrix.arch }}.flatpak
mv desktop/build/temp-*/binaries/haveno_*.AppImage ${{ github.workspace }}/release-linux-appimage/haveno-v${{ env.VERSION }}-linux-x86_64.AppImage mv desktop/build/temp-*/binaries/haveno_*.AppImage ${{ github.workspace }}/release-linux-appimage/haveno-v${{ env.VERSION }}-linux-${{ matrix.arch }}.AppImage
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-linux-deb cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-linux-deb
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-linux-rpm cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-linux-rpm
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-linux-appimage cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-linux-appimage
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-linux-flatpak cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-linux-flatpak
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/haveno-v${{ env.VERSION }}-linux-x86_64-SNAPSHOT-all.jar.SHA-256 cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/haveno-v${{ env.VERSION }}-linux-${{ matrix.arch }}-SNAPSHOT-all.jar.SHA-256
shell: bash shell: bash
- name: Move Release Files for macOS - name: Move Release Files for macOS
if: ${{ matrix.os == 'macos-13' }} if: runner.os == 'MacOS'
run: | run: |
mkdir ${{ github.workspace }}/release-macos mkdir ${{ github.workspace }}/release-macos-${{ matrix.arch }}
mv desktop/build/temp-*/binaries/Haveno-*.dmg ${{ github.workspace }}/release-macos/haveno-v${{ env.VERSION }}-macos-installer.dmg mv desktop/build/temp-*/binaries/Haveno-*.dmg ${{ github.workspace }}/release-macos-${{ matrix.arch }}/haveno-v${{ env.VERSION }}-macos-${{ matrix.arch }}-installer.dmg
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-macos cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-macos-${{ matrix.arch }}
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/haveno-v${{ env.VERSION }}-macos-SNAPSHOT-all.jar.SHA-256 cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/haveno-v${{ env.VERSION }}-macos-${{ matrix.arch }}-SNAPSHOT-all.jar.SHA-256
shell: bash shell: bash
- name: Move Release Files on Windows - name: Move Release Files on Windows
if: ${{ matrix.os == 'windows-latest' }} if: runner.os == 'Windows'
run: | run: |
mkdir ${{ github.workspace }}/release-windows mkdir ${{ github.workspace }}/release-windows
Move-Item -Path desktop\build\temp-*/binaries\Haveno-*.exe -Destination ${{ github.workspace }}/release-windows/haveno-v${{ env.VERSION }}-windows-installer.exe Move-Item -Path desktop\build\temp-*/binaries\Haveno-*.exe -Destination ${{ github.workspace }}/release-windows/haveno-v${{ env.VERSION }}-windows-${{ matrix.arch }}-installer.exe
Copy-Item -Path desktop\build\temp-*/binaries\desktop-*.jar.SHA-256 -Destination ${{ github.workspace }}/release-windows Copy-Item -Path desktop\build\temp-*/binaries\desktop-*.jar.SHA-256 -Destination ${{ github.workspace }}/release-windows
Move-Item -Path desktop\build\temp-*/binaries\desktop-*.jar.SHA-256 -Destination ${{ github.workspace }}/haveno-v${{ env.VERSION }}-windows-SNAPSHOT-all.jar.SHA-256 Move-Item -Path desktop\build\temp-*/binaries\desktop-*.jar.SHA-256 -Destination ${{ github.workspace }}/haveno-v${{ env.VERSION }}-windows-SNAPSHOT-all.jar.SHA-256
shell: powershell shell: powershell
# win # Windows artifacts
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
name: "Windows artifacts" name: "Windows artifacts"
if: ${{ matrix.os == 'windows-latest' }} if: runner.os == 'Windows'
with: with:
name: haveno-windows name: haveno-windows-${{ matrix.arch }}
path: ${{ github.workspace }}/release-windows path: ${{ github.workspace }}/release-windows
# macos
# macOS artifacts
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
name: "macOS artifacts" name: "macOS artifacts"
if: ${{ matrix.os == 'macos-13' }} if: runner.os == 'MacOS'
with: with:
name: haveno-macos name: haveno-macos-${{ matrix.arch }}
path: ${{ github.workspace }}/release-macos path: ${{ github.workspace }}/release-macos-${{ matrix.arch }}
# linux
# Linux artifacts
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
name: "Linux - deb artifact" name: "Linux - deb artifact"
if: ${{ matrix.os == 'ubuntu-22.04' }} if: runner.os == 'Linux'
with: with:
name: haveno-linux-deb name: haveno-linux-${{ matrix.arch }}-deb
path: ${{ github.workspace }}/release-linux-deb path: ${{ github.workspace }}/release-linux-deb
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
name: "Linux - rpm artifact" name: "Linux - rpm artifact"
if: ${{ matrix.os == 'ubuntu-22.04' }} if: runner.os == 'Linux'
with: with:
name: haveno-linux-rpm name: haveno-linux-${{ matrix.arch }}-rpm
path: ${{ github.workspace }}/release-linux-rpm path: ${{ github.workspace }}/release-linux-rpm
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
name: "Linux - AppImage artifact" name: "Linux - AppImage artifact"
if: ${{ matrix.os == 'ubuntu-22.04' }} if: runner.os == 'Linux'
with: with:
name: haveno-linux-appimage name: haveno-linux-${{ matrix.arch }}-appimage
path: ${{ github.workspace }}/release-linux-appimage path: ${{ github.workspace }}/release-linux-appimage
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
name: "Linux - flatpak artifact" name: "Linux - flatpak artifact"
if: ${{ matrix.os == 'ubuntu-22.04' }} if: runner.os == 'Linux'
with: with:
name: haveno-linux-flatpak name: haveno-linux-${{ matrix.arch }}-flatpak
path: ${{ github.workspace }}/release-linux-flatpak path: ${{ github.workspace }}/release-linux-flatpak
- name: Release - name: Release
@ -154,14 +192,30 @@ jobs:
if: startsWith(github.ref, 'refs/tags/') if: startsWith(github.ref, 'refs/tags/')
with: with:
files: | files: |
# Linux x86_64
${{ github.workspace }}/release-linux-deb/haveno-v${{ env.VERSION }}-linux-x86_64-installer.deb ${{ github.workspace }}/release-linux-deb/haveno-v${{ env.VERSION }}-linux-x86_64-installer.deb
${{ github.workspace }}/release-linux-rpm/haveno-v${{ env.VERSION }}-linux-x86_64-installer.rpm ${{ github.workspace }}/release-linux-rpm/haveno-v${{ env.VERSION }}-linux-x86_64-installer.rpm
${{ github.workspace }}/release-linux-appimage/haveno-v${{ env.VERSION }}-linux-x86_64.AppImage ${{ github.workspace }}/release-linux-appimage/haveno-v${{ env.VERSION }}-linux-x86_64.AppImage
${{ github.workspace }}/release-linux-flatpak/haveno-v${{ env.VERSION }}-linux-x86_64.flatpak ${{ github.workspace }}/release-linux-flatpak/haveno-v${{ env.VERSION }}-linux-x86_64.flatpak
${{ github.workspace }}/haveno-v${{ env.VERSION }}-linux-x86_64-SNAPSHOT-all.jar.SHA-256 ${{ github.workspace }}/haveno-v${{ env.VERSION }}-linux-x86_64-SNAPSHOT-all.jar.SHA-256
${{ github.workspace }}/release-macos/haveno-v${{ env.VERSION }}-macos-installer.dmg
${{ github.workspace }}/haveno-v${{ env.VERSION }}-macos-SNAPSHOT-all.jar.SHA-256 # Linux aarch64
${{ github.workspace }}/release-windows/haveno-v${{ env.VERSION }}-windows-installer.exe ${{ github.workspace }}/release-linux-deb/haveno-v${{ env.VERSION }}-linux-aarch64-installer.deb
${{ github.workspace }}/release-linux-rpm/haveno-v${{ env.VERSION }}-linux-aarch64-installer.rpm
${{ github.workspace }}/release-linux-appimage/haveno-v${{ env.VERSION }}-linux-aarch64.AppImage
${{ github.workspace }}/release-linux-flatpak/haveno-v${{ env.VERSION }}-linux-aarch64.flatpak
${{ github.workspace }}/haveno-v${{ env.VERSION }}-linux-aarch64-SNAPSHOT-all.jar.SHA-256
# macOS x86_64
${{ github.workspace }}/release-macos-x86_64/haveno-v${{ env.VERSION }}-macos-x86_64-installer.dmg
${{ github.workspace }}/haveno-v${{ env.VERSION }}-macos-x86_64-SNAPSHOT-all.jar.SHA-256
# macOS aarch64
${{ github.workspace }}/release-macos-aarch64/haveno-v${{ env.VERSION }}-macos-aarch64-installer.dmg
${{ github.workspace }}/haveno-v${{ env.VERSION }}-macos-aarch64-SNAPSHOT-all.jar.SHA-256
# Windows
${{ github.workspace }}/release-windows/haveno-v${{ env.VERSION }}-windows-x86_64-installer.exe
${{ github.workspace }}/haveno-v${{ env.VERSION }}-windows-SNAPSHOT-all.jar.SHA-256 ${{ github.workspace }}/haveno-v${{ env.VERSION }}-windows-SNAPSHOT-all.jar.SHA-256
# https://git-scm.com/docs/git-tag - git-tag Docu # https://git-scm.com/docs/git-tag - git-tag Docu

View file

@ -79,7 +79,9 @@ configure(subprojects) {
slf4jVersion = '1.7.30' slf4jVersion = '1.7.30'
sparkVersion = '2.5.2' sparkVersion = '2.5.2'
os = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os def osName = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os
def osArch = System.getProperty("os.arch").toLowerCase()
os = (osName == 'mac' && (osArch.contains('aarch64') || osArch.contains('arm'))) ? 'mac-aarch64' : osName
} }
repositories { repositories {
@ -951,4 +953,3 @@ configure(project(':apitest')) {
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jupiterVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jupiterVersion"
} }
} }

View file

@ -2474,6 +2474,9 @@
<artifact name="javafx-swing-21.0.2-linux.jar"> <artifact name="javafx-swing-21.0.2-linux.jar">
<sha256 value="67a4369cd556ed9b8b6970116e5f5f7f55ef64e54aaddbcc3f7950f7590631b5" origin="Generated by Gradle"/> <sha256 value="67a4369cd556ed9b8b6970116e5f5f7f55ef64e54aaddbcc3f7950f7590631b5" origin="Generated by Gradle"/>
</artifact> </artifact>
<artifact name="javafx-swing-21.0.2-mac-aarch64.jar">
<sha256 value="5e6b5f10350915d92e2df8d602646eccf9b7f62c56fe04849a6b6f647d50fb74" origin="Generated by Gradle"/>
</artifact>
<artifact name="javafx-swing-21.0.2-mac.jar"> <artifact name="javafx-swing-21.0.2-mac.jar">
<sha256 value="2f047f7a4e5bc8e9603c23b168b472590a0a0607ba16b6c62d5f9b4f361d12ad" origin="Generated by Gradle"/> <sha256 value="2f047f7a4e5bc8e9603c23b168b472590a0a0607ba16b6c62d5f9b4f361d12ad" origin="Generated by Gradle"/>
</artifact> </artifact>