Add new architecture support (Linux x86, Windows x86, Windows ArmV7) and improve build system #770
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |