diff --git a/.github/workflows/base-windows.yml b/.github/workflows/base-windows.yml new file mode 100644 index 0000000000000..226fc18623f69 --- /dev/null +++ b/.github/workflows/base-windows.yml @@ -0,0 +1,606 @@ +name: Windows Mandrel-Quarkus tests + +on: + workflow_call: + inputs: + quarkus-version: + type: string + description: 'Quarkus version to test (branch, tag, commit, or "latest")' + # "latest" is replaced by the latest release available in maven + default: "main" + quarkus-repo: + type: string + description: 'The Quarkus repository to be used' + default: 'quarkusio/quarkus' + version: + type: string + description: 'Mandrel version to test (branch, tag, or commit)' + default: "graal/master" + repo: + type: string + description: 'The Mandrel/Graal repository to be used' + default: 'graalvm/mandrel' + mandrel-packaging-version: + type: string + description: 'Mandrel packaging version to test (branch, tag, or commit)' + default: "master" + mandrel-packaging-repo: + type: string + description: 'Mandrel packaging repository to be used' + default: "graalvm/mandrel-packaging" + build-type: + type: string + description: 'Build distribution (Mandrel/GraalVM) from source or grab a release' + default: "mandrel-source" + jdk: + type: string + description: 'OpenJDK to use. One of /ga, /ea, e.g. 17/ga or 17/ea (/ga and /ea suffixes are only relevant when building from source)' + default: "17/ga" + # Builder image can't be tested on Windows due to https://github.com/actions/virtual-environments/issues/1143 + # builder-image: + # description: 'The builder image to use instead of a release or building from source (e.g. quay.io/quarkus/ubi-quarkus-mandrel:20.3-java11)' + # default: "null" + issue-number: + type: string + description: 'The issue number to report results to' + default: "null" + issue-repo: + type: string + description: 'The repository to report results to' + default: "graalvm/mandrel" + mandrel-it-issue-number: + type: string + description: 'The issue number to report results to mandrel-integration-tests' + default: "null" + build-stats-tag: + type: string + description: 'The tag to use for build stats upload of native tests (e.g. 22.3.0-dev-jdk17-mytest-patch-before)' + default: "null" + secrets: + ISSUE_BOT_TOKEN: + description: 'A token used to report results in GH issues' + required: false + UPLOAD_COLLECTOR_TOKEN: + description: 'A token used to report build statistics to a collector' + required: false + +env: + # Workaround testsuite locale issue + LANG: en_US.UTF-8 + DB_USER: hibernate_orm_test + DB_PASSWORD: hibernate_orm_test + DB_NAME: hibernate_orm_test + COMMON_MAVEN_ARGS: "-e -B --settings .github/mvn-settings.xml --fail-at-end" + NATIVE_TEST_MAVEN_OPTS: "-Dtest-containers -Dstart-containers -DfailIfNoTests=false -Dquarkus.native.native-image-xmx=13g -Dnative -Dnative.surefire.skip -Dformat.skip -Dno-descriptor-tests -DskipDocs" + MX_GIT_CACHE: refcache + JAVA_HOME: ${{ github.workspace }}\openjdk + GRAALVM_HOME: ${{ github.workspace }}\graalvm-home + MANDREL_REPO: ${{ github.workspace }}\mandrel + MANDREL_HOME: ${{ github.workspace }}\..\mandrelvm + MX_PATH: ${{ github.workspace }}\mx + MX_PYTHON: python + PYTHONIOENCODING: utf-8 + QUARKUS_PATH: ${{ github.workspace }}\quarkus + MANDREL_PACKAGING_REPO: ${{ github.workspace }}\mandrel-packaging + +jobs: + build-vars: + name: Set distribution and build-from-source variables based on build-type + runs-on: ubuntu-latest + outputs: + build-from-source: ${{ steps.source-build.outputs.build-from-source }} + distribution: ${{ steps.distro.outputs.distribution }} + steps: + - name: Set build-from-source output + id: source-build + run: | + echo "${{ inputs.build-type }}" + bfs_token=$(echo ${{ inputs.build-type }} | cut -d'-' -f2) + if [ "${bfs_token}" == "release" ] + then + source_build=false + elif [ "${bfs_token}" == "source" ] + then + source_build=true + else + echo "Unexpected input 'build-type' = ${{ inputs.build-type }}" + exit 1 + fi + echo "source_build=$source_build" + echo "build-from-source=$source_build" >> $GITHUB_OUTPUT + - name: Set distribution output + id: distro + run: | + bfs_token=$(echo ${{ inputs.build-type }} | cut -d'-' -f1) + if [ "${bfs_token}" == "graal" ] + then + distro="graalvm" + elif [ "${bfs_token}" == "mandrel" ] + then + distro="mandrel" + else + echo "Unexpected input 'build-type' = ${{ inputs.build-type }}" + exit 1 + fi + echo "distro=$distro" + echo "distribution=$distro" >> $GITHUB_OUTPUT + + get-test-matrix: + name: Get test matrix + runs-on: ubuntu-latest + outputs: + quarkus-version: ${{ steps.version.outputs.quarkus-version }} + tests-matrix: ${{ steps.version.outputs.tests-matrix }} + artifacts-suffix: ${{ steps.suffix.outputs.suffix }} + steps: + - id: suffix + run: | + export SUFFIX=$(echo '${{ toJson(inputs) }}' | jq -j 'del(."build-stats-tag", ."mandrel-it-issue-number", ."issue-repo", ."issue-number") | to_entries[] | "-\(.value)"' | tr '":<>|*?\\r\n\/' '-') + echo $SUFFIX + echo "suffix=$SUFFIX" >> $GITHUB_OUTPUT + - name: Get Quarkus version and test matrix + id: version + run: | + if [ ${{ inputs.quarkus-version }} == "latest" ] + then + export QUARKUS_VERSION=$(curl -s https://repo1.maven.org/maven2/io/quarkus/quarkus-bom/maven-metadata.xml | awk -F"[<>]" '/Final/ {print $3}' | sort -V | tail -n 1) + elif $(expr match "${{ inputs.quarkus-version }}" "^.*\.\(Final\|CR\|Alpha\|Beta\)[0-9]\?$" > /dev/null) + then + export QUARKUS_VERSION=${{ inputs.quarkus-version }} + else + export QUARKUS_VERSION=$(git ls-remote ${GITHUB_SERVER_URL}/${{ inputs.quarkus-repo }} | grep "refs/heads/${{ inputs.quarkus-version }}$\|refs/tags/${{ inputs.quarkus-version }}$" | cut -f 1) + fi + if [ "$QUARKUS_VERSION" == "" ] + then + export QUARKUS_VERSION=${{ inputs.quarkus-version }} + fi + echo ${QUARKUS_VERSION} + echo "quarkus-version=${QUARKUS_VERSION}" >> $GITHUB_OUTPUT + curl --output native-tests.json https://raw.githubusercontent.com/${{ inputs.quarkus-repo }}/${QUARKUS_VERSION}/.github/native-tests.json + tests_json=$(jq -c '.include |= map(select(.["os-name"] | startswith("windows")))' native-tests.json) + echo ${tests_json} + echo "tests-matrix=${tests_json}" >> $GITHUB_OUTPUT + + build-mandrel: + name: Mandrel build + runs-on: windows-2022 + needs: + - get-test-matrix + - build-vars + if: fromJson(needs.build-vars.outputs.build-from-source) == true && needs.build-vars.outputs.distribution == 'mandrel' + steps: + - uses: actions/checkout@v4 + with: + repository: ${{ inputs.repo }} + fetch-depth: 1 + ref: ${{ inputs.version }} + path: ${{ env.MANDREL_REPO }} + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.8' + - name: Checkout MX + run: | + VERSION=$(jq -r .mx_version ${MANDREL_REPO}/common.json) + git clone ${GITHUB_SERVER_URL}/graalvm/mx --depth 1 --branch ${VERSION} mx + ./mx/mx --version + shell: bash + - uses: actions/checkout@v4 + with: + repository: ${{ inputs.mandrel-packaging-repo }} + ref: ${{ inputs.mandrel-packaging-version }} + path: ${{ env.MANDREL_PACKAGING_REPO }} + - uses: actions/cache@v4 + with: + path: ~/.mx + key: ${{ runner.os }}-mx-${{ hashFiles('**/suite.py') }} + restore-keys: ${{ runner.os }}-mx- + - name: Get OpenJDK with static libs + run: | + $wc = New-Object System.Net.WebClient + $wc.DownloadFile("https://api.adoptium.net/v3/binary/latest/${{ inputs.jdk }}/windows/x64/jdk/hotspot/normal/eclipse", "$Env:temp\jdk.zip") + Expand-Archive "$Env:temp\jdk.zip" -DestinationPath "$Env:temp" + Move-Item -Path "$Env:temp\jdk-*" -Destination $Env:JAVA_HOME + $wc.DownloadFile("https://api.adoptium.net/v3/binary/latest/${{ inputs.jdk }}/windows/x64/staticlibs/hotspot/normal/eclipse", "$Env:temp\jdk-staticlibs.zip") + Expand-Archive "$Env:temp\jdk-staticlibs.zip" -DestinationPath "$Env:temp" + Move-Item -Path "$Env:temp\jdk-*\lib\static" -Destination $Env:JAVA_HOME\lib\ + Remove-Item -Recurse "$Env:temp\jdk-*" + & $Env:JAVA_HOME\bin\java -version + - name: Build Mandrel + run: | + cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars64.txt" + Get-Content "$Env:temp\vcvars64.txt" | Foreach-Object { + if ($_ -match "^(.*?)=(.*)$") { + Set-Content "Env:\$($matches[1])" $matches[2] + } + } + Set-Location -Path $Env:MANDREL_PACKAGING_REPO + & $Env:JAVA_HOME\bin\java -ea build.java ` + --mx-home $Env:MX_PATH ` + --mandrel-repo $Env:MANDREL_REPO ` + --mandrel-home $Env:MANDREL_HOME + if(!$?) { Exit $LASTEXITCODE } + & $Env:MANDREL_HOME\bin\native-image --version + if(!$?) { Exit $LASTEXITCODE } + Remove-Item -Recurse $Env:JAVA_HOME + Move-Item -Path $Env:MANDREL_HOME -Destination $Env:JAVA_HOME + - name: Archive JDK + shell: bash + run: tar czvf jdk.tgz -C $(dirname ${JAVA_HOME}) $(basename ${JAVA_HOME}) + - name: Persist Mandrel build + uses: actions/upload-artifact@v4 + with: + name: win-jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: jdk.tgz + - name: Prepare failure archive (if maven failed) + if: failure() + shell: bash + run: find . -name '*svm_err_*pid*.md' | tar czvf test-reports.tgz -T - + - name: Upload failure Archive (if maven failed) + uses: actions/upload-artifact@v4 + if: failure() + with: + name: mandrel-reports-native-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: 'test-reports.tgz' + + build-graal: + name: GraalVM CE build + runs-on: windows-2022 + needs: + - get-test-matrix + - build-vars + if: fromJson(needs.build-vars.outputs.build-from-source) == true && needs.build-vars.outputs.distribution == 'graalvm' + steps: + - uses: actions/checkout@v4 + with: + repository: ${{ inputs.repo }} + fetch-depth: 1 + ref: ${{ inputs.version }} + path: graal + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.8' + - name: Checkout MX + run: | + VERSION=$(jq -r .mx_version graal/common.json) + git clone ${GITHUB_SERVER_URL}/graalvm/mx --depth 1 --branch ${VERSION} mx + ./mx/mx --version + shell: bash + - uses: actions/cache@v4 + with: + path: ~/.mx + key: ${{ runner.os }}-mx-${{ hashFiles('**/suite.py') }} + restore-keys: ${{ runner.os }}-mx- + - name: Build graalvm native-image + run: | + cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars64.txt" + Get-Content "$Env:temp\vcvars64.txt" | Foreach-Object { + if ($_ -match "^(.*?)=(.*)$") { + Set-Content "Env:\$($matches[1])" $matches[2] + } + } + Set-Location graal\substratevm + mkdir -p "$Env:temp\jdk-dl" + & $Env:MX_PATH\mx.cmd --java-home= fetch-jdk --java-distribution labsjdk-ce-$(("${{ inputs.jdk }}" -split "/")[0]) --to "$Env:temp\jdk-dl" --alias $Env:JAVA_HOME + & $Env:JAVA_HOME\bin\java --version + & $Env:MX_PATH\mx.cmd --native=native-image,lib:jvmcicompiler,lib:native-image-agent,lib:native-image-diagnostics-agent --components="Native Image,LibGraal,svml" build + ${graalvm-home} = @(& $Env:MX_PATH\mx.cmd --native=native-image,lib:jvmcicompiler,lib:native-image-agent,lib:native-image-diagnostics-agent --components="Native Image,LibGraal,svml" graalvm-home) + rm -Recurse -Force $Env:JAVA_HOME + mv ${graalvm-home} $Env:JAVA_HOME + & $Env:JAVA_HOME\bin\native-image --version + - name: Archive JDK + shell: bash + run: tar czvf jdk.tgz -C $(dirname ${JAVA_HOME}) $(basename ${JAVA_HOME}) + - name: Persist GraalVM CE build + uses: actions/upload-artifact@v4 + with: + name: win-jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: jdk.tgz + - name: Prepare failure archive (if maven failed) + if: failure() + shell: bash + run: find . -name '*svm_err_*pid*.md' | tar czvf test-reports.tgz -T - + - name: Upload failure Archive (if maven failed) + uses: actions/upload-artifact@v4 + if: failure() + with: + name: graal-reports-native-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: 'test-reports.tgz' + + get-jdk: + name: Get JDK ${{ inputs.jdk }} + runs-on: windows-2022 + needs: + - get-test-matrix + - build-vars + if: fromJson(needs.build-vars.outputs.build-from-source) == false + steps: + - name: Get Mandrel ${{ inputs.version }} + if: needs.build-vars.outputs.distribution == 'mandrel' + run: | + $VERSION="${{ inputs.version }}" + $VERSION_SHORT=@($VERSION -replace 'mandrel-') + $wc = New-Object System.Net.WebClient + $url="$Env:GITHUB_SERVER_URL/graalvm/mandrel/releases/download/${VERSION}/mandrel-java$(("${{ inputs.jdk }}" -split "/")[0])-windows-amd64-${VERSION_SHORT}.zip" + $wc.DownloadFile($($url), "mandrel.zip") + Expand-Archive "mandrel.zip" -DestinationPath "$Env:temp" + Move-Item -Path "$Env:temp\mandrel-*" -Destination $Env:JAVA_HOME + & $Env:JAVA_HOME\bin\native-image --version + - name: Get GraalVM CE ${{ inputs.version }} + if: needs.build-vars.outputs.distribution == 'graalvm' + run: | + $VERSION="${{ inputs.version }}" + $VERSION_SHORT=@($VERSION -replace 'vm-') + $wc = New-Object System.Net.WebClient + $url="$Env:GITHUB_SERVER_URL/graalvm/graalvm-ce-builds/releases/download/${VERSION}/graalvm-ce-java$(("${{ inputs.jdk }}" -split "/")[0])-windows-amd64-${VERSION_SHORT}.zip" + $wc.DownloadFile($($url), "graalvm.zip") + Expand-Archive "graalvm.zip" -DestinationPath "$Env:temp" + Move-Item -Path "$Env:temp\graalvm-*" -Destination $Env:JAVA_HOME + & $Env:JAVA_HOME\bin\gu install native-image + & $Env:JAVA_HOME\bin\native-image --version + - name: Archive JDK + shell: bash + run: tar czvf jdk.tgz -C $(dirname ${JAVA_HOME}) $(basename ${JAVA_HOME}) + - name: Persist Mandrel or GraalVM + uses: actions/upload-artifact@v4 + with: + name: win-jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: jdk.tgz + + build-quarkus: + name: Quarkus build + needs: + - get-test-matrix + - build-mandrel + - build-graal + - build-vars + if: always() && (needs.build-graal.result == 'success' || needs.build-mandrel.result == 'success' || fromJson(needs.build-vars.outputs.build-from-source) == false) + strategy: + fail-fast: false + uses: ./.github/workflows/build-quarkus.yml + with: + artifacts-suffix: ${{ needs.get-test-matrix.outputs.artifacts-suffix }} + build-from-source: ${{ fromJson(needs.build-vars.outputs.build-from-source) }} + target-os: 'windows' + quarkus-repo: ${{ inputs.quarkus-repo }} + quarkus-version: ${{ needs.get-test-matrix.outputs.quarkus-version }} + + native-tests: + name: Q IT ${{ matrix.category }} + needs: + - build-quarkus + - build-mandrel + - build-graal + - get-jdk + - get-test-matrix + if: always() && needs.build-quarkus.result == 'success' + runs-on: windows-2022 + env: + # leave more space for the actual native compilation and execution + MAVEN_OPTS: -Xmx1g + # USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM: false + # Ignore the following YAML Schema error + timeout-minutes: ${{matrix.timeout}} + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.get-test-matrix.outputs.tests-matrix) }} + steps: + - name: Support longpaths on Windows + if: startsWith(matrix.os-name, 'windows') + run: git config --global core.longpaths true + - uses: actions/checkout@v4 + if: startsWith(matrix.os-name, 'windows') + with: + repository: graalvm/mandrel + fetch-depth: 1 + path: workflow-mandrel + - name: Download Maven Repo + uses: actions/download-artifact@v4 + with: + name: windows-maven-repo-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: . + - name: Extract Maven Repo + shell: bash + run: tar -xzf maven-repo.tgz -C ~ + - uses: actions/checkout@v4 + with: + repository: ${{ inputs.quarkus-repo }} + fetch-depth: 1 + ref: ${{ needs.get-test-matrix.outputs.quarkus-version }} + path: ${{ env.QUARKUS_PATH }} + - uses: actions/cache@v4 + with: + path: ~/.m2/repository + key: base-windows-${{ needs.get-test-matrix.outputs.quarkus-version }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: base-windows-${{ needs.get-test-matrix.outputs.quarkus-version }}-maven- + # Use Java 17 for Quarkus as it doesn't work with Java 21 yet + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + - name: Download Mandrel or GraalVM + uses: actions/download-artifact@v4 + with: + name: win-jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: . + - name: Extract Mandrel or GraalVM + shell: bash + run: | + mkdir -p "${GRAALVM_HOME}" + tar -xzvf jdk.tgz -C graalvm-home --strip-components=1 + ${GRAALVM_HOME}/bin/java -version + # - name: Reclaim disk space + # shell: bash + # run: ${QUARKUS_PATH}/.github/ci-prerequisites.sh + # We do this so we can get better analytics for the downloaded version of the build images + - name: Update Docker Client User Agent + shell: bash + run: | + if [ -f ~/.docker/config.json ]; then + cat <<< $(jq '.HttpHeaders += {"User-Agent": "Mandrel-CI-Docker-Client"}' ~/.docker/config.json) > ~/.docker/config.json.new + mv ~/.docker/config.json.new ~/.docker/config.json + fi + - name: Change quarkus.version for Quarkus 2.2 to make mandrel-integration-test not apply quarkus_main.patch + # See https://github.com/Karm/mandrel-integration-tests/pull/64 + shell: bash + run: | + if [ "${{ inputs.quarkus-version }}" == "2.2" ] + then + cd quarkus + bash ../workflow-mandrel/.github/update_quarkus_version.sh 2.2.999 + fi + - name: Build with Maven + env: + TEST_MODULES: ${{matrix.test-modules}} + CATEGORY: ${{matrix.category}} + run: | + cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars64.txt" + Get-Content "$Env:temp\vcvars64.txt" | Foreach-Object { + if ($_ -match "^(.*?)=(.*)$") { + Set-Content "Env:\$($matches[1])" $matches[2] + } + } + cd $Env:QUARKUS_PATH + Write-Host "$Env:GRAALVM_HOME" + if (Test-Path "$Env:GRAALVM_HOME/bin/native-image" -PathType leaf) { + & "$Env:GRAALVM_HOME/bin/native-image" --version + } + $opts=@() + -split $Env:NATIVE_TEST_MAVEN_OPTS | foreach { $opts += "`"$_`"" } + #if ( "${{ inputs.builder-image }}" -eq "null" ) { + mvn -f integration-tests -pl "$Env:TEST_MODULES" -amd "-Dquarkus.native.container-build=false" $opts install + #} else { + # mvn -pl $do_modules "-Dquarkus.native.container-build=true" "-Dquarkus.native.builder-image=${{ inputs.builder-image }}" $opts package + #} + - name: Prepare failure archive (if maven failed) + if: failure() + shell: bash + run: find . -type d -name '*-reports' -o -wholename '*/build/reports/tests/functionalTest' -o -name '*svm_err_*pid*.md' | tar czvf test-reports.tgz -T - + - name: Upload failure Archive (if maven failed) + uses: actions/upload-artifact@v4 + if: failure() + with: + name: win-test-reports-native-${{matrix.category}}-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: 'test-reports.tgz' + - name: Collect build JSON stats + if: inputs.build-stats-tag != 'null' + shell: bash + run: find . -name '*runner*.json' | tar czvf build-stats.tgz -T - + - name: Upload build JSON stats + if: inputs.build-stats-tag != 'null' + uses: actions/upload-artifact@v4 + with: + name: build-stats-${{matrix.category}}-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: 'build-stats.tgz' + + native-tests-stats-upload: + name: Upload build stats to collector + if: always() && inputs.build-stats-tag != 'null' && github.event_name != 'pull_request' && needs.native-tests.result != 'skipped' && needs.native-tests.result != 'cancelled' + needs: + - native-tests + - get-test-matrix + strategy: + matrix: ${{ fromJson(needs.get-test-matrix.outputs.tests-matrix) }} + uses: ./.github/workflows/native-tests-stats-upload.yml + with: + artifacts-suffix: ${{ needs.get-test-matrix.outputs.artifacts-suffix }} + build-stats-tag: ${{ inputs.build-stats-tag }} + category: ${{ matrix.category }} + + mandrel-integration-tests: + name: Q Mandrel IT + if: always() && needs.build-quarkus.result == 'success' + needs: + - build-vars + - build-mandrel + - get-jdk + - build-quarkus + - get-test-matrix + runs-on: windows-2022 + env: + # leave more space for the actual native compilation and execution + MAVEN_OPTS: -Xmx1g + # Don't perform performance checks since GH runners are not that stable + FAIL_ON_PERF_REGRESSION: false + # USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM: false + timeout-minutes: 40 + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v4 + with: + repository: graalvm/mandrel + fetch-depth: 1 + path: workflow-mandrel + - uses: actions/checkout@v4 + with: + repository: Karm/mandrel-integration-tests + fetch-depth: 1 + - name: Download Maven Repo + uses: actions/download-artifact@v4 + with: + name: windows-maven-repo-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: . + - name: Extract Maven Repo + shell: bash + run: tar -xzvf maven-repo.tgz -C ~ + # Use Java 17 for Quarkus as it doesn't work with Java 21 yet + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + - name: Download Mandrel or GraalVM + uses: actions/download-artifact@v4 + with: + name: win-jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: . + - name: Extract Mandrel or GraalVM + shell: bash + run: | + mkdir -p "${GRAALVM_HOME}" + tar -xzvf jdk.tgz -C graalvm-home --strip-components=1 + ${GRAALVM_HOME}/bin/java -version + - name: Update Docker Client User Agent + shell: bash + run: | + if [ -f ~/.docker/config.json ]; then + cat <<< $(jq '.HttpHeaders += {"User-Agent": "Mandrel-CI-Docker-Client"}' ~/.docker/config.json) > ~/.docker/config.json.new + mv ~/.docker/config.json.new ~/.docker/config.json + fi + - name: Build with Maven + run: | + cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars64.txt" + Get-Content "$Env:temp\vcvars64.txt" | Foreach-Object { + if ($_ -match "^(.*?)=(.*)$") { + Set-Content "Env:\$($matches[1])" $matches[2] + } + } + $Env:PATH="$Env:GRAALVM_HOME\bin;$Env:PATH" + if (Test-Path "$Env:GRAALVM_HOME\bin\native-image.cmd" -PathType leaf) { + & "$Env:GRAALVM_HOME\bin\native-image" --version + } else { + Write-Host "Cannot find native-image tool. Quitting..." + exit 1 + } + $QUARKUS_VERSION="${{ needs.get-test-matrix.outputs.quarkus-version }}" + # Don't use SNAPSHOT version for 2.2 and release tags + if ("${{ inputs.quarkus-version }}" -eq "2.2") { + $QUARKUS_VERSION="2.2.999" + } elseif (${{ inputs.quarkus-version }} -match "^[0-9]+\.[0-9]+$") { + $QUARKUS_VERSION="${{ inputs.quarkus-version }}.999-SNAPSHOT" + } elseif (! ($QUARKUS_VERSION -match "^.*\.(Final|CR|Alpha|Beta)[0-9]?$")) { + $QUARKUS_VERSION="999-SNAPSHOT" + } + Write-Host "$QUARKUS_VERSION" + mvn clean verify "-Dquarkus.native.native-image-xmx=5g" "-Dquarkus.version=$QUARKUS_VERSION" -Ptestsuite + - name: Prepare failure archive (if maven failed) + if: failure() + shell: bash + run: tar czvf test-reports-mandrel-it.tgz ./testsuite/target/archived-logs/ + - name: Upload failure Archive (if maven failed) + uses: actions/upload-artifact@v4 + if: failure() + with: + name: win-test-reports-mandrel-it-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: 'test-reports-mandrel-it.tgz' diff --git a/.github/workflows/base.yml b/.github/workflows/base.yml new file mode 100644 index 0000000000000..cf2cd0493893b --- /dev/null +++ b/.github/workflows/base.yml @@ -0,0 +1,661 @@ +name: Mandrel-Quarkus tests + +on: + workflow_call: + inputs: + quarkus-version: + type: string + description: 'Quarkus version to test (branch, tag, commit, or "latest")' + # "latest" is replaced by the latest release available in maven + default: "main" + quarkus-repo: + type: string + description: 'The Quarkus repository to be used' + default: 'quarkusio/quarkus' + repo: + type: string + description: 'The Mandrel/Graal repository to be used' + default: 'graalvm/mandrel' + version: + type: string + description: 'Mandrel version to test (branch, tag, or commit)' + default: "graal/master" + mandrel-packaging-version: + type: string + description: 'Mandrel packaging version to test (branch, tag, or commit)' + default: "master" + mandrel-packaging-repo: + type: string + description: 'Mandrel packaging repository to be used' + default: "graalvm/mandrel-packaging" + build-type: + type: string + description: 'Build distribution (Mandrel/GraalVM) from source or grab a release, and control of maven should deploy locally' + default: "mandrel-source" + jdk: + type: string + description: 'OpenJDK to use. One of /ga, /ea, e.g. 17/ga or 17/ea (/ga and /ea suffixes are only relevant when building from source)' + default: "17/ga" + builder-image: + type: string + description: 'The builder image to use instead of a release or building from source (e.g. quay.io/quarkus/ubi-quarkus-mandrel:20.3-java11)' + default: "null" + issue-number: + type: string + description: 'The issue number to report results to' + default: "null" + issue-repo: + type: string + description: 'The repository to report results to' + default: "graalvm/mandrel" + mandrel-it-issue-number: + type: string + description: 'The issue number to report results to mandrel-integration-tests' + default: "null" + build-stats-tag: + type: string + description: 'The tag to use for build stats upload of native tests (e.g. 22.3.0-dev-jdk17-mytest-patch-before)' + default: "null" + secrets: + ISSUE_BOT_TOKEN: + description: 'A token used to report results in GH issues' + required: false + UPLOAD_COLLECTOR_TOKEN: + description: 'A token used to report build statistics to a collector' + required: false + +env: + # Workaround testsuite locale issue + LANG: en_US.UTF-8 + DB_USER: hibernate_orm_test + DB_PASSWORD: hibernate_orm_test + DB_NAME: hibernate_orm_test + NATIVE_TEST_MAVEN_OPTS: "--fail-at-end -Dtest-containers -Dstart-containers -DfailIfNoTests=false -Dquarkus.native.native-image-xmx=13g -Dnative -Dnative.surefire.skip -Dformat.skip -Dno-descriptor-tests install -DskipDocs" + MX_GIT_CACHE: refcache + JAVA_HOME: ${{ github.workspace }}/openjdk + GRAALVM_HOME: ${{ github.workspace }}/graalvm-home + MANDREL_REPO: ${{ github.workspace }}/mandrel + MANDREL_HOME: ${{ github.workspace }}/../mandrelvm + MX_PATH: ${{ github.workspace }}/mx + MX_PYTHON: python + PYTHONIOENCODING: utf-8 + QUARKUS_PATH: ${{ github.workspace }}/quarkus + MANDREL_IT_PATH: ${{ github.workspace }}/mandrel-integration-tests + MANDREL_PACKAGING_REPO: ${{ github.workspace }}/mandrel-packaging + +jobs: + build-vars: + name: Set distribution, build-from-source, and maven-deploy-local variables based on build-type + runs-on: ubuntu-latest + outputs: + build-from-source: ${{ steps.source-build.outputs.build-from-source }} + distribution: ${{ steps.distro.outputs.distribution }} + maven-deploy-local: ${{ steps.maven-deploy-local.outputs.maven-deploy-local }} + steps: + - name: Set build-from-source output + id: source-build + run: | + echo "${{ inputs.build-type }}" + bfs_token=$(echo ${{ inputs.build-type }} | cut -d'-' -f2) + if [ "${bfs_token}" == "release" ] + then + source_build=false + elif [ "${bfs_token}" == "source" ] + then + source_build=true + else + echo "Unexpected input 'build-type' = ${{ inputs.build-type }}" + exit 1 + fi + echo "source_build=$source_build" + echo "build-from-source=$source_build" >> $GITHUB_OUTPUT + - name: Set distribution output + id: distro + run: | + bfs_token=$(echo ${{ inputs.build-type }} | cut -d'-' -f1) + if [ "${bfs_token}" == "graal" ] + then + distro="graalvm" + elif [ "${bfs_token}" == "mandrel" ] + then + distro="mandrel" + else + echo "Unexpected input 'build-type' = ${{ inputs.build-type }}" + exit 1 + fi + echo "distro=$distro" + echo "distribution=$distro" >> $GITHUB_OUTPUT + - name: Set maven-deploy-local output + id: maven-deploy-local + run: | + bfs_token=$(echo ${{ inputs.build-type }} | cut -d'-' -f3) + if [ "${bfs_token}" == "nolocalmvn" ] + then + maven_deploy_local="" + else + maven_deploy_local="--maven-deploy-local" + fi + echo "maven_deploy_local=$maven_deploy_local" + echo "maven-deploy-local=$maven_deploy_local" >> $GITHUB_OUTPUT + + get-test-matrix: + name: Get test matrix + runs-on: ubuntu-latest + outputs: + quarkus-version: ${{ steps.version.outputs.quarkus-version }} + tests-matrix: ${{ steps.version.outputs.tests-matrix }} + artifacts-suffix: ${{ steps.suffix.outputs.suffix }} + steps: + - id: suffix + run: | + export SUFFIX=$(echo '${{ toJson(inputs) }}' | jq -j 'del(."build-stats-tag", ."mandrel-it-issue-number", ."issue-repo", ."issue-number") | to_entries[] | "-\(.value)"' | tr '":<>|*?\r\n\/' '-') + echo $SUFFIX + echo "suffix=$SUFFIX" >> $GITHUB_OUTPUT + - name: Get Quarkus version and test matrix + id: version + run: | + if [ ${{ inputs.quarkus-version }} == "latest" ] + then + export QUARKUS_VERSION=$(curl -s https://repo1.maven.org/maven2/io/quarkus/quarkus-bom/maven-metadata.xml | awk -F"[<>]" '/Final/ {print $3}' | sort -V | tail -n 1) + elif $(expr match "${{ inputs.quarkus-version }}" "^.*\.\(Final\|CR\|Alpha\|Beta\)[0-9]\?$" > /dev/null) + then + export QUARKUS_VERSION=${{ inputs.quarkus-version }} + else + export QUARKUS_VERSION=$(git ls-remote ${GITHUB_SERVER_URL}/${{ inputs.quarkus-repo }} | grep "refs/heads/${{ inputs.quarkus-version }}$\|refs/tags/${{ inputs.quarkus-version }}$" | cut -f 1) + fi + if [ "$QUARKUS_VERSION" == "" ] + then + export QUARKUS_VERSION=${{ inputs.quarkus-version }} + fi + echo ${QUARKUS_VERSION} + echo "quarkus-version=${QUARKUS_VERSION}" >> $GITHUB_OUTPUT + curl --output native-tests.json https://raw.githubusercontent.com/${{ inputs.quarkus-repo }}/${QUARKUS_VERSION}/.github/native-tests.json + tests_json=$(jq -c '.include |= map(select(.["os-name"] | startswith("ubuntu")))' native-tests.json) + echo ${tests_json} + echo "tests-matrix=${tests_json}" >> $GITHUB_OUTPUT + + build-mandrel: + name: Mandrel build + runs-on: ubuntu-latest + needs: + - get-test-matrix + - build-vars + if: fromJson(needs.build-vars.outputs.build-from-source) == true && needs.build-vars.outputs.distribution == 'mandrel' && inputs.builder-image == 'null' + steps: + - uses: actions/checkout@v4 + with: + repository: ${{ inputs.repo }} + fetch-depth: 1 + ref: ${{ inputs.version }} + path: ${{ env.MANDREL_REPO }} + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.8' + - name: Checkout MX + run: | + VERSION=$(jq -r .mx_version ${MANDREL_REPO}/common.json) + git clone ${GITHUB_SERVER_URL}/graalvm/mx --depth 1 --branch ${VERSION} ${MX_PATH} + ./mx/mx --version + - uses: actions/checkout@v4 + with: + repository: ${{ inputs.mandrel-packaging-repo }} + ref: ${{ inputs.mandrel-packaging-version }} + path: ${{ env.MANDREL_PACKAGING_REPO }} + - uses: actions/cache@v4 + with: + path: ~/.mx + key: ${{ runner.os }}-mx-${{ hashFiles('**/suite.py') }} + restore-keys: ${{ runner.os }}-mx- + - name: Get OpenJDK with static libs + run: | + curl -sL https://api.adoptium.net/v3/binary/latest/${{ inputs.jdk }}/linux/x64/jdk/hotspot/normal/eclipse -o jdk.tar.gz + curl -sL https://api.adoptium.net/v3/binary/latest/${{ inputs.jdk }}/linux/x64/staticlibs/hotspot/normal/eclipse -o jdk-static-libs.tar.gz + mkdir -p ${JAVA_HOME} + tar xf jdk.tar.gz -C ${JAVA_HOME} --strip-components=1 + tar xf jdk-static-libs.tar.gz -C ${JAVA_HOME} --strip-components=1 + echo ${JAVA_HOME} + ${JAVA_HOME}/bin/java --version + - name: Build Mandrel + run: | + MVN_LOCAL="${{needs.build-vars.outputs.maven-deploy-local}}" + if [ "$MVN_LOCAL" != "" ] + then + rm -rf ~/.m2/repository/org/graalvm + fi + cd ${MANDREL_PACKAGING_REPO} + ${JAVA_HOME}/bin/java -ea build.java \ + --mx-home ${MX_PATH} \ + --mandrel-repo ${MANDREL_REPO} \ + --mandrel-home ${MANDREL_HOME} \ + --archive-suffix tar.gz \ + "${{needs.build-vars.outputs.maven-deploy-local}}" + ${MANDREL_HOME}/bin/native-image --version + mv mandrel-java*-linux-amd64-*.tar.gz ${{ github.workspace }}/jdk.tgz + if [ "$MVN_LOCAL" != "" ] + then + rm -rf graalvm-maven-artefacts.tgz && tar -czvf graalvm-maven-artefacts.tgz -C ~ .m2/repository/org/graalvm + mv graalvm-maven-artefacts.tgz ${{ github.workspace }} + rm -rf graalvm-version.tgz && tar -czvf graalvm-version.tgz -C $(dirname ${MANDREL_HOME}) $(basename ${MANDREL_HOME})/.maven-version + mv graalvm-version.tgz ${{ github.workspace }} + fi + - name: Persist Mandrel build + uses: actions/upload-artifact@v4 + with: + name: jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: jdk.tgz + - name: Persist local maven repository + if: needs.build-vars.outputs.maven-deploy-local != '' + uses: actions/upload-artifact@v4 + with: + name: org-graalvm-artefacts-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: graalvm-maven-artefacts.tgz + - name: Persist GraalVM maven version + if: needs.build-vars.outputs.maven-deploy-local != '' + uses: actions/upload-artifact@v4 + with: + name: mandrel-maven-version-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: graalvm-version.tgz + - name: Prepare failure archive (if maven failed) + if: failure() + shell: bash + run: find . -name '*svm_err_*pid*.md' | tar czvf test-reports.tgz -T - + - name: Upload failure Archive (if maven failed) + uses: actions/upload-artifact@v4 + if: failure() + with: + name: mandrel-reports-native-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: 'test-reports.tgz' + + build-graal: + name: GraalVM CE build + runs-on: ubuntu-latest + needs: + - get-test-matrix + - build-vars + if: fromJson(needs.build-vars.outputs.build-from-source) == true && needs.build-vars.outputs.distribution == 'graalvm' && inputs.builder-image == 'null' + steps: + - uses: actions/checkout@v4 + with: + repository: ${{ inputs.repo }} + fetch-depth: 1 + ref: ${{ inputs.version }} + path: graal + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.8' + - name: Checkout MX + run: | + VERSION=$(jq -r .mx_version graal/common.json) + git clone ${GITHUB_SERVER_URL}/graalvm/mx --depth 1 --branch ${VERSION} ${MX_PATH} + ./mx/mx --version + - uses: actions/cache@v4 + with: + path: ~/.mx + key: ${{ runner.os }}-mx-${{ hashFiles('**/suite.py') }} + restore-keys: ${{ runner.os }}-mx- + - name: Get labs OpenJDK + run: | + cd graal + mkdir jdk-dl + ${MX_PATH}/mx --java-home= fetch-jdk --java-distribution labsjdk-ce-$(echo ${{ inputs.jdk }} | cut -d / -f 1) --to `pwd`/jdk-dl --alias ${JAVA_HOME} + ${JAVA_HOME}/bin/java --version + - name: Build graalvm native-image + run: | + MVN_LOCAL="${{needs.build-vars.outputs.maven-deploy-local}}" + if [ "$MVN_LOCAL" != "" ] + then + rm -rf ~/.m2/repository/org/graalvm + fi + cd graal/substratevm + ${MX_PATH}/mx --native=native-image,lib:jvmcicompiler,lib:native-image-agent,lib:native-image-diagnostics-agent --components="Native Image,LibGraal,svml" build + mv $(${MX_PATH}/mx --native=native-image,lib:jvmcicompiler,lib:native-image-agent,lib:native-image-diagnostics-agent --components="Native Image,LibGraal,svml" graalvm-home) ${MANDREL_HOME} + ${MANDREL_HOME}/bin/native-image --version + if [ "$MVN_LOCAL" != "" ] + then + cd ../ + # Deploy maven artefacts to local repository + ${MX_PATH}/mx --primary-suite-path sdk maven-deploy --suppress-javadoc 2>&1 | tee maven_deploy.log + rm -rf graalvm-maven-artefacts.tgz && tar -czvf graalvm-maven-artefacts.tgz -C ~ .m2/repository/org/graalvm + mv graalvm-maven-artefacts.tgz ${{ github.workspace }} + # Get version from first line of the log, which should look like "Installing sdk distributions for version 23.1.0.0" + MAVEN_VERS=$(awk 'NR==1 {print $6}' maven_deploy.log) + echo "GraalVM maven version is: ${MAVEN_VERS}" + echo ${MAVEN_VERS} > ${MANDREL_HOME}/.maven-version + rm -rf graalvm-version.tgz && tar -czvf graalvm-version.tgz -C $(dirname ${MANDREL_HOME}) $(basename ${MANDREL_HOME})/.maven-version + mv graalvm-version.tgz ${{ github.workspace }} + fi + - name: Tar GraalVM + run: tar czvf jdk.tgz -C $(dirname ${MANDREL_HOME}) $(basename ${MANDREL_HOME}) + - name: Persist GraalVM build + uses: actions/upload-artifact@v4 + with: + name: jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: jdk.tgz + - name: Persist local maven repository + if: needs.build-vars.outputs.maven-deploy-local != '' + uses: actions/upload-artifact@v4 + with: + name: org-graalvm-artefacts-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: graalvm-maven-artefacts.tgz + - name: Persist GraalVM maven version + if: needs.build-vars.outputs.maven-deploy-local != '' + uses: actions/upload-artifact@v4 + with: + name: mandrel-maven-version-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: graalvm-version.tgz + - name: Prepare failure archive (if maven failed) + if: failure() + shell: bash + run: find . -name '*svm_err_*pid*.md' | tar czvf test-reports.tgz -T - + - name: Upload failure Archive (if maven failed) + uses: actions/upload-artifact@v4 + if: failure() + with: + name: graal-reports-native-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: 'test-reports.tgz' + + get-jdk: + name: Get JDK ${{ inputs.jdk }} + runs-on: ubuntu-latest + needs: + - get-test-matrix + - build-vars + if: fromJson(needs.build-vars.outputs.build-from-source) == false && inputs.builder-image == 'null' + steps: + - name: Get Mandrel ${{ inputs.version }} + if: needs.build-vars.outputs.distribution == 'mandrel' + run: | + VERSION=${{ inputs.version }} + curl \ + -sL ${GITHUB_SERVER_URL}/graalvm/mandrel/releases/download/${VERSION}/mandrel-java$(echo ${{ inputs.jdk }} | cut -d / -f 1)-linux-amd64-${VERSION##mandrel-}.tar.gz \ + -o jdk.tgz + - name: Get GraalVM CE ${{ inputs.version }} + if: needs.build-vars.outputs.distribution == 'graalvm' + run: | + VERSION=${{ inputs.version }} + curl \ + -sL ${GITHUB_SERVER_URL}/graalvm/graalvm-ce-builds/releases/download/${VERSION}/graalvm-ce-java$(echo ${{ inputs.jdk }} | cut -d / -f 1)-linux-amd64-${VERSION##vm-}.tar.gz \ + -o graalvm.tgz + mkdir -p ${JAVA_HOME} + tar xzvf graalvm.tgz -C ${JAVA_HOME} --strip-components=1 + ${JAVA_HOME}/bin/gu install native-image + ${JAVA_HOME}/bin/native-image --version + tar czvf jdk.tgz -C $(dirname ${JAVA_HOME}) $(basename ${JAVA_HOME}) + - name: Persist Mandrel or GraalVM + uses: actions/upload-artifact@v4 + with: + name: jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: jdk.tgz + + build-quarkus: + name: Quarkus build + needs: + - get-test-matrix + - build-mandrel + - build-graal + - build-vars + if: always() && (needs.build-graal.result == 'success' || needs.build-mandrel.result == 'success' || fromJson(needs.build-vars.outputs.build-from-source) == false) || inputs.builder-image != 'null' + uses: ./.github/workflows/build-quarkus.yml + with: + artifacts-suffix: ${{ needs.get-test-matrix.outputs.artifacts-suffix }} + build-from-source: ${{ fromJson(needs.build-vars.outputs.build-from-source) }} + builder-image: ${{ inputs.builder-image }} + maven-deploy-local: ${{ needs.build-vars.outputs.maven-deploy-local }} + target-os: 'linux' + quarkus-repo: ${{ inputs.quarkus-repo }} + quarkus-version: ${{ needs.get-test-matrix.outputs.quarkus-version }} + + native-tests: + name: Q IT ${{ matrix.category }} + needs: + - build-mandrel + - build-graal + - get-jdk + - build-quarkus + - get-test-matrix + if: always() && needs.build-quarkus.result == 'success' + runs-on: ubuntu-latest + env: + # leave more space for the actual native compilation and execution + MAVEN_OPTS: -Xmx1g + # USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM: false + # Ignore the following YAML Schema error + timeout-minutes: ${{matrix.timeout}} + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.get-test-matrix.outputs.tests-matrix) }} + steps: + - uses: actions/checkout@v4 + with: + repository: graalvm/mandrel + fetch-depth: 1 + path: workflow-mandrel + - name: Download Maven Repo + uses: actions/download-artifact@v4 + with: + name: linux-maven-repo-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: . + - name: Extract Maven Repo + shell: bash + run: tar -xzvf maven-repo.tgz -C ~ + # Use Java 17 for Quarkus as it doesn't work with Java 21 yet + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + - name: Download Mandrel or GraalVM + if: inputs.builder-image == 'null' + uses: actions/download-artifact@v4 + with: + name: jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: . + - name: Extract Mandrel or GraalVM + if: inputs.builder-image == 'null' + shell: bash + run: | + mkdir -p ${GRAALVM_HOME} + tar -xzvf jdk.tgz -C ${GRAALVM_HOME} --strip-components=1 + - uses: actions/checkout@v4 + with: + repository: ${{ inputs.quarkus-repo }} + fetch-depth: 1 + ref: ${{ needs.get-test-matrix.outputs.quarkus-version }} + path: ${{ env.QUARKUS_PATH }} + - name: Reclaim disk space + run: ${QUARKUS_PATH}/.github/ci-prerequisites.sh + - name: Update Docker Client User Agent + shell: bash + run: | + if [ -f ~/.docker/config.json ]; then + cat <<< $(jq '.HttpHeaders += {"User-Agent": "Mandrel-CI-Docker-Client"}' ~/.docker/config.json) > ~/.docker/config.json.new + mv ~/.docker/config.json.new ~/.docker/config.json + fi + - name: Change quarkus.version for Quarkus 2.2 to make mandrel-integration-test not apply quarkus_main.patch + # See https://github.com/Karm/mandrel-integration-tests/pull/64 + run: | + if [ "${{ inputs.quarkus-version }}" == "2.2" ] + then + cd quarkus + bash ../workflow-mandrel/.github/update_quarkus_version.sh 2.2.999 + fi + - name: Build with Maven + env: + TEST_MODULES: ${{matrix.test-modules}} + CATEGORY: ${{matrix.category}} + shell: bash + run: | + cd ${QUARKUS_PATH} + if [[ ${{ inputs.builder-image }} == "null" ]] + then + export BUILDER_IMAGE="-Dquarkus.native.container-build=false" + ${GRAALVM_HOME}/bin/native-image --version + else + export BUILDER_IMAGE="-Dquarkus.native.container-build=true -Dquarkus.native.builder-image=${{ inputs.builder-image }}" + fi + # Patch Gradle config to look for GraalVM dependencies in maven local repository + for i in `grep -rl includeGroupByRegex .` + do + sed -i "s/\(^ *includeGroupByRegex\)\( 'io.quarkus.*'\)/\1\2\n\1 'org.graalvm.*'/g" $i + done + # Backwards compatibility with Quarkus < 2.x native-tests.json + if ! echo $TEST_MODULES | grep ',' > /dev/null + then + for i in $TEST_MODULES + do modules+=("$i"); done + IFS=, + TEST_MODULES="${modules[*]}" + # add the 'simple with spaces' project to the run of 'Misc1' by executing it explicitly + # done because there is no good way to pass strings with empty values to the previous command + # so this hack is as good as any + if [ "$CATEGORY" == "Misc1" ]; then + TEST_MODULES="$TEST_MODULES,simple with space" + fi + unset IFS + fi + if [[ $TEST_MODULES == "main" ]] + then + # Build main module with constraint memory to ensure we can build apps on smaller machines too + export NEW_MAX_HEAP_SIZE=-Dquarkus.native.native-image-xmx=5g + fi + ./mvnw -B --settings ${QUARKUS_PATH}/.github/mvn-settings.xml -f integration-tests -pl "$TEST_MODULES" -amd $BUILDER_IMAGE $NATIVE_TEST_MAVEN_OPTS $NEW_MAX_HEAP_SIZE + - name: Prepare failure archive (if maven failed) + if: failure() + shell: bash + run: | + find . -type d -name '*-reports' -o -wholename '*/build/reports/tests/functionalTest' -o -name '*svm_err_*pid*.md' | tar czvf test-reports.tgz -T - + - name: Upload failure Archive (if maven failed) + uses: actions/upload-artifact@v4 + if: failure() + with: + name: test-reports-native-${{matrix.category}}-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: 'test-reports.tgz' + - name: Collect build JSON stats + if: ${{ always() && inputs.build-stats-tag != 'null' }} + shell: bash + run: find . -name '*runner*.json' | tar czvf build-stats.tgz -T - + - name: Upload build JSON stats + if: ${{ always() && inputs.build-stats-tag != 'null' }} + uses: actions/upload-artifact@v4 + with: + name: build-stats-${{matrix.category}}-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: 'build-stats.tgz' + + native-tests-stats-upload: + name: Upload build stats to collector + if: always() && inputs.build-stats-tag != 'null' && github.event_name != 'pull_request' && needs.native-tests.result != 'skipped' && needs.native-tests.result != 'cancelled' + needs: + - native-tests + - get-test-matrix + strategy: + matrix: ${{ fromJson(needs.get-test-matrix.outputs.tests-matrix) }} + uses: ./.github/workflows/native-tests-stats-upload.yml + with: + artifacts-suffix: ${{ needs.get-test-matrix.outputs.artifacts-suffix }} + build-stats-tag: ${{ inputs.build-stats-tag }} + category: ${{ matrix.category }} + + mandrel-integration-tests: + name: Q Mandrel IT + if: always() && needs.build-quarkus.result == 'success' + needs: + - build-vars + - build-mandrel + - get-jdk + - build-quarkus + - get-test-matrix + runs-on: ubuntu-latest + env: + # leave more space for the actual native compilation and execution + MAVEN_OPTS: -Xmx1g + # Don't perform performance checks since GH runners are not that stable + FAIL_ON_PERF_REGRESSION: false + # USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM: false + timeout-minutes: 80 + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v4 + with: + repository: graalvm/mandrel + fetch-depth: 1 + path: workflow-mandrel + - uses: actions/checkout@v4 + with: + repository: Karm/mandrel-integration-tests + fetch-depth: 1 + path: ${{ env.MANDREL_IT_PATH }} + - name: Download Maven Repo + uses: actions/download-artifact@v4 + with: + name: linux-maven-repo-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: . + - name: Extract Maven Repo + run: tar -xzvf maven-repo.tgz -C ~ + # Use Java 17 for Quarkus as it doesn't work with Java 21 yet + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + - name: Download Mandrel or GraalVM + if: inputs.builder-image == 'null' + uses: actions/download-artifact@v4 + with: + name: jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: . + - name: Extract Mandrel or GraalVM + if: inputs.builder-image == 'null' + shell: bash + run: | + mkdir -p ${GRAALVM_HOME} + tar -xzvf jdk.tgz -C ${GRAALVM_HOME} --strip-components=1 + - name: Update Docker Client User Agent + run: | + if [ -f ~/.docker/config.json ]; then + cat <<< $(jq '.HttpHeaders += {"User-Agent": "Mandrel-CI-Docker-Client"}' ~/.docker/config.json) > ~/.docker/config.json.new + mv ~/.docker/config.json.new ~/.docker/config.json + fi + - name: Install gdb + run: | + sudo apt-get update -y + sudo apt-get install -y gdb + - name: Build with Maven + run: | + cd ${MANDREL_IT_PATH} + export PATH="${GRAALVM_HOME}/bin:$PATH" + export QUARKUS_VERSION=${{ needs.get-test-matrix.outputs.quarkus-version }} + # Don't use SNAPSHOT version for 2.2 and release tags + if [ "${{ inputs.quarkus-version }}" == "2.2" ] + then + export QUARKUS_VERSION=2.2.999 + elif $(expr match "${{ inputs.quarkus-version }}" "^[0-9]\+\.[0-9]\+$" > /dev/null) + then + # release branches use the branch name followed by .999-SNAPSHOT as the version + export QUARKUS_VERSION="${{ inputs.quarkus-version }}.999-SNAPSHOT" + elif ! $(expr match "$QUARKUS_VERSION" "^.*\.\(Final\|CR\|Alpha\|Beta\)[0-9]\?$" > /dev/null) + then + export QUARKUS_VERSION="999-SNAPSHOT" + fi + echo $QUARKUS_VERSION + if [[ ${{ inputs.builder-image }} == "null" ]] + then + ${GRAALVM_HOME}/bin/native-image --version + mvn clean verify -Dquarkus.native.native-image-xmx=13g \ + -Dquarkus.version=$QUARKUS_VERSION \ + -Ptestsuite + else + mvn clean verify -Dquarkus.native.native-image-xmx=13g \ + -Dquarkus.version=$QUARKUS_VERSION \ + -Dquarkus.native.builder-image=${{ inputs.builder-image }} \ + -Ptestsuite-builder-image + fi + - name: Prepare failure archive (if maven failed) + if: failure() + run: tar czvf test-reports-mandrel-it.tgz ${MANDREL_IT_PATH}/testsuite/target/archived-logs/ + - name: Upload failure Archive (if maven failed) + uses: actions/upload-artifact@v4 + if: failure() + with: + name: test-reports-mandrel-it-${{ needs.get-test-matrix.outputs.artifacts-suffix }} + path: 'test-reports-mandrel-it.tgz' diff --git a/.github/workflows/build-quarkus.yml b/.github/workflows/build-quarkus.yml new file mode 100644 index 0000000000000..fcb7764564451 --- /dev/null +++ b/.github/workflows/build-quarkus.yml @@ -0,0 +1,135 @@ +name: Build Quarkus + +on: + workflow_call: + inputs: + artifacts-suffix: + type: string + description: 'The maven repo artifact suffix to use' + default: "null" + build-from-source: + type: boolean + description: 'Build from source or use a release' + default: true + builder-image: + type: string + description: 'The builder image to use instead of a release or building from source (e.g. quay.io/quarkus/ubi-quarkus-mandrel:20.3-java11)' + default: "null" + maven-deploy-local: + type: string + description: 'Build flag controlling whether to deploy maven artifacts locally' + default: "" + target-os: + type: string + description: 'The operating system we are building for (linux or windows)' + default: "linux" + quarkus-repo: + type: string + description: 'The Quarkus repository to be used' + default: 'quarkusio/quarkus' + quarkus-version: + type: string + description: 'Quarkus version to test (branch, tag, commit, or "latest")' + # "latest" is replaced by the latest release available in maven + default: "main" + # Builder image can't be tested on Windows due to https://github.com/actions/virtual-environments/issues/1143 + # builder-image: + # description: 'The builder image to use instead of a release or building from source (e.g. quay.io/quarkus/ubi-quarkus-mandrel:20.3-java11)' + # default: "null" + +env: + QUARKUS_PATH: quarkus + COMMON_MAVEN_ARGS: "-e -B --settings .github/mvn-settings.xml --fail-at-end" + MANDREL_HOME: ${{ github.workspace }}/mandrelvm + +jobs: + build-quarkus: + name: Quarkus build + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v4 + with: + repository: graalvm/mandrel + fetch-depth: 1 + path: workflow-mandrel + - uses: actions/checkout@v4 + with: + repository: ${{ inputs.quarkus-repo }} + fetch-depth: 1 + ref: ${{ inputs.quarkus-version }} + path: ${{ env.QUARKUS_PATH }} + - uses: actions/cache@v4 + with: + path: ~/.m2/repository + key: ${{ inputs.target-os }}-${{ inputs.quarkus-version }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ inputs.target-os }}-${{ inputs.quarkus-version }}-maven- + - name: Change quarkus.version for Quarkus 2.2 to make mandrel-integration-test not apply quarkus_main.patch + # See https://github.com/Karm/mandrel-integration-tests/pull/64 + run: | + if [ "${{ inputs.quarkus-version }}" == "2.2" ] + then + cd quarkus + bash ../workflow-mandrel/.github/update_quarkus_version.sh 2.2.999 + fi + # Use Java 17 to build Quarkus as that's the lowest supported JDK version currently + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + - name: Download GraalVM Maven Repo + if: ${{ inputs.build-from-source == true && inputs.builder-image == 'null' && inputs.maven-deploy-local != ''}} + uses: actions/download-artifact@v4 + with: + name: org-graalvm-artefacts-${{ inputs.artifacts-suffix }} + path: . + - name: Download GraalVM Maven Version + if: ${{ inputs.build-from-source == true && inputs.builder-image == 'null' && inputs.maven-deploy-local != ''}} + uses: actions/download-artifact@v4 + with: + name: mandrel-maven-version-${{ inputs.artifacts-suffix }} + path: . + - name: Extract GraalVM Maven Repo and GraalVM Maven Version + if: ${{ inputs.build-from-source == true && inputs.builder-image == 'null' && inputs.maven-deploy-local != ''}} + run: | + tar -xzvf graalvm-maven-artefacts.tgz -C ~ + tar -xzvf graalvm-version.tgz -C $(dirname ${MANDREL_HOME}) + - name: Build quarkus with local graalvm version + if: ${{ inputs.build-from-source == true && inputs.builder-image == 'null' && inputs.maven-deploy-local != ''}} + run: | + rm -f maven_graalvm_before_build.txt maven_graalvm_after_build.txt + find ~/.m2/repository/org/graalvm | sort > maven_graalvm_before_build.txt + GRAAL_MVN_ARTIFACTS_VERS=$(cat ${MANDREL_HOME}/.maven-version) + echo "Building quarkus with locally installed GraalVM maven artefacts in version: ${GRAAL_MVN_ARTIFACTS_VERS}" + cd ${QUARKUS_PATH} + ./mvnw ${COMMON_MAVEN_ARGS} -Dquickly -Dgraal-sdk.version="${GRAAL_MVN_ARTIFACTS_VERS}" + cd - + find ~/.m2/repository/org/graalvm | sort > maven_graalvm_after_build.txt + diff -u maven_graalvm_before_build.txt maven_graalvm_after_build.txt + - name: Build quarkus with default graalvm version + if: ${{ inputs.build-from-source == false || inputs.builder-image != 'null' || inputs.maven-deploy-local == ''}} + run: | + cd ${QUARKUS_PATH} + ./mvnw ${COMMON_MAVEN_ARGS} -Dquickly + cd - + - name: Tar Maven Repo + if: inputs.target-os != 'windows' + run: | + tar -czvf maven-repo.tgz -C ~ .m2/repository + - name: Tar Maven Repo (windows) + if: inputs.target-os == 'windows' + run: | + tar -I 'pigz -9' -cf maven-repo.tgz -C ~ .m2/repository + - name: Persist Maven Repo + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.target-os }}-maven-repo-${{ inputs.artifacts-suffix }} + path: maven-repo.tgz + - name: Delete Local Quarkus Artifacts From Cache + run: | + rm -r ~/.m2/repository/io/quarkus + - name: Delete Local GraalVM Artifacts From Cache + if: ${{ inputs.build-from-source == true && inputs.builder-image == 'null' && inputs.maven-deploy-local != ''}} + run: | + rm -rf ~/.m2/repository/org/graalvm diff --git a/.github/workflows/mandrel.yml b/.github/workflows/mandrel.yml new file mode 100644 index 0000000000000..c92a854922a0f --- /dev/null +++ b/.github/workflows/mandrel.yml @@ -0,0 +1,47 @@ +name: Mandrel-Quarkus tests + +on: + push: + paths-ignore: + - '.github/workflows/main.yml' + - '.github/workflows/quarkus.yml' + - '**.md' + pull_request: + paths-ignore: + - '.github/workflows/main.yml' + - '.github/workflows/quarkus.yml' + - '**.md' + workflow_dispatch: + +# The following aims to reduce CI CPU cycles by: +# 1. Cancelling any previous builds of this PR when pushing new changes to it +# 2. Cancelling any previous builds of a branch when pushing new changes to it in a fork +# 3. Cancelling any pending builds, but not active ones, when pushing to a branch in the main +# repository. This prevents us from constantly cancelling CI runs, while being able to skip +# intermediate builds. E.g., if we perform two pushes the first one will start a CI job and +# the second one will add another one to the queue; if we perform a third push while the +# first CI job is still running the previously queued CI job (for the second push) will be +# cancelled and a new CI job will be queued for the latest (third) push. +concurrency: + group: "workflow = ${{ github.workflow }}, ref = ${{ github.event.ref }}, pr = ${{ github.event.pull_request.id }}" + cancel-in-progress: ${{ github.event_name == 'pull_request' || github.repository != 'graalvm/mandrel' }} + +jobs: + q-main-ea: + name: "Q main M 24.1 EA" + uses: ./.github/workflows/base.yml + with: + quarkus-version: "main" + repo: ${{ github.repository }} + version: ${{ github.ref }} + mandrel-packaging-version: "24.1" + jdk: "23/ea" + q-main-ea-win: + name: "Q main M 24.1 windows EA" + uses: ./.github/workflows/base-windows.yml + with: + quarkus-version: "main" + repo: ${{ github.repository }} + version: ${{ github.ref }} + mandrel-packaging-version: "24.1" + jdk: "23/ea" diff --git a/.github/workflows/native-tests-stats-upload.yml b/.github/workflows/native-tests-stats-upload.yml new file mode 100644 index 0000000000000..54291b5bf7f45 --- /dev/null +++ b/.github/workflows/native-tests-stats-upload.yml @@ -0,0 +1,46 @@ +name: Native tests stats upload + +on: + workflow_call: + inputs: + artifacts-suffix: + type: string + description: 'The stats artifact suffix to download' + default: "null" + build-stats-tag: + type: string + description: 'The tag to use for build stats upload of native tests (e.g. 22.3.0-dev-jdk17-mytest-patch-before)' + default: "null" + category: + type: string + description: 'The native integration test category to upload stats for' + default: "null" + secrets: + UPLOAD_COLLECTOR_TOKEN: + description: 'A token used to report build statistics to a collector' + required: false + +jobs: + native-tests-stats-upload: + name: Upload build stats to collector + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + repository: graalvm/mandrel + fetch-depth: 1 + path: workflow-mandrel + - uses: actions/download-artifact@v4 + with: + name: build-stats-${{inputs.category}}-${{ inputs.artifacts-suffix }} + path: . + - name: Extract and import build stats + env: + BUILD_STATS_TAG: ${{ inputs.build-stats-tag }} + UPLOAD_TOKEN: ${{ secrets.UPLOAD_COLLECTOR_TOKEN }} + COLLECTOR_URL: https://collector.foci.life/api/v1/image-stats + shell: bash + run: | + tar -xf build-stats.tgz + echo "Tag for stat upload is going to be: '${BUILD_STATS_TAG}'" + DIR=quarkus/ TAG="${BUILD_STATS_TAG}" TOKEN="${UPLOAD_TOKEN}" URL="${COLLECTOR_URL}" bash workflow-mandrel/.github/import_stats.sh \ No newline at end of file diff --git a/README-Mandrel.md b/README-Mandrel.md new file mode 100644 index 0000000000000..2774ce27ae06f --- /dev/null +++ b/README-Mandrel.md @@ -0,0 +1,76 @@ +# Mandrel + +Mandrel is [a downstream distribution of the GraalVM community edition](https://developers.redhat.com/blog/2020/06/05/mandrel-a-community-distribution-of-graalvm-for-the-red-hat-build-of-quarkus/). +Mandrel's main goal is to provide a `native-image` release specifically to support [Quarkus](https://quarkus.io). +The aim is to align the `native-image` capabilities from GraalVM with OpenJDK and Red Hat Enterprise Linux libraries to improve maintainability for native Quarkus applications. +Mandrel can best be described as a distribution of a regular OpenJDK with a specially packaged GraalVM Native Image builder (`native-image`). + +## How Does Mandrel Differ From Graal + +Mandrel releases are built from a code base derived from the upstream GraalVM code base, with only minor changes but some significant exclusions. +A full distribution of GraalVM is much more than `native-image`: it has polyglot support, the Truffle framework which allows for efficient implementation of interpreters, an LLVM compiler back end for native image, the libgraal JIT compiler as a replacement for Hotspot’s C2 server compiler and much more. +Mandrel is the small subset of that functionality we support for the `native-image` use-case. + +Mandrel's `native-image` also doesn't include the following features: +* The experimental image-build server, i.e., the `--experimental-build-server` option. +* The LLVM backend, i.e., the `-H:CompilerBackend=llvm` option. +* The musl libc implementation, i.e., the `--libc=musl` option. +* Support for generating static native images, i.e., the `--static` option. +* Support for non JVM-based languages and polyglot, i.e., the `--language:` option. + +Mandrel is also built slightly differently to GraalVM, using the standard OpenJDK project release of jdk17u. +This means it does not profit from a few small enhancements that Oracle have added to the version of OpenJDK used to build their own GraalVM downloads. +Most of these enhancements are to the JVMCI module that allows the Graal compiler to be run inside OpenJDK. +The others are small cosmetic changes to behaviour. +These enhancements may in some cases cause minor differences in the progress of native image generation. +They should not cause the resulting images themselves to execute in a noticeably different manner. + +## Communication Channels + +* [Slack](https://www.graalvm.org/slack-invitation) - Join `#mandrel` channel at graalvm's slack workspace +* [graalvm-dev@oss.oracle.com](mailto:graalvm-dev@oss.oracle.com?subject=[MANDREL]) mailing list - Subscribe [here](https://oss.oracle.com/mailman/listinfo/graalvm-dev) +* [GitHub issues](https://github.com/graalvm/mandrel/issues) for bug reports, questions, or requests for enhancements. + +Please report security vulnerabilities according to the [Reporting Vulnerabilities guide](https://www.oracle.com/corporate/security-practices/assurance/vulnerability/reporting.html). + +## Getting Started + +Mandrel distributions can be downloaded from [the repository's releases](https://github.com/graalvm/mandrel/releases) +and container images are available at [quay.io](https://quay.io/repository/quarkus/ubi-quarkus-mandrel-builder-image?tag=latest&tab=tags). + +### Prerequisites + +Mandrel's `native-image` depends on the following packages: +* freetype-devel +* gcc +* glibc-devel +* libstdc++-static +* zlib-devel + +On Fedora/CentOS/RHEL they can be installed with: +```bash +dnf install glibc-devel zlib-devel gcc freetype-devel libstdc++-static +``` + +**Note**: The package might be called `glibc-static` or `libstdc++-devel` instead of `libstdc++-static` depending on your system. +If the system is missing stdc++, `gcc-c++` package is needed too. + +On Ubuntu-like systems with: +```bash +apt install g++ zlib1g-dev libfreetype6-dev +``` + +## Building Mandrel From Source + +For building Mandrel from source please see [mandrel-packaging](https://github.com/graalvm/mandrel-packaging) +and consult [Repository Structure in CONTRIBUTING.md](CONTRIBUTING.md#repository-structure) regarding which branch of Mandrel to use. + +# Community +Empowering Software Development with Works on Arm Initiative +![Works on Arm logo](img/works_on_arm_900x77.png) +[Works on Arm](https://www.arm.com/solutions/infrastructure/works-on-arm) is a strategic initiative to enable and accelerate the +software ecosystem for Arm64. + +[GraalVM's](https://www.graalvm.org/) [Mandrel](https://github.com/graalvm/mandrel) distribution that +powers [Quarkus Native](https://quarkus.io/guides/building-native-image) proudly counts itself among the libraries and +tools that successfully leveraged the resources from Works on Arm. diff --git a/compiler/mx.compiler/suite.py b/compiler/mx.compiler/suite.py index 81fbe9c6a1116..3d26e1d24b12a 100644 --- a/compiler/mx.compiler/suite.py +++ b/compiler/mx.compiler/suite.py @@ -4,7 +4,7 @@ "sourceinprojectwhitelist" : [], "groupId" : "org.graalvm.compiler", - "version" : "24.1.0", + "version" : "24.1.0.0", "release" : False, "url" : "http://www.graalvm.org/", "developer" : { diff --git a/espresso/mx.espresso/suite.py b/espresso/mx.espresso/suite.py index c61642eee4bd6..c66ae21ae8930 100644 --- a/espresso/mx.espresso/suite.py +++ b/espresso/mx.espresso/suite.py @@ -24,7 +24,7 @@ suite = { "mxversion": "7.27.1", "name": "espresso", - "version" : "24.1.0", + "version" : "24.1.0.0", "release" : False, "groupId" : "org.graalvm.espresso", "url" : "https://www.graalvm.org/reference-manual/java-on-truffle/", diff --git a/regex/mx.regex/suite.py b/regex/mx.regex/suite.py index 0de9acaab2b8e..55d2b16a586f2 100644 --- a/regex/mx.regex/suite.py +++ b/regex/mx.regex/suite.py @@ -43,7 +43,7 @@ "name" : "regex", - "version" : "24.1.0", + "version" : "24.1.0.0", "release" : False, "groupId" : "org.graalvm.regex", "url" : "http://www.graalvm.org/", diff --git a/sdk/mx.sdk/suite.py b/sdk/mx.sdk/suite.py index c20d38222164c..9e1f92cc050f4 100644 --- a/sdk/mx.sdk/suite.py +++ b/sdk/mx.sdk/suite.py @@ -41,7 +41,7 @@ suite = { "mxversion": "7.27.0", "name" : "sdk", - "version" : "24.1.0", + "version" : "24.1.0.0", "release" : False, "sourceinprojectwhitelist" : [], "url" : "https://github.com/oracle/graal", diff --git a/substratevm/mx.substratevm/suite.py b/substratevm/mx.substratevm/suite.py index 01ea592cca0c3..c4f7c7060a155 100644 --- a/substratevm/mx.substratevm/suite.py +++ b/substratevm/mx.substratevm/suite.py @@ -2,7 +2,7 @@ suite = { "mxversion": "7.27.1", "name": "substratevm", - "version" : "24.1.0", + "version" : "24.1.0.0", "release" : False, "url" : "https://github.com/oracle/graal/tree/master/substratevm", diff --git a/tools/mx.tools/suite.py b/tools/mx.tools/suite.py index 23bbed175d031..e05f9acdf11f8 100644 --- a/tools/mx.tools/suite.py +++ b/tools/mx.tools/suite.py @@ -26,7 +26,7 @@ "defaultLicense" : "GPLv2-CPE", "groupId" : "org.graalvm.tools", - "version" : "24.1.0", + "version" : "24.1.0.0", "release" : False, "url" : "http://openjdk.java.net/projects/graal", "developer" : { diff --git a/truffle/mx.truffle/suite.py b/truffle/mx.truffle/suite.py index afa070a9ae754..594530d215b5f 100644 --- a/truffle/mx.truffle/suite.py +++ b/truffle/mx.truffle/suite.py @@ -41,7 +41,7 @@ suite = { "mxversion": "7.27.1", "name" : "truffle", - "version" : "24.1.0", + "version" : "24.1.0.0", "release" : False, "groupId" : "org.graalvm.truffle", "sourceinprojectwhitelist" : [], diff --git a/vm/mx.vm/suite.py b/vm/mx.vm/suite.py index f8a1bfc58c076..648ec6b2d1723 100644 --- a/vm/mx.vm/suite.py +++ b/vm/mx.vm/suite.py @@ -1,6 +1,6 @@ suite = { "name": "vm", - "version" : "24.1.0", + "version" : "24.1.0.0", "mxversion": "7.27.0", "release" : False, "groupId" : "org.graalvm", diff --git a/wasm/mx.wasm/suite.py b/wasm/mx.wasm/suite.py index fcb601e852d3e..0aac3d60f6006 100644 --- a/wasm/mx.wasm/suite.py +++ b/wasm/mx.wasm/suite.py @@ -42,7 +42,7 @@ "mxversion": "7.27.1", "name" : "wasm", "groupId" : "org.graalvm.wasm", - "version" : "24.1.0", + "version" : "24.1.0.0", "versionConflictResolution" : "latest", "url" : "http://graalvm.org/", "developer" : {