Skip to content

Add new architecture support (Linux x86, Windows x86, Windows ArmV7) and improve build system #770

Add new architecture support (Linux x86, Windows x86, Windows ArmV7) and improve build system

Add new architecture support (Linux x86, Windows x86, Windows ArmV7) and improve build system #770

Workflow file for this run

name: Build
on:
push:
branches:
- "*"
pull_request:
workflow_dispatch:
inputs:
keep_intermediate_builds:
description: Keep intermediate builds
required: false
type: boolean
default: false
jobs:
Linux-Build:
strategy:
fail-fast: true
matrix:
architecture:
- name: x86_64
ubuntu_version: 18.04
gcc_package_name: "gcc g++"
gcc_exec_name: "x86_64-linux-gnu"
- name: x86
ubuntu_version: 18.04
gcc_package_name: "gcc-i686-linux-gnu g++-i686-linux-gnu"
gcc_exec_name: "i686-linux-gnu"
- name: aarch64
ubuntu_version: 18.04
gcc_package_name: "gcc-aarch64-linux-gnu g++-aarch64-linux-gnu"
gcc_exec_name: "aarch64-linux-gnu"
- name: armv7
ubuntu_version: 18.04
gcc_package_name: "gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf"
gcc_exec_name: "arm-linux-gnueabihf"
- name: ppc64le
ubuntu_version: 18.04
gcc_package_name: "gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu"
gcc_exec_name: "powerpc64le-linux-gnu"
- name: riscv64
ubuntu_version: 18.04
gcc_package_name: "gcc-riscv64-linux-gnu g++-riscv64-linux-gnu"
gcc_exec_name: "riscv64-linux-gnu"
- name: s390x
ubuntu_version: 18.04
gcc_package_name: "gcc-s390x-linux-gnu g++-s390x-linux-gnu"
gcc_exec_name: "s390x-linux-gnu"
java_version: [ 8, 11, 17, 21 ]
name: Linux-${{ matrix.architecture.name }}-Build-JDK${{ matrix.java_version }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Pre Setup JDK
run: |
sudo rm -rf /opt/hostedtoolcache/Java_*/*
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: ${{ matrix.java_version }}
architecture: 'x64'
check-latest: true
- name: Setup Build
run: |
docker build \
--platform linux/amd64 \
--build-arg "UBUNTU_IMAGE=amd64/ubuntu:${{ matrix.architecture.ubuntu_version }}" \
--build-arg "JAVA_VERSION=${{ matrix.java_version }}" \
--build-arg "TARGET_GCC_PACKAGE=${{ matrix.architecture.gcc_package_name }}" \
--build-arg "TARGET_GCC_EXEC=${{ matrix.architecture.gcc_exec_name }}" \
--tag linux-buildimage:${{ matrix.architecture.name }} \
docker/build/
- name: Build
run: |
chmod +x ./mvnw ./mvnw.cmd
export MAVEN_HOME=$(dirname $(dirname $(which mvn)))
docker run \
--platform linux/amd64 \
--volume "$PWD:/data" \
--volume "$JAVA_HOME:/opt/java" \
--volume "$MAVEN_HOME:/opt/maven" \
linux-buildimage:${{ matrix.architecture.name }} \
./mvnw -B -V -ntp -P "linux-${{ matrix.architecture.name }}" "-Dmaven.test.skip=true" clean package
- name: Upload build
uses: actions/upload-artifact@v4
with:
name: Linux-${{ matrix.architecture.name }}-Build-JDK${{ matrix.java_version }}
path: .
compression-level: 9
Windows-Build:
strategy:
fail-fast: true
matrix:
architecture:
- name: x86_64
msvc_code: x64
- name: x86
msvc_code: x64_x86
- name: aarch64
msvc_code: x64_arm64
- name: armv7
msvc_code: x64_arm
java_version: [ 8, 11, 17, 21 ]
name: Windows-${{ matrix.architecture.name }}-Build-JDK${{ matrix.java_version }}
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Pre Setup JDK
run: |
Remove-Item -Recurse -Force -Path C:\hostedtoolcache\windows\Java_*\*
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: ${{ matrix.java_version }}
architecture: 'x64'
check-latest: true
- name: Enable compiler
uses: ilammy/msvc-dev-cmd@v1
with:
arch: ${{ matrix.architecture.msvc_code }}
- name: Build
run: |
./mvnw -B -V -ntp -P "windows-${{ matrix.architecture.name }}" "-Dmaven.test.skip=true" clean package
- name: Upload build
uses: actions/upload-artifact@v4
with:
name: Windows-${{ matrix.architecture.name }}-Build-JDK${{ matrix.java_version }}
path: .
compression-level: 9
OSX-Build:
strategy:
fail-fast: true
matrix:
architecture:
- name: x86_64
- name: aarch64
java_version: [ 8, 11, 17, 21 ]
name: OSX-${{ matrix.architecture.name }}-Build-JDK${{ matrix.java_version }}
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Pre Setup JDK
run: |
sudo rm -rf /Users/runner/hostedtoolcache/Java_*/*
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: ${{ matrix.java_version }}
architecture: 'x64'
check-latest: true
- name: Build
run: |
chmod +x ./mvnw ./mvnw.cmd
./mvnw -B -V -ntp -P "osx-${{ matrix.architecture.name }}" "-Dmaven.test.skip=true" clean package
- name: Upload build
uses: actions/upload-artifact@v4
with:
name: OSX-${{ matrix.architecture.name }}-Build-JDK${{ matrix.java_version }}
path: .
compression-level: 9
Complete-Build:
strategy:
fail-fast: true
matrix:
java_version: [ 8, 11, 17, 21 ]
needs: [ Linux-Build, Windows-Build, OSX-Build, Linux-Test-Docker, Linux-Test-QEMU, Windows-Test, OSX-Test ]
if: ${{ always() && !cancelled() }}
name: Complete-Build-JDK${{ matrix.java_version }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Pre Setup JDK
run: |
sudo rm -rf /opt/hostedtoolcache/Java_*/*
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: ${{ matrix.java_version }}
architecture: 'x64'
check-latest: true
- name: Download intermediate builds
uses: actions/download-artifact@v4
with:
pattern: "*-JDK${{ matrix.java_version }}"
path: builds/
merge-multiple: false
- name: Merge intermediate builds
run: |
OUT=$PWD
rootPaths=($(find ./builds/*/natives/ -type d -name "target" | grep -oiP '(.*)\/([^-]*-[^-]*)-Build-JDK([0-9]*)(?=\/natives\/\2\/target)'))
paths=($(find ./builds/*/natives/ -type d -name "target" | grep -oiP '(?:(.*)\/([^-]*-[^-]*)-Build-JDK([0-9]*)\/)natives\/\2\/target'))
for i in "${!paths[@]}"; do
rootPath="${rootPaths[$i]}"
rootPathLen="${#rootPath}"
path="${paths[$i]}"
cd $rootPath
path=.${path:rootPathLen:256}
cp -r --parent $path $OUT
cd $OUT
done
- name: Setup Build
run: |
docker build \
--platform linux/amd64 \
--build-arg "UBUNTU_IMAGE=amd64/ubuntu:18.04" \
--build-arg "JAVA_VERSION=${{ matrix.java_version }}" \
--tag linux-buildimage:complete \
docker/completebuild/
- name: Build
run: |
chmod +x ./mvnw ./mvnw.cmd
export MAVEN_HOME=$(dirname $(dirname $(which mvn)))
docker run \
--platform linux/amd64 \
--volume "$PWD:/data" \
--volume "$JAVA_HOME:/opt/java" \
--volume "$MAVEN_HOME:/opt/maven" \
linux-buildimage:complete \
./mvnw -B -V -ntp -P "release" "-Dmaven.test.skip=true" package
- name: Remove intermediate builds
if: ${{ !(inputs.keep_intermediate_builds == true) }}
continue-on-error: true
uses: geekyeggo/delete-artifact@v5
with:
name: '*-JDK${{ matrix.java_version }}'
- name: Upload build
uses: actions/upload-artifact@v4
with:
name: Complete-Build-JDK${{ matrix.java_version }}
path: .
compression-level: 9
Linux-Test-Docker:
strategy:
fail-fast: true
matrix:
architecture:
- name: x86_64
ubuntu_version: 18.04
ubuntu_docker_arch: amd64
java_distro: 'temurin'
java_name: x64
docker_name: linux/amd64
- name: aarch64
ubuntu_version: 18.04
ubuntu_docker_arch: arm64v8
java_distro: 'temurin'
java_name: aarch64
docker_name: linux/aarch64
java_version: [ 8, 11, 17, 21 ]
needs: [ Linux-Build ]
name: Linux-${{ matrix.architecture.name }}-Test-JDK${{ matrix.java_version }}-Docker
runs-on: ubuntu-latest
steps:
- name: Pre Setup JDK
run: |
sudo rm -rf /opt/hostedtoolcache/Java_*/*
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: ${{ matrix.architecture.java_distro }}
java-version: ${{ matrix.java_version }}
architecture: ${{ matrix.architecture.java_name }}
check-latest: true
- name: Setup QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: ${{ matrix.architecture.docker_name }}
- name: Download build
uses: actions/download-artifact@v4
with:
name: Linux-${{ matrix.architecture.name }}-Build-JDK${{ matrix.java_version }}
path: .
- name: Setup Test
run: |
docker build \
--platform ${{ matrix.architecture.docker_name }} \
--build-arg "UBUNTU_IMAGE=${{ matrix.architecture.ubuntu_docker_arch }}/ubuntu:${{ matrix.architecture.ubuntu_version }}" \
--build-arg "JAVA_VERSION=${{ matrix.java_version }}" \
--build-arg "TARGET_GCC_PACKAGE=${{ matrix.architecture.gcc_package_name }}" \
--build-arg "TARGET_GCC_EXEC=${{ matrix.architecture.gcc_exec_name }}" \
--tag linux-testimage:${{ matrix.architecture.name }} \
docker/test/
- name: Test
run: |
chmod +x ./mvnw ./mvnw.cmd
export MAVEN_HOME=$(dirname $(dirname $(which mvn)))
docker run \
--platform ${{ matrix.architecture.docker_name }} \
--volume "$PWD:/data" \
--volume "$JAVA_HOME:/opt/java" \
--volume "$MAVEN_HOME:/opt/maven" \
linux-testimage:${{ matrix.architecture.name }} \
./mvnw -B -V -ntp -P "release" test
Linux-Test-QEMU:
strategy:
fail-fast: true
matrix:
architecture:
- name: x86_64
runs_on: ubuntu-24.04
java_distro: 'temurin'
java_name: x64
linux_name: amd64
is_ports: false
qemu_package_name: x86
qemu_name: x86_64
- name: x86
runs_on: ubuntu-22.04
java_distro: 'liberica'
java_name: x86
linux_name: i386
is_ports: false
qemu_package_name: x86
qemu_name: i386
- name: aarch64
runs_on: ubuntu-24.04
java_distro: 'temurin'
java_name: aarch64
linux_name: arm64
is_ports: true
qemu_package_name: arm
qemu_name: aarch64
- name: armv7
runs_on: ubuntu-24.04
java_distro: 'temurin'
java_name: arm
linux_name: armhf
is_ports: true
qemu_package_name: arm
qemu_name: armhf
- name: ppc64le
runs_on: ubuntu-24.04
java_distro: 'temurin'
java_name: ppc64le
linux_name: ppc64el
is_ports: true
qemu_package_name: ppc
qemu_name: ppc64le
- name: riscv64
runs_on: ubuntu-24.04
java_distro: 'temurin'
java_name: riscv64
linux_name: riscv64
is_ports: true
qemu_package_name: misc
qemu_name: riscv64
- name: s390x
runs_on: ubuntu-24.04
java_distro: 'temurin'
java_name: s390x
linux_name: s390x
is_ports: true
qemu_package_name: misc
qemu_name: s390x
java_version: [ 8, 11, 17, 21 ]
exclude:
- architecture:
name: armv7
java_distro: 'temurin'
java_version: 17
- architecture:
name: armv7
java_distro: 'temurin'
java_version: 21
- architecture:
name: s390x
java_distro: 'temurin'
java_version: 8
- architecture:
name: riscv64
java_distro: 'temurin'
java_version: 8
- architecture:
name: riscv64
java_distro: 'temurin'
java_version: 11
needs: [ Linux-Build ]
name: Linux-${{ matrix.architecture.name }}-Test-JDK${{ matrix.java_version }}-QEMU
runs-on: ${{ matrix.architecture.runs_on }}
steps:
- name: Pre Setup JDK
run: |
sudo rm -rf /opt/hostedtoolcache/Java_*/*
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: ${{ matrix.architecture.java_distro }}
java-version: ${{ matrix.java_version }}
architecture: ${{ matrix.architecture.java_name }}
check-latest: true
- name: Download build
uses: actions/download-artifact@v4
with:
name: Linux-${{ matrix.architecture.name }}-Build-JDK${{ matrix.java_version }}
path: .
- name: Setup QEMU
run: |
sudo dpkg --add-architecture ${{ matrix.architecture.linux_name }}
sudo rm -f /etc/apt/sources.list /etc/apt/sources.list.d/ubuntu.sources
if [[ ${{ matrix.architecture.is_ports }} != true ]]; then
echo "deb [arch=amd64,${{ matrix.architecture.linux_name }}] http://azure.archive.ubuntu.com/ubuntu/ $(lsb_release -sc) main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ubuntu.list
echo "deb [arch=amd64,${{ matrix.architecture.linux_name }}] http://azure.archive.ubuntu.com/ubuntu/ $(lsb_release -sc)-updates main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ubuntu-updates.list
echo "deb [arch=amd64,${{ matrix.architecture.linux_name }}] http://azure.archive.ubuntu.com/ubuntu/ $(lsb_release -sc)-security main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ubuntu-security.list
else
echo "deb [arch=amd64] http://azure.archive.ubuntu.com/ubuntu/ $(lsb_release -sc) main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ubuntu.list
echo "deb [arch=amd64] http://azure.archive.ubuntu.com/ubuntu/ $(lsb_release -sc)-updates main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ubuntu-updates.list
echo "deb [arch=amd64] http://azure.archive.ubuntu.com/ubuntu/ $(lsb_release -sc)-security main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ubuntu-security.list
fi
if [[ ${{ matrix.architecture.is_ports}} == true ]]; then
echo "deb [arch=${{ matrix.architecture.linux_name }}] http://azure.ports.ubuntu.com/ubuntu-ports/ $(lsb_release -sc) main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ubuntu-ports.list
echo "deb [arch=${{ matrix.architecture.linux_name }}] http://azure.ports.ubuntu.com/ubuntu-ports/ $(lsb_release -sc)-updates main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ubuntu-ports-updates.list
echo "deb [arch=${{ matrix.architecture.linux_name }}] http://azure.ports.ubuntu.com/ubuntu-ports/ $(lsb_release -sc)-security main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ubuntu-ports-security.list
fi
sudo apt-get update -y
sudo apt-get --fix-broken install
sudo NEEDRESTART_SUSPEND=true apt-get install -y qemu-system-${{ matrix.architecture.qemu_package_name }} qemu-user qemu-utils \
libc6:amd64 libc6:${{ matrix.architecture.linux_name }} libstdc++6:amd64 libstdc++6:${{ matrix.architecture.linux_name }} libtinfo6:amd64 libtinfo6:${{ matrix.architecture.linux_name }} \
libatomic1:amd64 libatomic1:${{ matrix.architecture.linux_name }} zlib1g:amd64 zlib1g:${{ matrix.architecture.linux_name }}
cd /opt
sudo apt-get download bash:${{ matrix.architecture.linux_name }}
sudo mkdir -p bashdata
sudo ar x bash_*.deb --output=bashdata
sudo tar xf bashdata/data.tar.* -C bashdata
if [[ -f bashdata/usr/bin/bash ]]; then
sudo mv bashdata/usr/bin/bash /opt/bash
elif [[ -f bashdata/bin/bash ]]; then
sudo mv bashdata/bin/bash /opt/bash
fi
sudo rm -r bash_*.deb bashdata
- name: Test
run: |
chmod +x ./mvnw ./mvnw.cmd
qemu-${{ matrix.architecture.qemu_name }} /opt/bash -c "./mvnw -B -V -ntp -P \"release\" test"
Windows-Test:
strategy:
fail-fast: true
matrix:
architecture:
- name: x86_64
runs_on: windows-2022
java_distro: 'temurin'
java_name: x64
- name: x86
runs_on: windows-2022
java_distro: 'temurin'
java_name: x86
java_version: [ 8, 11, 17, 21 ]
exclude:
- architecture:
name: x86
java_distro: 'temurin'
java_version: 21
- architecture:
name: aarch64
java_distro: 'liberica'
java_version: 8
needs: [ Windows-Build ]
name: Windows-${{ matrix.architecture.name }}-Test-JDK${{ matrix.java_version }}
runs-on: ${{ matrix.architecture.runs_on }}
steps:
- name: Pre Setup JDK
run: |
Remove-Item -Recurse -Force -Path C:\hostedtoolcache\windows\Java_*\*
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: ${{ matrix.architecture.java_distro }}
java-version: ${{ matrix.java_version }}
architecture: ${{ matrix.architecture.java_name }}
check-latest: true
- name: Download build
uses: actions/download-artifact@v4
with:
name: Windows-${{ matrix.architecture.name }}-Build-JDK${{ matrix.java_version }}
path: .
- name: Test
run: |
./mvnw -B -V -ntp -P "release" test
OSX-Test:
strategy:
fail-fast: true
matrix:
architecture:
- name: x86_64
runs_on: macos-14
java_distro: 'temurin'
java_name: x64
- name: aarch64
runs_on: macos-14
java_distro: 'liberica'
java_name: aarch64
java_version: [ 8, 11, 17, 21 ]
needs: [ OSX-Build ]
name: OSX-${{ matrix.architecture.name }}-Test-JDK${{ matrix.java_version }}
runs-on: ${{ matrix.architecture.runs_on }}
steps:
- name: Pre Setup JDK
run: |
sudo rm -rf /Users/runner/hostedtoolcache/Java_*/*
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: ${{ matrix.architecture.java_distro }}
java-version: ${{ matrix.java_version }}
architecture: ${{ matrix.architecture.java_name }}
check-latest: true
- name: Download build
uses: actions/download-artifact@v4
with:
name: OSX-${{ matrix.architecture.name }}-Build-JDK${{ matrix.java_version }}
path: .
- name: Test
run: |
chmod +x ./mvnw ./mvnw.cmd
./mvnw -B -V -ntp -P "release" test