Skip to content

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

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 #775

Workflow file for this run

name: Build
on:
push:
branches:
- "*"
pull_request:
workflow_dispatch:
inputs:
run_all_tests:
description: Run extra tests on different ubuntu versions
required: false
type: boolean
default: false
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
centos_version: "6-gcc7"
gcc_package_name: "gcc gcc-c++"
gcc_exec_name: "x86_64-redhat-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: 'corretto'
java-version: ${{ matrix.java_version }}
architecture: 'x64'
check-latest: true
- name: Setup Ubuntu Build
if: ${{ matrix.architecture.ubuntu_version }}
run: |
docker build \
--platform linux/amd64 \
--build-arg "DOCKER_IMAGE=amd64/ubuntu:${{ matrix.architecture.ubuntu_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: Setup CentOS Build
if: ${{ matrix.architecture.centos_version }}
run: |
docker build \
--platform linux/amd64 \
--build-arg "DOCKER_IMAGE=gatlingcorp/centos:${{ matrix.architecture.centos_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/centosbuild/
- name: Build
run: |
chmod +x ./mvnw ./mvnw.cmd
docker run \
--platform linux/amd64 \
--volume "$PWD:/data" \
--volume "$JAVA_HOME:/opt/java" \
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: |
chmod +x docker/merge-builds.sh
docker/merge-builds.sh
- name: Setup Build
run: |
docker build \
--platform linux/amd64 \
--build-arg "DOCKER_IMAGE=amd64/ubuntu:18.04" \
--tag linux-buildimage:complete \
docker/completebuild/
- name: Build
run: |
chmod +x ./mvnw ./mvnw.cmd
docker run \
--platform linux/amd64 \
--volume "$PWD:/data" \
--volume "$JAVA_HOME:/opt/java" \
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_docker_arch: amd64
java_distro: 'temurin'
java_name: x64
docker_name: linux/amd64
- name: aarch64
ubuntu_docker_arch: arm64v8
java_distro: 'temurin'
java_name: aarch64
docker_name: linux/aarch64
ubuntu_version: [ "16.04", "18.04", "20.04", "22.04", "24.04" ]
java_version: [ 8, 11, 17, 21 ]
needs: [ Linux-Build ]
if: ${{ inputs.run_all_tests == true }}
name: Linux-${{ matrix.architecture.name }}-Test-JDK${{ matrix.java_version }}-Docker-Ubuntu_${{ matrix.ubuntu_version }}
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 "DOCKER_IMAGE=${{ matrix.architecture.ubuntu_docker_arch }}/ubuntu:${{ matrix.ubuntu_version }}" \
--tag linux-testimage:${{ matrix.architecture.name }} \
docker/test/
- name: Test
run: |
chmod +x ./mvnw ./mvnw.cmd
docker run \
--platform ${{ matrix.architecture.docker_name }} \
--volume "$PWD:/data" \
--volume "$JAVA_HOME:/opt/java" \
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: |
chmod +x docker/install-qemu.sh
docker/install-qemu.sh "${{ matrix.architecture.linux_name }}" "${{ matrix.architecture.is_ports }}" "${{ matrix.architecture.qemu_package_name }}"
- 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
- name: aarch64
runs_on: self-hosted
java_distro: 'liberica'
java_name: aarch64
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