├── .github ├── ISSUE_TEMPLATE │ ├── ---backport-request.md │ ├── ---bug-report.md │ ├── ---feature-request.md │ └── config.yml ├── import_stats.sh ├── quarkus-ecosystem-issue.java ├── update_quarkus_version.sh └── workflows │ ├── base-windows-wrapper.yml │ ├── base-windows.yml │ ├── base-wrapper.yml │ ├── base.yml │ ├── build-quarkus.yml │ ├── github-issue-updater.yml │ ├── mark-stale-issues-and-prs.yml │ ├── native-tests-stats-upload.yml │ ├── nightly.yml │ ├── repo-sync.yml │ └── weekly.yml ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SECURITY.md ├── THIRD_PARTY_LICENSE.txt └── img └── works_on_arm_900x77.png /.github/ISSUE_TEMPLATE/---backport-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F519 Backport request" 3 | about: 'Create a backport request for a release branch. ' 4 | title: '[] Backport: ' 5 | labels: backport 6 | assignees: '' 7 | --- 8 | 9 | ## What would you like to backport? 10 | Provide a link to the PR or commit (list) you would like to backport. 11 | 12 | ## Why? 13 | Explain why this backport is important. 14 | 15 | ## Are the changes being backported merged in upstream Graal? 16 | 17 | - [ ] Yes 18 | - [ ] No 19 | 20 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/---bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F41E Bug report" 3 | about: 'Create a report to help us improve. To report a security vulnerability, please 4 | see below or the SECURITY.md file at the root of the repository. Do not open a GitHub 5 | issue. ' 6 | title: '' 7 | labels: bug 8 | assignees: '' 9 | 10 | --- 11 | 12 | ## Description 13 | A clear and concise description of what the bug is. 14 | 15 | ## How To Reproduce 16 | Steps to reproduce the behavior: 17 | 1. `git clone ...` 18 | 2. `native-image ...` 19 | 3. `mycmd ...` 20 | 21 | ### Configuration: 22 | - OS: [e.g. Ubuntu 18.04, Fedora 32] 23 | - Architecture: [e.g. AMD64, A] 24 | - Mandrel version: [e.g. 20.1.0.0.Alpha1] 25 | - JDK version: [e.g. OpenJDK 11.0.8+5] 26 | 27 | ## Expected behavior 28 | A clear and concise description of what you expected to happen. 29 | ``` 30 | Expected output 31 | ``` 32 | 33 | ## Additional context 34 | Add any other context about the problem here. 35 | ``` 36 | Add logs and stack traces here 37 | ``` 38 | If applicable, add screenshots to help explain your problem. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/---feature-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F9E9 Feature request" 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Need help or have a question? 4 | url: https://www.graalvm.org/slack-invitation/ 5 | about: Visit our slack channel. 6 | -------------------------------------------------------------------------------- /.github/import_stats.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Import graal stats into collector 3 | # 4 | # Usage: 5 | # DIR=quarkus/ TAG=gha-jdk11-mandrel-22.3.0-dev URL=http://127.0.0.1:8080/api/v1/image-stats bash import_stats.sh 6 | # 7 | 8 | #set -e 9 | 10 | usage() { 11 | local missing="$1" 12 | echo "Error: '$missing' must be specified!" 1>&2 13 | echo 1>&2 14 | echo "usage:" 1>&2 15 | echo " DIR=quarkus/ TAG=gha-jdk11-mandrel-22.3.0-dev TOKEN=<token> URL=http://127.0.0.1:8080/api/v1/image-stats bash import_stats.sh" 1>&2 16 | exit 1 17 | } 18 | 19 | if [ "${DIR}_" == "_" ]; then 20 | usage "DIR" 21 | elif [ "${TAG}_" == "_" ]; then 22 | usage "TAG" 23 | elif [ "${URL}_" == "_" ]; then 24 | usage "URL" 25 | elif [ "${TOKEN}_" == "_" ]; then 26 | usage "TOKEN" 27 | fi 28 | 29 | for bs in $(find $DIR -name \*build-output-stats.json); do 30 | f=$(echo "$bs" | sed 's/\(.*\)-build-output-stats\.json/\1/g') 31 | d=$(dirname $bs) 32 | ts="${f}-timing-stats.json" 33 | # import the stat 34 | stat_id=$(curl -s -w '\n' -H "Content-Type: application/json" \ 35 | -H "token: $TOKEN" --post302 --data "@$(pwd)/$bs" "$URL/import?t=$TAG" | jq .id) 36 | # update timing info if present 37 | if [ -e "$ts" ]; then 38 | curl -s -w '\n' -H "Content-Type: application/json" -H "token: $TOKEN" \ 39 | -X PUT --data "@$ts" "$URL/$stat_id" > /dev/null 40 | fi 41 | done 42 | -------------------------------------------------------------------------------- /.github/quarkus-ecosystem-issue.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020,2024 Red Hat, Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | //usr/bin/env jbang "$0" "$@" ; exit $? 18 | 19 | //JAVA 21 20 | //DEPS org.kohsuke:github-api:1.327 21 | //DEPS info.picocli:picocli:4.7.7 22 | 23 | import org.kohsuke.github.GHIssue; 24 | import org.kohsuke.github.GHIssueState; 25 | import org.kohsuke.github.GHRepository; 26 | import org.kohsuke.github.GHWorkflowJob; 27 | import org.kohsuke.github.GHWorkflowRun; 28 | import org.kohsuke.github.GHWorkflowRun.Conclusion; 29 | import org.kohsuke.github.GitHub; 30 | import org.kohsuke.github.GitHubBuilder; 31 | import org.kohsuke.github.function.InputStreamFunction; 32 | import org.kohsuke.github.PagedIterable; 33 | 34 | import picocli.CommandLine; 35 | import picocli.CommandLine.Command; 36 | import picocli.CommandLine.Option; 37 | 38 | import java.io.IOException; 39 | import java.io.UncheckedIOException; 40 | import java.util.HashMap; 41 | import java.util.List; 42 | import java.util.Map; 43 | import java.util.regex.Matcher; 44 | import java.util.regex.Pattern; 45 | import java.io.BufferedReader; 46 | import java.io.InputStreamReader; 47 | 48 | @Command(name = "report", mixinStandardHelpOptions = true, 49 | description = "Takes care of updating an issue depending on the status of the build") 50 | class Report implements Runnable { 51 | 52 | // Github uses " / " to separate a parent job title from a child job title, 53 | // e.g.: "Q main M 24 latest windows / Mandrel build" shows that the job 54 | // "Mandrel build" is a child of the job "Q main M 24 latest windows". 55 | // Similarly, there is a job "Q main M 24 latest / Mandrel build" for runs 56 | // on linux. We use this delimiter to get the parent job title and report 57 | // failures to the issue corresponding to that job. 58 | // The use of (?<=...) is a positive lookbehind, which means that the delimiter 59 | // will be included in the match. 60 | private static final String JOB_TITLE_DELIMITER = "(?<=( / ))"; 61 | 62 | @Option(names = "token", description = "Github token to use when calling the Github API", required = true) 63 | private String token; 64 | 65 | @Option(names = "thisRepo", description = "The repository for which we are reporting the CI status", required = true) 66 | private String thisRepo; 67 | 68 | @Option(names = "runId", description = "The ID of the Github Action run for which we are reporting the CI status", required = true) 69 | private String runId; 70 | 71 | @Option(names = "--dry-run", description = "Whether to actually update the issue or not") 72 | private boolean dryRun; 73 | 74 | @Override 75 | public void run() { 76 | try { 77 | final GitHub github = new GitHubBuilder().withOAuthToken(token).build(); 78 | final GHRepository workflowRepository = github.getRepository(thisRepo); 79 | GHWorkflowRun workflowRun = workflowRepository.getWorkflowRun(Long.parseLong(runId)); 80 | Conclusion status = workflowRun.getConclusion(); 81 | 82 | System.out.println(String.format("The CI build had status %s.", status)); 83 | 84 | if (status.equals(Conclusion.CANCELLED) || status.equals(Conclusion.SKIPPED)) { 85 | System.out.println("Job status is `cancelled` or `skipped` - exiting"); 86 | System.exit(0); 87 | } 88 | 89 | 90 | // We use HashMaps to store the issues and their corresponding job 91 | // name prefixes. For each job prefix we keep two issues, one for 92 | // quarkus integration tests and the other for mandrel integration 93 | // tests. 94 | final Map<GHIssue, String> issues = new HashMap<>(); 95 | final Map<GHIssue, String> mandrelITIssues = new HashMap<>(); 96 | // We use two more HashMaps to associate issues with known job failures 97 | final Map<GHIssue, List<GHWorkflowJob>> failedMandrelJobs = new HashMap<>(); 98 | final Map<GHIssue, List<GHWorkflowJob>> failedMandrelITJobs = new HashMap<>(); 99 | 100 | // Get the github issue number and repository from the logs 101 | // 102 | // Unfortunately it's not possible to pass information from a triggering 103 | // workflow to the triggered workflow (in this case Nightly/Weekly CI to 104 | // the Github Issue Updater). As a result, to work around this, we parse 105 | // the logs of the jobs of the workflow that triggered this workflow, in 106 | // these logs we can find information like the inputs "issue-number", 107 | // "issue-repo" etc. But we still need to somehow group the jobs 108 | // corresponding to the detected issue-numbers. To do so, we first parse 109 | // the logs of the "Set distribution" job, which is the first job of each 110 | // configuration. This job contains the issue-number and issue-repo inputs 111 | // which we use to get the github issue and map it to the job name prefix 112 | // of jobs that are part of the same configuration. 113 | // 114 | // We then check the status of the jobs of the triggered workflow, and 115 | // if any of them failed, we check if the job name starts with one of the 116 | // job name prefixes we found earlier. If it does, we add it to the list 117 | // of failed jobs for the corresponding issue. 118 | // 119 | // Finally, we process the list of failed jobs for each issue, and if 120 | // the issue is still open, we add a comment with the list of failed jobs 121 | // and the filtered logs of the first failed job. 122 | // 123 | // Mandrel integration tests are treated specially, as they have a fixed 124 | // issue repository, we can directly get the issue number from the logs 125 | // of the job, and we don't need to group the jobs by issue number, since 126 | // the structure of the workflow is simpler. 127 | PagedIterable<GHWorkflowJob> listJobs = workflowRun.listJobs(); 128 | listJobs.forEach(job -> { 129 | // Each configuration starts with the Set distribution job 130 | if (job.getName().contains("Set distribution")) { 131 | processLogs(github, job, issues, mandrelITIssues, this::processITJobs, "issue-number", "issue-repo"); 132 | } else if (job.getConclusion().equals(Conclusion.FAILURE) && (job.getName().contains("Q IT") || job.getName().contains("Mandrel build") || job.getName().contains("Quarkus build"))) { 133 | recordFailedJob(failedMandrelJobs, issues, job); 134 | } else if (job.getName().contains("Q Mandrel IT") && job.getConclusion().equals(Conclusion.FAILURE)) { 135 | recordFailedJob(failedMandrelITJobs, mandrelITIssues, job); 136 | } else if (job.getName().startsWith("Keep graal/master in sync")) { 137 | processLogs(github, job, issues, null, this::processSyncJobs, "issue-number", "issue-repo"); 138 | } 139 | }); 140 | 141 | // Process the failed jobs 142 | for (GHIssue issue: issues.keySet()) { 143 | List<GHWorkflowJob> failedJobs = failedMandrelJobs.get(issue); 144 | reportFailedJobs(issue, failedJobs); 145 | } 146 | for (GHIssue issue: mandrelITIssues.keySet()) { 147 | List<GHWorkflowJob> failedJobs = failedMandrelITJobs.get(issue); 148 | reportFailedJobs(issue, failedJobs); 149 | } 150 | } 151 | catch (IOException e) { 152 | throw new UncheckedIOException(e); 153 | } 154 | } 155 | 156 | 157 | private void recordFailedJob(final Map<GHIssue, List<GHWorkflowJob>> failedJobs, Map<GHIssue, String> issues, GHWorkflowJob job) { 158 | for (GHIssue issue: issues.keySet()) { 159 | if (job.getName().startsWith(issues.get(issue))) { 160 | List<GHWorkflowJob> failedJobsList = failedJobs.computeIfAbsent(issue, k -> new java.util.ArrayList<>()); 161 | System.out.printf("Adding job %s to the list of failed jobs for issue %s\n", job.getName(), issue.getHtmlUrl().toString()); 162 | failedJobsList.add(job); 163 | } 164 | } 165 | } 166 | 167 | 168 | private void reportFailedJobs(GHIssue issue, List<GHWorkflowJob> failedJobs) throws IOException { 169 | if (failedJobs == null || failedJobs.isEmpty()) { 170 | if (isOpen(issue)) { 171 | String comment = String.format("Build fixed:\n* Link to latest CI run: https://github.com/%s/actions/runs/%s", thisRepo, runId); 172 | if (!dryRun) { 173 | // close issue with a comment 174 | issue.comment(comment); 175 | issue.close(); 176 | } 177 | System.out.printf("Comment added on issue %s\n%s\n, the issue has also been closed\n", issue.getHtmlUrl().toString(), comment); 178 | } else { 179 | System.out.println("Nothing to do - the build passed and the issue is already closed"); 180 | } 181 | } else { 182 | StringBuilder sb = new StringBuilder(); 183 | if (isOpen(issue)) { 184 | sb.append("The build is still failing!\n\n"); 185 | } else { 186 | sb.append("Unfortunately, the build failed!\n\n"); 187 | if (!dryRun) { 188 | issue.reopen(); 189 | } 190 | System.out.println("The issue has been re-opened"); 191 | } 192 | for (GHWorkflowJob job: failedJobs) { 193 | processFailedJob(sb, job); 194 | } 195 | sb.append(String.format("Link to failing CI run: https://github.com/%s/actions/runs/%s", thisRepo, runId)); 196 | String comment = sb.toString(); 197 | if (!dryRun) { 198 | issue.comment(comment); 199 | } 200 | System.out.printf("\nComment added on issue %s\n\n%s\n\n", issue.getHtmlUrl().toString(), comment); 201 | } 202 | } 203 | 204 | 205 | private void processLogs(GitHub github, GHWorkflowJob job, Map<GHIssue, String> issues, Map<GHIssue, String> mandrelITIssues, 206 | TriConsumer<GHIssue, GHWorkflowJob, Map<GHIssue, String>> process, String... filters) { 207 | String fullContent = getJobsLogs(job, filters); 208 | if (fullContent.isEmpty()) { 209 | return; 210 | } 211 | // Get the issue number and repository for quarkus integration test issues reported in the Mandrel repository 212 | Matcher issueNumberMatcher = Pattern.compile(" issue-number: (\\d+)").matcher(fullContent); 213 | Matcher issueRepoMatcher = Pattern.compile(" issue-repo: (.*)").matcher(fullContent); 214 | if (issueNumberMatcher.find() && issueRepoMatcher.find()) { 215 | int issueNumber = Integer.parseInt(issueNumberMatcher.group(1)); 216 | String issueRepo = issueRepoMatcher.group(1); 217 | 218 | System.out.printf("Found issue https://github.com/%s/issues/%s in logs for job %s\n", issueRepo, issueNumber, job.getName()); 219 | try { 220 | GHRepository issueRepository = github.getRepository(issueRepo); 221 | GHIssue issue = issueRepository.getIssue(issueNumber); 222 | process.accept(issue, job, issues); 223 | } catch (IOException e) { 224 | throw new UncheckedIOException(e); 225 | } 226 | } 227 | // Get the issue number for mandrel integration test issues reported in the mandrel integration tests repository 228 | issueNumberMatcher = Pattern.compile(" mandrel-it-issue-number: (\\d+)").matcher(fullContent); 229 | if (issueNumberMatcher.find()) { 230 | int issueNumber = Integer.parseInt(issueNumberMatcher.group(1)); 231 | System.out.printf("Found issue https://github.com/karm/mandrel-integration-tests/issues/%s in logs for job %s\n", issueNumber, job.getName()); 232 | try { 233 | GHRepository issueRepository = github.getRepository("karm/mandrel-integration-tests"); 234 | GHIssue issue = issueRepository.getIssue(issueNumber); 235 | process.accept(issue, job, mandrelITIssues); 236 | } catch (IOException e) { 237 | throw new UncheckedIOException(e); 238 | } 239 | } 240 | } 241 | 242 | private void processITJobs(GHIssue issue, GHWorkflowJob job, Map<GHIssue, String> issues) { 243 | if (issue == null) { 244 | System.out.printf("Unable to find the issue %s in project %s\n", issue.getNumber(), issue.getRepository().getName()); 245 | System.exit(-1); 246 | } else { 247 | System.out.printf("Report issue found: %s - %s\n", issue.getTitle(), issue.getHtmlUrl().toString()); 248 | System.out.printf("The issue is currently %s\n", issue.getState().toString()); 249 | Object oldIssue = issues.put(issue, job.getName().split(JOB_TITLE_DELIMITER)[0]); 250 | if (oldIssue != null) { 251 | System.out.println("WARNING: The issue has already been seen, please check the workflow configuration"); 252 | }; 253 | } 254 | } 255 | 256 | private void processSyncJobs(GHIssue issue, GHWorkflowJob job, Map<GHIssue, String> issues) { 257 | try { 258 | if (issue == null) { 259 | System.out.printf("Unable to find the issue %s in project %s\n", issue.getNumber(), issue.getRepository().getName()); 260 | System.exit(-1); 261 | } else { 262 | System.out.printf("Report issue found: %s - %s\n", issue.getTitle(), issue.getHtmlUrl().toString()); 263 | System.out.printf("The issue is currently %s\n", issue.getState().toString()); 264 | if (job.getConclusion().equals(Conclusion.SUCCESS)) { 265 | if (isOpen(issue)) { 266 | String comment = String.format("Synchronization fixed:\n* Link to latest CI run: https://github.com/%s/actions/runs/%s", thisRepo, runId); 267 | if (!dryRun) { 268 | // close issue with a comment 269 | issue.comment(comment); 270 | issue.close(); 271 | } 272 | System.out.printf("Comment added on issue %s\n%s\n, the issue has also been closed\n", issue.getHtmlUrl().toString(), comment); 273 | } else { 274 | System.out.println("Nothing to do - the synchronization passed and the issue is already closed"); 275 | } 276 | } else if (job.getConclusion().equals(Conclusion.FAILURE)) { 277 | StringBuilder sb = new StringBuilder(); 278 | if (isOpen(issue)) { 279 | sb.append("The synchronization is still failing!\n\n"); 280 | } else { 281 | sb.append("Unfortunately, the synchronization failed!\n\n"); 282 | if (!dryRun) { 283 | issue.reopen(); 284 | } 285 | System.out.println("The issue has been re-opened"); 286 | } 287 | sb.append(String.format("Link to failing CI run: %s", job.getHtmlUrl())); 288 | String comment = sb.toString(); 289 | if (!dryRun) { 290 | issue.comment(comment); 291 | } 292 | System.out.printf("\nComment added on issue %s\n\n%s\n\n", issue.getHtmlUrl().toString(), comment); 293 | } 294 | } 295 | } catch (IOException e) { 296 | throw new UncheckedIOException(e); 297 | } 298 | } 299 | 300 | private void processFailedJob(StringBuilder sb, GHWorkflowJob job) { 301 | sb.append(String.format("* [%s](%s)\n", job.getName(), job.getHtmlUrl())); 302 | GHWorkflowJob.Step step = job.getSteps().stream() 303 | .filter(s -> !(s.getConclusion().equals(Conclusion.SUCCESS) || s.getConclusion().equals(Conclusion.SKIPPED))) 304 | .findFirst().get(); 305 | sb.append(String.format(" * Step: %s\n", step.getName())); 306 | String fullContent = getJobsLogs(job, 307 | "FAILURE [", 308 | "Z Error:", 309 | " Time elapsed: ", 310 | "Z [ERROR] ", 311 | "Z [ERROR] Failures", 312 | "Z [ERROR] Tests run:"); 313 | if (!fullContent.isEmpty()) { 314 | sb.append(String.format(" Filtered Logs:\n```\n%s```\n\n", fullContent)); 315 | } 316 | } 317 | 318 | private String getJobsLogs(GHWorkflowJob job, String... filters) { 319 | String fullContent = ""; 320 | try { 321 | System.out.printf("\nGetting logs for job %s\n", job.getName()); 322 | fullContent = job.downloadLogs(getLogArchiveInputStreamFunction(filters)); 323 | } catch (IOException e) { 324 | System.out.printf("Unable to get logs for job %s (%s)\n", job.getName(), job.getHtmlUrl()); 325 | throw new UncheckedIOException(e); 326 | } 327 | return fullContent; 328 | } 329 | 330 | private static InputStreamFunction<String> getLogArchiveInputStreamFunction(String... filters) { 331 | return (is) -> { 332 | StringBuilder stringBuilder = new StringBuilder(); 333 | try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is))) { 334 | String line; 335 | while ((line = bufferedReader.readLine()) != null) { 336 | if (filters.length == 0) { 337 | stringBuilder.append(line); 338 | stringBuilder.append(System.lineSeparator()); 339 | } else { 340 | for (String filter : filters) { 341 | if (line.contains(filter)) { 342 | stringBuilder.append(line); 343 | stringBuilder.append(System.lineSeparator()); 344 | break; 345 | } 346 | } 347 | } 348 | } 349 | } 350 | return stringBuilder.toString(); 351 | }; 352 | } 353 | 354 | private static boolean isOpen(GHIssue issue) { 355 | return (issue.getState() == GHIssueState.OPEN); 356 | } 357 | 358 | public static void main(String... args) { 359 | int exitCode = new CommandLine(new Report()).execute(args); 360 | System.exit(exitCode); 361 | } 362 | 363 | @FunctionalInterface 364 | interface TriConsumer<T, U, V> { 365 | void accept(T t, U u, V v); 366 | } 367 | } 368 | -------------------------------------------------------------------------------- /.github/update_quarkus_version.sh: -------------------------------------------------------------------------------- 1 | find -type f \( -name "*.xml" -o -name "*.properties" -o -name "*.java" \) -exec sed -i "s/999-SNAPSHOT/$1/g" {} + 2 | -------------------------------------------------------------------------------- /.github/workflows/base-windows-wrapper.yml: -------------------------------------------------------------------------------- 1 | # Enable base.yml to be executed as a dispatch workflow with: 2 | # 3 | # gh workflow run base-windows-wrapper.yml \ 4 | # -f quarkus-repo=gsmet/quarkus -f quarkus-version=2.2.4-backports-1 \ 5 | # -f builder-image="quay.io/quarkus/ubi-quarkus-mandrel:21.3-java11" 6 | name: Mandrel-Quarkus windows tests wrapper 7 | 8 | on: 9 | workflow_dispatch: 10 | inputs: 11 | quarkus-version: 12 | type: string 13 | description: 'Quarkus version to test (branch, tag, commit, or "latest")' 14 | # "latest" is replaced by the latest release available in maven 15 | default: "main" 16 | quarkus-repo: 17 | type: string 18 | description: 'The Quarkus repository to be used' 19 | default: 'quarkusio/quarkus' 20 | repo: 21 | type: string 22 | description: 'The Mandrel/Graal repository to be used' 23 | default: 'graalvm/mandrel' 24 | version: 25 | type: string 26 | description: 'Mandrel version to test (branch, tag, or commit)' 27 | default: "graal/master" 28 | mandrel-packaging-version: 29 | type: string 30 | description: 'Mandrel packaging version to test (branch, tag, or commit)' 31 | default: "master" 32 | mandrel-packaging-repo: 33 | type: string 34 | description: 'Mandrel packaging repository to be used' 35 | default: "graalvm/mandrel-packaging" 36 | build-type: 37 | type: choice 38 | description: 'Build distribution (mandrel/graal) from source or use released binaries' 39 | default: "mandrel-source" 40 | options: 41 | - "mandrel-source" 42 | - "graal-source" 43 | - "mandrel-release" 44 | - "graal-release" 45 | jdk: 46 | type: choice 47 | description: 'OpenJDK to use. One of <feature-version>/ga, <feature-version>/ea, e.g. 17/ga or 17/ea (/ga and /ea suffixes are only relevant when building from source)' 48 | default: "17/ga" 49 | options: 50 | - "11/ga" 51 | - "11/ea" 52 | - "17/ga" 53 | - "17/ea" 54 | - "20/ga" 55 | - "21/ga" 56 | - "21/ea" 57 | - "22/ga" 58 | - "22/ea" 59 | - "23/ga" 60 | - "23/ea" 61 | - "24/ga" 62 | - "24/ea" 63 | - "25/ga" 64 | - "25/ea" 65 | - "latest/labsjdk" 66 | builder-image: 67 | type: string 68 | 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)' 69 | default: "null" 70 | build-stats-tag: 71 | type: string 72 | description: 'The tag to use for build stats uploads of native tests (e.g. 22.3.0-dev-jdk17-prepatch-x)' 73 | default: "null" 74 | 75 | jobs: 76 | delegate: 77 | uses: ./.github/workflows/base-windows.yml 78 | with: 79 | quarkus-version: ${{ github.event.inputs.quarkus-version }} 80 | quarkus-repo: ${{ github.event.inputs.quarkus-repo }} 81 | repo: ${{ github.event.inputs.repo }} 82 | version: ${{ github.event.inputs.version }} 83 | mandrel-packaging-version: ${{ github.event.inputs.mandrel-packaging-version }} 84 | mandrel-packaging-repo: ${{ github.event.inputs.mandrel-packaging-repo }} 85 | build-type: ${{ github.event.inputs.build-type }} 86 | jdk: ${{ github.event.inputs.jdk }} 87 | # builder-image: ${{ github.event.inputs.builder-image }} 88 | build-stats-tag: ${{ github.event.inputs.build-stats-tag }} 89 | secrets: 90 | UPLOAD_COLLECTOR_TOKEN: ${{ secrets.UPLOAD_COLLECTOR_TOKEN }} 91 | -------------------------------------------------------------------------------- /.github/workflows/base-windows.yml: -------------------------------------------------------------------------------- 1 | name: Windows Mandrel-Quarkus tests 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | quarkus-version: 7 | type: string 8 | description: 'Quarkus version to test (branch, tag, commit, or "latest")' 9 | # "latest" is replaced by the latest release available in maven 10 | default: "main" 11 | quarkus-repo: 12 | type: string 13 | description: 'The Quarkus repository to be used' 14 | default: 'quarkusio/quarkus' 15 | version: 16 | type: string 17 | description: 'Mandrel version to test (branch, tag, or commit)' 18 | default: "graal/master" 19 | repo: 20 | type: string 21 | description: 'The Mandrel/Graal repository to be used' 22 | default: 'graalvm/mandrel' 23 | mandrel-packaging-version: 24 | type: string 25 | description: 'Mandrel packaging version to test (branch, tag, or commit)' 26 | default: "master" 27 | mandrel-packaging-repo: 28 | type: string 29 | description: 'Mandrel packaging repository to be used' 30 | default: "graalvm/mandrel-packaging" 31 | build-type: 32 | type: string 33 | description: 'Build distribution (Mandrel/GraalVM) from source or grab a release' 34 | default: "mandrel-source" 35 | jdk: 36 | type: string 37 | description: 'OpenJDK to use. One of <feature-version>/ga, <feature-version>/ea, e.g. 17/ga or 17/ea (/ga and /ea suffixes are only relevant when building from source)' 38 | default: "17/ga" 39 | # Builder image can't be tested on Windows due to https://github.com/actions/virtual-environments/issues/1143 40 | # builder-image: 41 | # 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)' 42 | # default: "null" 43 | issue-number: 44 | type: string 45 | description: 'The issue number to report results to' 46 | default: "null" 47 | issue-repo: 48 | type: string 49 | description: 'The repository to report results to' 50 | default: "graalvm/mandrel" 51 | mandrel-it-issue-number: 52 | type: string 53 | description: 'The issue number to report results to mandrel-integration-tests' 54 | default: "null" 55 | build-stats-tag: 56 | type: string 57 | description: 'The tag to use for build stats upload of native tests (e.g. 22.3.0-dev-jdk17-mytest-patch-before)' 58 | default: "null" 59 | secrets: 60 | ISSUE_BOT_TOKEN: 61 | description: 'A token used to report results in GH issues' 62 | required: false 63 | UPLOAD_COLLECTOR_TOKEN: 64 | description: 'A token used to report build statistics to a collector' 65 | required: false 66 | 67 | env: 68 | # Workaround testsuite locale issue 69 | LANG: en_US.UTF-8 70 | DB_USER: hibernate_orm_test 71 | DB_PASSWORD: hibernate_orm_test 72 | DB_NAME: hibernate_orm_test 73 | COMMON_MAVEN_ARGS: "-e -B --settings .github/mvn-settings.xml --fail-at-end" 74 | 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" 75 | MX_GIT_CACHE: refcache 76 | JAVA_HOME: ${{ github.workspace }}\openjdk 77 | GRAALVM_HOME: ${{ github.workspace }}\graalvm-home 78 | MANDREL_REPO: ${{ github.workspace }}\mandrel 79 | MANDREL_HOME: ${{ github.workspace }}\..\mandrelvm 80 | MX_PATH: ${{ github.workspace }}\mx 81 | MX_PYTHON: python 82 | PYTHONIOENCODING: utf-8 83 | QUARKUS_PATH: ${{ github.workspace }}\quarkus 84 | MANDREL_PACKAGING_REPO: ${{ github.workspace }}\mandrel-packaging 85 | 86 | jobs: 87 | build-vars: 88 | name: Set distribution and build-from-source variables based on build-type 89 | runs-on: ubuntu-latest 90 | outputs: 91 | build-from-source: ${{ steps.source-build.outputs.build-from-source }} 92 | distribution: ${{ steps.distro.outputs.distribution }} 93 | steps: 94 | - name: Log inputs 95 | run: | 96 | echo "Inputs:" 97 | echo '${{ toJson(inputs) }}' | jq . | tr -d '"' | sed 's/,$//g' 98 | - name: Set build-from-source output 99 | id: source-build 100 | run: | 101 | echo "${{ inputs.build-type }}" 102 | bfs_token=$(echo ${{ inputs.build-type }} | cut -d'-' -f2) 103 | if [ "${bfs_token}" == "release" ] 104 | then 105 | source_build=false 106 | elif [ "${bfs_token}" == "source" ] 107 | then 108 | source_build=true 109 | else 110 | echo "Unexpected input 'build-type' = ${{ inputs.build-type }}" 111 | exit 1 112 | fi 113 | echo "source_build=$source_build" 114 | echo "build-from-source=$source_build" >> $GITHUB_OUTPUT 115 | - name: Set distribution output 116 | id: distro 117 | run: | 118 | bfs_token=$(echo ${{ inputs.build-type }} | cut -d'-' -f1) 119 | if [ "${bfs_token}" == "graal" ] 120 | then 121 | distro="graalvm" 122 | elif [ "${bfs_token}" == "mandrel" ] 123 | then 124 | distro="mandrel" 125 | else 126 | echo "Unexpected input 'build-type' = ${{ inputs.build-type }}" 127 | exit 1 128 | fi 129 | echo "distro=$distro" 130 | echo "distribution=$distro" >> $GITHUB_OUTPUT 131 | 132 | get-test-matrix: 133 | name: Get test matrix 134 | runs-on: ubuntu-latest 135 | outputs: 136 | quarkus-version: ${{ steps.version.outputs.quarkus-version }} 137 | tests-matrix: ${{ steps.version.outputs.tests-matrix }} 138 | artifacts-suffix: ${{ steps.suffix.outputs.suffix }} 139 | steps: 140 | - id: suffix 141 | run: | 142 | 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\/' '-') 143 | echo $SUFFIX 144 | echo "suffix=$SUFFIX" >> $GITHUB_OUTPUT 145 | - name: Get Quarkus version and test matrix 146 | id: version 147 | run: | 148 | if [ ${{ inputs.quarkus-version }} == "latest" ] 149 | then 150 | 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) 151 | elif $(expr match "${{ inputs.quarkus-version }}" "^.*\.\(Final\|CR\|Alpha\|Beta\)[0-9]\?$" > /dev/null) 152 | then 153 | export QUARKUS_VERSION=${{ inputs.quarkus-version }} 154 | else 155 | 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) 156 | fi 157 | if [ "$QUARKUS_VERSION" == "" ] 158 | then 159 | export QUARKUS_VERSION=${{ inputs.quarkus-version }} 160 | fi 161 | echo ${QUARKUS_VERSION} 162 | echo "quarkus-version=${QUARKUS_VERSION}" >> $GITHUB_OUTPUT 163 | curl --output native-tests.json https://raw.githubusercontent.com/${{ inputs.quarkus-repo }}/${QUARKUS_VERSION}/.github/native-tests.json 164 | tests_json=$(jq -c '.include |= map(select(.["os-name"] | startswith("windows")))' native-tests.json) 165 | echo ${tests_json} 166 | echo "tests-matrix=${tests_json}" >> $GITHUB_OUTPUT 167 | 168 | build-mandrel: 169 | name: Mandrel build 170 | runs-on: windows-2022 171 | needs: 172 | - get-test-matrix 173 | - build-vars 174 | if: fromJson(needs.build-vars.outputs.build-from-source) == true && needs.build-vars.outputs.distribution == 'mandrel' 175 | steps: 176 | - uses: actions/checkout@v4 177 | with: 178 | repository: ${{ inputs.repo }} 179 | fetch-depth: 1 180 | ref: ${{ inputs.version }} 181 | path: ${{ env.MANDREL_REPO }} 182 | - name: Set up Python 183 | uses: actions/setup-python@v5 184 | with: 185 | python-version: '3.8' 186 | - name: Checkout MX 187 | run: | 188 | VERSION=$(jq -r .mx_version ${MANDREL_REPO}/common.json) 189 | git clone ${GITHUB_SERVER_URL}/graalvm/mx --depth 1 --branch ${VERSION} mx 190 | ./mx/mx --version 191 | shell: bash 192 | - uses: actions/checkout@v4 193 | with: 194 | repository: ${{ inputs.mandrel-packaging-repo }} 195 | ref: ${{ inputs.mandrel-packaging-version }} 196 | path: ${{ env.MANDREL_PACKAGING_REPO }} 197 | - uses: actions/cache@v4 198 | with: 199 | path: ~/.mx 200 | key: ${{ runner.os }}-mx-${{ hashFiles('**/suite.py') }} 201 | restore-keys: ${{ runner.os }}-mx- 202 | - name: Get OpenJDK with static libs 203 | run: | 204 | $wc = New-Object System.Net.WebClient 205 | $wc.DownloadFile("https://api.adoptium.net/v3/binary/latest/${{ inputs.jdk }}/windows/x64/jdk/hotspot/normal/eclipse", "$Env:temp\jdk.zip") 206 | Expand-Archive "$Env:temp\jdk.zip" -DestinationPath "$Env:temp" 207 | Move-Item -Path "$Env:temp\jdk-*" -Destination $Env:JAVA_HOME 208 | $wc.DownloadFile("https://api.adoptium.net/v3/binary/latest/${{ inputs.jdk }}/windows/x64/staticlibs/hotspot/normal/eclipse", "$Env:temp\jdk-staticlibs.zip") 209 | Expand-Archive "$Env:temp\jdk-staticlibs.zip" -DestinationPath "$Env:temp" 210 | Move-Item -Path "$Env:temp\jdk-*\lib\static" -Destination $Env:JAVA_HOME\lib\ 211 | Remove-Item -Recurse "$Env:temp\jdk-*" 212 | & $Env:JAVA_HOME\bin\java -version 213 | - name: Build Mandrel 214 | run: | 215 | cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars64.txt" 216 | Get-Content "$Env:temp\vcvars64.txt" | Foreach-Object { 217 | if ($_ -match "^(.*?)=(.*)$") { 218 | Set-Content "Env:\$($matches[1])" $matches[2] 219 | } 220 | } 221 | Set-Location -Path $Env:MANDREL_PACKAGING_REPO 222 | & $Env:JAVA_HOME\bin\java -ea build.java ` 223 | --mx-home $Env:MX_PATH ` 224 | --mandrel-repo $Env:MANDREL_REPO ` 225 | --mandrel-home $Env:MANDREL_HOME 226 | if(!$?) { Exit $LASTEXITCODE } 227 | & $Env:MANDREL_HOME\bin\native-image --version 228 | if(!$?) { Exit $LASTEXITCODE } 229 | Remove-Item -Recurse $Env:JAVA_HOME 230 | Move-Item -Path $Env:MANDREL_HOME -Destination $Env:JAVA_HOME 231 | - name: Archive JDK 232 | shell: bash 233 | run: tar czvf jdk.tgz -C $(dirname ${JAVA_HOME}) $(basename ${JAVA_HOME}) 234 | - name: Persist Mandrel build 235 | uses: actions/upload-artifact@v4 236 | with: 237 | name: win-jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 238 | path: jdk.tgz 239 | - name: Prepare failure archive (if maven failed) 240 | if: failure() 241 | shell: bash 242 | run: find . -name '*svm_err_*pid*.md' | tar czvf test-reports.tgz -T - 243 | - name: Upload failure Archive (if maven failed) 244 | uses: actions/upload-artifact@v4 245 | if: failure() 246 | with: 247 | name: mandrel-reports-native-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 248 | path: 'test-reports.tgz' 249 | 250 | build-graal: 251 | name: GraalVM CE build 252 | runs-on: windows-2022 253 | needs: 254 | - get-test-matrix 255 | - build-vars 256 | if: fromJson(needs.build-vars.outputs.build-from-source) == true && needs.build-vars.outputs.distribution == 'graalvm' 257 | steps: 258 | - uses: actions/checkout@v4 259 | with: 260 | repository: ${{ inputs.repo }} 261 | fetch-depth: 1 262 | ref: ${{ inputs.version }} 263 | path: graal 264 | - name: Set up Python 265 | uses: actions/setup-python@v5 266 | with: 267 | python-version: '3.8' 268 | - name: Checkout MX 269 | run: | 270 | VERSION=$(jq -r .mx_version graal/common.json) 271 | git clone ${GITHUB_SERVER_URL}/graalvm/mx --depth 1 --branch ${VERSION} mx 272 | ./mx/mx --version 273 | shell: bash 274 | - uses: actions/cache@v4 275 | with: 276 | path: ~/.mx 277 | key: ${{ runner.os }}-mx-${{ hashFiles('**/suite.py') }} 278 | restore-keys: ${{ runner.os }}-mx- 279 | - name: Build graalvm native-image 280 | run: | 281 | cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars64.txt" 282 | Get-Content "$Env:temp\vcvars64.txt" | Foreach-Object { 283 | if ($_ -match "^(.*?)=(.*)$") { 284 | Set-Content "Env:\$($matches[1])" $matches[2] 285 | } 286 | } 287 | Set-Location graal\substratevm 288 | mkdir -p "$Env:temp\jdk-dl" 289 | & $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 290 | & $Env:JAVA_HOME\bin\java --version 291 | & $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 292 | ${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) 293 | rm -Recurse -Force $Env:JAVA_HOME 294 | mv ${graalvm-home} $Env:JAVA_HOME 295 | & $Env:JAVA_HOME\bin\native-image --version 296 | - name: Archive JDK 297 | shell: bash 298 | run: tar czvf jdk.tgz -C $(dirname ${JAVA_HOME}) $(basename ${JAVA_HOME}) 299 | - name: Persist GraalVM CE build 300 | uses: actions/upload-artifact@v4 301 | with: 302 | name: win-jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 303 | path: jdk.tgz 304 | - name: Prepare failure archive (if maven failed) 305 | if: failure() 306 | shell: bash 307 | run: find . -name '*svm_err_*pid*.md' | tar czvf test-reports.tgz -T - 308 | - name: Upload failure Archive (if maven failed) 309 | uses: actions/upload-artifact@v4 310 | if: failure() 311 | with: 312 | name: graal-reports-native-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 313 | path: 'test-reports.tgz' 314 | 315 | get-jdk: 316 | name: Get JDK ${{ inputs.jdk }} 317 | runs-on: windows-2022 318 | needs: 319 | - get-test-matrix 320 | - build-vars 321 | if: fromJson(needs.build-vars.outputs.build-from-source) == false 322 | steps: 323 | - name: Get Mandrel ${{ inputs.version }} 324 | if: needs.build-vars.outputs.distribution == 'mandrel' 325 | run: | 326 | $VERSION="${{ inputs.version }}" 327 | $VERSION_SHORT=@($VERSION -replace 'mandrel-') 328 | $wc = New-Object System.Net.WebClient 329 | $url="$Env:GITHUB_SERVER_URL/graalvm/mandrel/releases/download/${VERSION}/mandrel-java$(("${{ inputs.jdk }}" -split "/")[0])-windows-amd64-${VERSION_SHORT}.zip" 330 | $wc.DownloadFile($($url), "mandrel.zip") 331 | Expand-Archive "mandrel.zip" -DestinationPath "$Env:temp" 332 | Move-Item -Path "$Env:temp\mandrel-*" -Destination $Env:JAVA_HOME 333 | & $Env:JAVA_HOME\bin\native-image --version 334 | - name: Get GraalVM CE ${{ inputs.version }} 335 | if: needs.build-vars.outputs.distribution == 'graalvm' 336 | run: | 337 | $VERSION="${{ inputs.version }}" 338 | $VERSION_SHORT=@($VERSION -replace 'vm-') 339 | $wc = New-Object System.Net.WebClient 340 | $url="$Env:GITHUB_SERVER_URL/graalvm/graalvm-ce-builds/releases/download/${VERSION}/graalvm-ce-java$(("${{ inputs.jdk }}" -split "/")[0])-windows-amd64-${VERSION_SHORT}.zip" 341 | $wc.DownloadFile($($url), "graalvm.zip") 342 | Expand-Archive "graalvm.zip" -DestinationPath "$Env:temp" 343 | Move-Item -Path "$Env:temp\graalvm-*" -Destination $Env:JAVA_HOME 344 | & $Env:JAVA_HOME\bin\gu install native-image 345 | & $Env:JAVA_HOME\bin\native-image --version 346 | - name: Archive JDK 347 | shell: bash 348 | run: tar czvf jdk.tgz -C $(dirname ${JAVA_HOME}) $(basename ${JAVA_HOME}) 349 | - name: Persist Mandrel or GraalVM 350 | uses: actions/upload-artifact@v4 351 | with: 352 | name: win-jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 353 | path: jdk.tgz 354 | 355 | build-quarkus: 356 | name: Quarkus build 357 | needs: 358 | - get-test-matrix 359 | - build-mandrel 360 | - build-graal 361 | - build-vars 362 | if: always() && (needs.build-graal.result == 'success' || needs.build-mandrel.result == 'success' || fromJson(needs.build-vars.outputs.build-from-source) == false) 363 | strategy: 364 | fail-fast: false 365 | uses: ./.github/workflows/build-quarkus.yml 366 | with: 367 | artifacts-suffix: ${{ needs.get-test-matrix.outputs.artifacts-suffix }} 368 | build-from-source: ${{ fromJson(needs.build-vars.outputs.build-from-source) }} 369 | target-os: 'windows' 370 | quarkus-repo: ${{ inputs.quarkus-repo }} 371 | quarkus-version: ${{ needs.get-test-matrix.outputs.quarkus-version }} 372 | 373 | native-tests: 374 | name: Q IT ${{ matrix.category }} 375 | needs: 376 | - build-quarkus 377 | - build-mandrel 378 | - build-graal 379 | - get-jdk 380 | - get-test-matrix 381 | if: always() && needs.build-quarkus.result == 'success' 382 | runs-on: windows-2022 383 | env: 384 | # leave more space for the actual native compilation and execution 385 | MAVEN_OPTS: -Xmx1g 386 | # USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM: false 387 | # Ignore the following YAML Schema error 388 | timeout-minutes: ${{matrix.timeout}} 389 | strategy: 390 | fail-fast: false 391 | matrix: ${{ fromJson(needs.get-test-matrix.outputs.tests-matrix) }} 392 | steps: 393 | - name: Support longpaths on Windows 394 | if: startsWith(matrix.os-name, 'windows') 395 | run: git config --global core.longpaths true 396 | - uses: actions/checkout@v4 397 | if: startsWith(matrix.os-name, 'windows') 398 | with: 399 | repository: graalvm/mandrel 400 | fetch-depth: 1 401 | path: workflow-mandrel 402 | - name: Download Maven Repo 403 | uses: actions/download-artifact@v4 404 | with: 405 | name: windows-maven-repo-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 406 | path: . 407 | - name: Extract Maven Repo 408 | shell: bash 409 | run: tar -xzf maven-repo.tgz -C ~ 410 | - uses: actions/checkout@v4 411 | with: 412 | repository: ${{ inputs.quarkus-repo }} 413 | fetch-depth: 1 414 | ref: ${{ needs.get-test-matrix.outputs.quarkus-version }} 415 | path: ${{ env.QUARKUS_PATH }} 416 | - uses: actions/cache@v4 417 | with: 418 | path: ~/.m2/repository 419 | key: base-windows-${{ needs.get-test-matrix.outputs.quarkus-version }}-maven-${{ hashFiles('**/pom.xml') }} 420 | restore-keys: base-windows-${{ needs.get-test-matrix.outputs.quarkus-version }}-maven- 421 | # Use Java 17 for Quarkus as it doesn't work with Java 21 yet 422 | - uses: actions/setup-java@v4 423 | with: 424 | distribution: 'temurin' 425 | java-version: '17' 426 | - name: Download Mandrel or GraalVM 427 | uses: actions/download-artifact@v4 428 | with: 429 | name: win-jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 430 | path: . 431 | - name: Extract Mandrel or GraalVM 432 | shell: bash 433 | run: | 434 | mkdir -p "${GRAALVM_HOME}" 435 | tar -xzvf jdk.tgz -C graalvm-home --strip-components=1 436 | ${GRAALVM_HOME}/bin/java -version 437 | # - name: Reclaim disk space 438 | # shell: bash 439 | # run: ${QUARKUS_PATH}/.github/ci-prerequisites.sh 440 | # We do this so we can get better analytics for the downloaded version of the build images 441 | - name: Update Docker Client User Agent 442 | shell: bash 443 | run: | 444 | if [ -f ~/.docker/config.json ]; then 445 | cat <<< $(jq '.HttpHeaders += {"User-Agent": "Mandrel-CI-Docker-Client"}' ~/.docker/config.json) > ~/.docker/config.json.new 446 | mv ~/.docker/config.json.new ~/.docker/config.json 447 | fi 448 | - name: Change quarkus.version for Quarkus 2.2 to make mandrel-integration-test not apply quarkus_main.patch 449 | # See https://github.com/Karm/mandrel-integration-tests/pull/64 450 | shell: bash 451 | run: | 452 | if [ "${{ inputs.quarkus-version }}" == "2.2" ] 453 | then 454 | cd quarkus 455 | bash ../workflow-mandrel/.github/update_quarkus_version.sh 2.2.999 456 | fi 457 | - name: Build with Maven 458 | env: 459 | TEST_MODULES: ${{matrix.test-modules}} 460 | CATEGORY: ${{matrix.category}} 461 | run: | 462 | cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars64.txt" 463 | Get-Content "$Env:temp\vcvars64.txt" | Foreach-Object { 464 | if ($_ -match "^(.*?)=(.*)$") { 465 | Set-Content "Env:\$($matches[1])" $matches[2] 466 | } 467 | } 468 | cd $Env:QUARKUS_PATH 469 | Write-Host "$Env:GRAALVM_HOME" 470 | if (Test-Path "$Env:GRAALVM_HOME/bin/native-image" -PathType leaf) { 471 | & "$Env:GRAALVM_HOME/bin/native-image" --version 472 | } 473 | $opts=@() 474 | -split $Env:NATIVE_TEST_MAVEN_OPTS | foreach { $opts += "`"$_`"" } 475 | #if ( "${{ inputs.builder-image }}" -eq "null" ) { 476 | mvn -f integration-tests -pl "$Env:TEST_MODULES" -amd "-Dquarkus.native.container-build=false" $opts install 477 | #} else { 478 | # mvn -pl $do_modules "-Dquarkus.native.container-build=true" "-Dquarkus.native.builder-image=${{ inputs.builder-image }}" $opts package 479 | #} 480 | - name: Prepare failure archive (if maven failed) 481 | if: failure() 482 | shell: bash 483 | run: find . -type d -name '*-reports' -o -wholename '*/build/reports/tests/functionalTest' -o -name '*svm_err_*pid*.md' | tar czvf test-reports.tgz -T - 484 | - name: Upload failure Archive (if maven failed) 485 | uses: actions/upload-artifact@v4 486 | if: failure() 487 | with: 488 | name: win-test-reports-native-${{matrix.category}}-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 489 | path: 'test-reports.tgz' 490 | - name: Collect build JSON stats 491 | if: inputs.build-stats-tag != 'null' 492 | shell: bash 493 | run: find . -name '*runner*.json' | tar czvf build-stats.tgz -T - 494 | - name: Upload build JSON stats 495 | if: inputs.build-stats-tag != 'null' 496 | uses: actions/upload-artifact@v4 497 | with: 498 | name: build-stats-${{matrix.category}}-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 499 | path: 'build-stats.tgz' 500 | 501 | native-tests-stats-upload: 502 | name: Upload build stats to collector 503 | if: always() && inputs.build-stats-tag != 'null' && github.event_name != 'pull_request' && needs.native-tests.result != 'skipped' && needs.native-tests.result != 'cancelled' 504 | needs: 505 | - native-tests 506 | - get-test-matrix 507 | uses: ./.github/workflows/native-tests-stats-upload.yml 508 | with: 509 | artifacts-suffix: ${{ needs.get-test-matrix.outputs.artifacts-suffix }} 510 | build-stats-tag: ${{ inputs.build-stats-tag }} 511 | secrets: 512 | UPLOAD_COLLECTOR_TOKEN: ${{ secrets.UPLOAD_COLLECTOR_TOKEN }} 513 | 514 | mandrel-integration-tests: 515 | name: Q Mandrel IT 516 | if: always() && needs.build-quarkus.result == 'success' 517 | needs: 518 | - build-vars 519 | - build-mandrel 520 | - get-jdk 521 | - build-quarkus 522 | - get-test-matrix 523 | runs-on: windows-2022 524 | env: 525 | # leave more space for the actual native compilation and execution 526 | MAVEN_OPTS: -Xmx1g 527 | # Don't perform performance checks since GH runners are not that stable 528 | FAIL_ON_PERF_REGRESSION: false 529 | # USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM: false 530 | timeout-minutes: 40 531 | strategy: 532 | fail-fast: false 533 | steps: 534 | - uses: actions/checkout@v4 535 | with: 536 | repository: graalvm/mandrel 537 | fetch-depth: 1 538 | path: workflow-mandrel 539 | - uses: actions/checkout@v4 540 | with: 541 | repository: Karm/mandrel-integration-tests 542 | fetch-depth: 1 543 | - name: Download Maven Repo 544 | uses: actions/download-artifact@v4 545 | with: 546 | name: windows-maven-repo-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 547 | path: . 548 | - name: Extract Maven Repo 549 | shell: bash 550 | run: tar -xzvf maven-repo.tgz -C ~ 551 | # Use Java 17 for Quarkus as it doesn't work with Java 21 yet 552 | - uses: actions/setup-java@v4 553 | with: 554 | distribution: 'temurin' 555 | java-version: '17' 556 | - name: Download Mandrel or GraalVM 557 | uses: actions/download-artifact@v4 558 | with: 559 | name: win-jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 560 | path: . 561 | - name: Extract Mandrel or GraalVM 562 | shell: bash 563 | run: | 564 | mkdir -p "${GRAALVM_HOME}" 565 | tar -xzvf jdk.tgz -C graalvm-home --strip-components=1 566 | ${GRAALVM_HOME}/bin/java -version 567 | - name: Update Docker Client User Agent 568 | shell: bash 569 | run: | 570 | if [ -f ~/.docker/config.json ]; then 571 | cat <<< $(jq '.HttpHeaders += {"User-Agent": "Mandrel-CI-Docker-Client"}' ~/.docker/config.json) > ~/.docker/config.json.new 572 | mv ~/.docker/config.json.new ~/.docker/config.json 573 | fi 574 | - name: Build with Maven 575 | run: | 576 | cmd.exe /c "call `"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat`" && set > %temp%\vcvars64.txt" 577 | Get-Content "$Env:temp\vcvars64.txt" | Foreach-Object { 578 | if ($_ -match "^(.*?)=(.*)$") { 579 | Set-Content "Env:\$($matches[1])" $matches[2] 580 | } 581 | } 582 | $Env:PATH="$Env:GRAALVM_HOME\bin;$Env:PATH" 583 | if (Test-Path "$Env:GRAALVM_HOME\bin\native-image.cmd" -PathType leaf) { 584 | & "$Env:GRAALVM_HOME\bin\native-image" --version 585 | } else { 586 | Write-Host "Cannot find native-image tool. Quitting..." 587 | exit 1 588 | } 589 | $QUARKUS_VERSION="${{ needs.get-test-matrix.outputs.quarkus-version }}" 590 | # Don't use SNAPSHOT version for 2.2 and release tags 591 | if ("${{ inputs.quarkus-version }}" -eq "2.2") { 592 | $QUARKUS_VERSION="2.2.999" 593 | } elseif (${{ inputs.quarkus-version }} -match "^[0-9]+\.[0-9]+$") { 594 | $QUARKUS_VERSION="${{ inputs.quarkus-version }}.999-SNAPSHOT" 595 | } elseif (! ($QUARKUS_VERSION -match "^.*\.(Final|CR|Alpha|Beta)[0-9]?$")) { 596 | $QUARKUS_VERSION="999-SNAPSHOT" 597 | } 598 | Write-Host "$QUARKUS_VERSION" 599 | mvn clean verify "-Dquarkus.native.native-image-xmx=5g" "-Dquarkus.version=$QUARKUS_VERSION" -Ptestsuite 600 | - name: Prepare failure archive (if maven failed) 601 | if: failure() 602 | shell: bash 603 | run: tar czvf test-reports-mandrel-it.tgz ./testsuite/target/archived-logs/ 604 | - name: Upload failure Archive (if maven failed) 605 | uses: actions/upload-artifact@v4 606 | if: failure() 607 | with: 608 | name: win-test-reports-mandrel-it-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 609 | path: 'test-reports-mandrel-it.tgz' 610 | -------------------------------------------------------------------------------- /.github/workflows/base-wrapper.yml: -------------------------------------------------------------------------------- 1 | # Enable base.yml to be executed as a dispatch workflow with: 2 | # 3 | # gh workflow run base-wrapper.yml \ 4 | # -f quarkus-repo=gsmet/quarkus -f quarkus-version=2.2.4-backports-1 \ 5 | # -f builder-image="quay.io/quarkus/ubi-quarkus-mandrel:21.3-java11" 6 | name: Mandrel-Quarkus tests wrapper 7 | 8 | on: 9 | workflow_dispatch: 10 | inputs: 11 | quarkus-version: 12 | type: string 13 | description: 'Quarkus version to test (branch, tag, commit, or "latest")' 14 | # "latest" is replaced by the latest release available in maven 15 | default: "main" 16 | quarkus-repo: 17 | type: string 18 | description: 'The Quarkus repository to be used' 19 | default: 'quarkusio/quarkus' 20 | repo: 21 | type: string 22 | description: 'The Mandrel/Graal repository to be used' 23 | default: 'graalvm/mandrel' 24 | version: 25 | type: string 26 | description: 'Mandrel version to test (branch, tag, or commit)' 27 | default: "graal/master" 28 | mandrel-packaging-version: 29 | type: string 30 | description: 'Mandrel packaging version to test (branch, tag, or commit)' 31 | default: "master" 32 | mandrel-packaging-repo: 33 | type: string 34 | description: 'Mandrel packaging repository to be used' 35 | default: "graalvm/mandrel-packaging" 36 | build-type: 37 | type: choice 38 | description: 'Build distribution (graal/mandrel) from source or use released binaries, and control of maven should deploy locally' 39 | default: "mandrel-source" 40 | options: 41 | - "mandrel-source" 42 | - "graal-source" 43 | - "mandrel-source-nolocalmvn" 44 | - "graal-source-nolocalmvn" 45 | - "mandrel-release" 46 | - "graal-release" 47 | jdk: 48 | type: choice 49 | description: 'OpenJDK to use. One of <feature-version>/ga, <feature-version>/ea, e.g. 17/ga or 17/ea (/ga and /ea suffixes are only relevant when building from source)' 50 | default: "17/ga" 51 | options: 52 | - "11/ga" 53 | - "11/ea" 54 | - "17/ga" 55 | - "17/ea" 56 | - "20/ga" 57 | - "21/ga" 58 | - "21/ea" 59 | - "22/ga" 60 | - "22/ea" 61 | - "23/ga" 62 | - "23/ea" 63 | - "24/ga" 64 | - "24/ea" 65 | - "25/ga" 66 | - "25/ea" 67 | - "latest/labsjdk" 68 | builder-image: 69 | type: string 70 | 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)' 71 | default: "null" 72 | build-stats-tag: 73 | type: string 74 | description: 'The tag to use for build stats uploads of native tests (e.g. 22.3.0-dev-jdk17-prepatch-x)' 75 | default: "null" 76 | 77 | jobs: 78 | delegate: 79 | uses: ./.github/workflows/base.yml 80 | with: 81 | quarkus-version: ${{ github.event.inputs.quarkus-version }} 82 | quarkus-repo: ${{ github.event.inputs.quarkus-repo }} 83 | repo: ${{ github.event.inputs.repo }} 84 | version: ${{ github.event.inputs.version }} 85 | mandrel-packaging-version: ${{ github.event.inputs.mandrel-packaging-version }} 86 | mandrel-packaging-repo: ${{ github.event.inputs.mandrel-packaging-repo }} 87 | build-type: ${{ github.event.inputs.build-type }} 88 | jdk: ${{ github.event.inputs.jdk }} 89 | builder-image: ${{ github.event.inputs.builder-image }} 90 | build-stats-tag: ${{ github.event.inputs.build-stats-tag }} 91 | secrets: 92 | UPLOAD_COLLECTOR_TOKEN: ${{ secrets.UPLOAD_COLLECTOR_TOKEN }} 93 | -------------------------------------------------------------------------------- /.github/workflows/base.yml: -------------------------------------------------------------------------------- 1 | name: Mandrel-Quarkus tests 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | quarkus-version: 7 | type: string 8 | description: 'Quarkus version to test (branch, tag, commit, or "latest")' 9 | # "latest" is replaced by the latest release available in maven 10 | default: "main" 11 | quarkus-repo: 12 | type: string 13 | description: 'The Quarkus repository to be used' 14 | default: 'quarkusio/quarkus' 15 | repo: 16 | type: string 17 | description: 'The Mandrel/Graal repository to be used' 18 | default: 'graalvm/mandrel' 19 | version: 20 | type: string 21 | description: 'Mandrel version to test (branch, tag, or commit)' 22 | default: "graal/master" 23 | mandrel-packaging-version: 24 | type: string 25 | description: 'Mandrel packaging version to test (branch, tag, or commit)' 26 | default: "master" 27 | mandrel-packaging-repo: 28 | type: string 29 | description: 'Mandrel packaging repository to be used' 30 | default: "graalvm/mandrel-packaging" 31 | build-type: 32 | type: string 33 | description: 'Build distribution (Mandrel/GraalVM) from source or grab a release, and control of maven should deploy locally' 34 | default: "mandrel-source" 35 | jdk: 36 | type: string 37 | description: 'OpenJDK to use. One of <feature-version>/ga, <feature-version>/ea, e.g. 17/ga or 17/ea (/ga and /ea suffixes are only relevant when building from source)' 38 | default: "17/ga" 39 | builder-image: 40 | type: string 41 | 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)' 42 | default: "null" 43 | issue-number: 44 | type: string 45 | description: 'The issue number to report results to' 46 | default: "null" 47 | issue-repo: 48 | type: string 49 | description: 'The repository to report results to' 50 | default: "graalvm/mandrel" 51 | mandrel-it-issue-number: 52 | type: string 53 | description: 'The issue number to report results to mandrel-integration-tests' 54 | default: "null" 55 | build-stats-tag: 56 | type: string 57 | description: 'The tag to use for build stats upload of native tests (e.g. 22.3.0-dev-jdk17-mytest-patch-before)' 58 | default: "null" 59 | secrets: 60 | ISSUE_BOT_TOKEN: 61 | description: 'A token used to report results in GH issues' 62 | required: false 63 | UPLOAD_COLLECTOR_TOKEN: 64 | description: 'A token used to report build statistics to a collector' 65 | required: false 66 | 67 | env: 68 | # Workaround testsuite locale issue 69 | LANG: en_US.UTF-8 70 | DB_USER: hibernate_orm_test 71 | DB_PASSWORD: hibernate_orm_test 72 | DB_NAME: hibernate_orm_test 73 | 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" 74 | MX_GIT_CACHE: refcache 75 | JAVA_HOME: ${{ github.workspace }}/openjdk 76 | GRAALVM_HOME: ${{ github.workspace }}/graalvm-home 77 | MANDREL_REPO: ${{ github.workspace }}/mandrel 78 | MANDREL_HOME: ${{ github.workspace }}/../mandrelvm 79 | MX_PATH: ${{ github.workspace }}/mx 80 | MX_PYTHON: python 81 | PYTHONIOENCODING: utf-8 82 | QUARKUS_PATH: ${{ github.workspace }}/quarkus 83 | MANDREL_IT_PATH: ${{ github.workspace }}/mandrel-integration-tests 84 | MANDREL_PACKAGING_REPO: ${{ github.workspace }}/mandrel-packaging 85 | 86 | jobs: 87 | build-vars: 88 | name: Set distribution, build-from-source, and maven-deploy-local variables based on build-type 89 | runs-on: ubuntu-latest 90 | outputs: 91 | build-from-source: ${{ steps.source-build.outputs.build-from-source }} 92 | distribution: ${{ steps.distro.outputs.distribution }} 93 | maven-deploy-local: ${{ steps.maven-deploy-local.outputs.maven-deploy-local }} 94 | steps: 95 | - name: Log inputs 96 | run: | 97 | echo "Inputs:" 98 | echo '${{ toJson(inputs) }}' | jq . | tr -d '"' | sed 's/,$//g' 99 | - name: Dump inputs to GITHUB_STEP_SUMMARY in markdown table format 100 | run: | 101 | echo "## Inputs" >> $GITHUB_STEP_SUMMARY 102 | echo "| Input | Value |" >> $GITHUB_STEP_SUMMARY 103 | echo "|---|---|" >> $GITHUB_STEP_SUMMARY 104 | echo '${{ toJson(inputs) }}' | jq -r 'to_entries[] | "| \(.key) | `\(.value)` |"' >> $GITHUB_STEP_SUMMARY 105 | - name: Set build-from-source output 106 | id: source-build 107 | run: | 108 | echo "${{ inputs.build-type }}" 109 | bfs_token=$(echo ${{ inputs.build-type }} | cut -d'-' -f2) 110 | if [ "${bfs_token}" == "release" ] 111 | then 112 | source_build=false 113 | elif [ "${bfs_token}" == "source" ] 114 | then 115 | source_build=true 116 | else 117 | echo "Unexpected input 'build-type' = ${{ inputs.build-type }}" 118 | exit 1 119 | fi 120 | echo "source_build=$source_build" 121 | echo "build-from-source=$source_build" >> $GITHUB_OUTPUT 122 | - name: Set distribution output 123 | id: distro 124 | run: | 125 | bfs_token=$(echo ${{ inputs.build-type }} | cut -d'-' -f1) 126 | if [ "${bfs_token}" == "graal" ] 127 | then 128 | distro="graalvm" 129 | elif [ "${bfs_token}" == "mandrel" ] 130 | then 131 | distro="mandrel" 132 | else 133 | echo "Unexpected input 'build-type' = ${{ inputs.build-type }}" 134 | exit 1 135 | fi 136 | echo "distro=$distro" 137 | echo "distribution=$distro" >> $GITHUB_OUTPUT 138 | - name: Set maven-deploy-local output 139 | id: maven-deploy-local 140 | run: | 141 | bfs_token=$(echo ${{ inputs.build-type }} | cut -d'-' -f3) 142 | if [ "${bfs_token}" == "nolocalmvn" ] 143 | then 144 | maven_deploy_local="" 145 | else 146 | maven_deploy_local="--maven-deploy-local" 147 | fi 148 | echo "maven_deploy_local=$maven_deploy_local" 149 | echo "maven-deploy-local=$maven_deploy_local" >> $GITHUB_OUTPUT 150 | 151 | get-test-matrix: 152 | name: Get test matrix 153 | runs-on: ubuntu-latest 154 | outputs: 155 | quarkus-version: ${{ steps.version.outputs.quarkus-version }} 156 | tests-matrix: ${{ steps.version.outputs.tests-matrix }} 157 | artifacts-suffix: ${{ steps.suffix.outputs.suffix }} 158 | steps: 159 | - id: suffix 160 | run: | 161 | 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\/' '-') 162 | echo $SUFFIX 163 | echo "suffix=$SUFFIX" >> $GITHUB_OUTPUT 164 | echo "**artifacts-suffix:** ${SUFFIX}" >> $GITHUB_STEP_SUMMARY 165 | - name: Get Quarkus version and test matrix 166 | id: version 167 | run: | 168 | if [ ${{ inputs.quarkus-version }} == "latest" ] 169 | then 170 | 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) 171 | elif $(expr match "${{ inputs.quarkus-version }}" "^.*\.\(Final\|CR\|Alpha\|Beta\)[0-9]\?$" > /dev/null) 172 | then 173 | export QUARKUS_VERSION=${{ inputs.quarkus-version }} 174 | else 175 | 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) 176 | fi 177 | if [ "$QUARKUS_VERSION" == "" ] 178 | then 179 | export QUARKUS_VERSION=${{ inputs.quarkus-version }} 180 | fi 181 | echo ${QUARKUS_VERSION} 182 | echo "quarkus-version=${QUARKUS_VERSION}" >> $GITHUB_OUTPUT 183 | curl --output native-tests.json https://raw.githubusercontent.com/${{ inputs.quarkus-repo }}/${QUARKUS_VERSION}/.github/native-tests.json 184 | tests_json=$(jq -c '.include |= map(select(.["os-name"] | startswith("ubuntu")))' native-tests.json) 185 | echo ${tests_json} 186 | echo "tests-matrix=${tests_json}" >> $GITHUB_OUTPUT 187 | echo "**Quarkus version:** [$QUARKUS_VERSION](${GITHUB_SERVER_URL}/quarkusio/quarkus/commits/$QUARKUS_VERSION)" >> $GITHUB_STEP_SUMMARY 188 | echo "<details>" >> $GITHUB_STEP_SUMMARY 189 | echo "<summary>Test matrix:</summary>" >> $GITHUB_STEP_SUMMARY 190 | echo "" >> $GITHUB_STEP_SUMMARY 191 | echo '```json' >> $GITHUB_STEP_SUMMARY 192 | jq '.include |= map(select(.["os-name"] | startswith("ubuntu")))' native-tests.json | tee -a $GITHUB_STEP_SUMMARY 193 | echo '```' >> $GITHUB_STEP_SUMMARY 194 | echo "</details>" >> $GITHUB_STEP_SUMMARY 195 | 196 | build-mandrel: 197 | name: Mandrel build 198 | runs-on: ubuntu-latest 199 | needs: 200 | - get-test-matrix 201 | - build-vars 202 | if: fromJson(needs.build-vars.outputs.build-from-source) == true && needs.build-vars.outputs.distribution == 'mandrel' && inputs.builder-image == 'null' 203 | steps: 204 | - uses: actions/checkout@v4 205 | with: 206 | repository: ${{ inputs.repo }} 207 | fetch-depth: 1 208 | ref: ${{ inputs.version }} 209 | path: ${{ env.MANDREL_REPO }} 210 | - name: Set up Python 211 | uses: actions/setup-python@v5 212 | with: 213 | python-version: '3.8' 214 | - name: Checkout MX 215 | run: | 216 | VERSION=$(jq -r .mx_version ${MANDREL_REPO}/common.json) 217 | echo "**MX version:** [$VERSION](${GITHUB_SERVER_URL}/graalvm/mx/tree/$VERSION)" >> $GITHUB_STEP_SUMMARY 218 | git clone ${GITHUB_SERVER_URL}/graalvm/mx --depth 1 --branch ${VERSION} ${MX_PATH} 219 | ./mx/mx --version 220 | - uses: actions/checkout@v4 221 | with: 222 | repository: ${{ inputs.mandrel-packaging-repo }} 223 | ref: ${{ inputs.mandrel-packaging-version }} 224 | path: ${{ env.MANDREL_PACKAGING_REPO }} 225 | - uses: actions/cache@v4 226 | with: 227 | path: ~/.mx 228 | key: ${{ runner.os }}-mx-${{ hashFiles('**/suite.py') }} 229 | restore-keys: ${{ runner.os }}-mx- 230 | - name: Get OpenJDK with static libs 231 | run: | 232 | curl -sL https://api.adoptium.net/v3/binary/latest/${{ inputs.jdk }}/linux/x64/jdk/hotspot/normal/eclipse -o jdk.tar.gz 233 | curl -sL https://api.adoptium.net/v3/binary/latest/${{ inputs.jdk }}/linux/x64/staticlibs/hotspot/normal/eclipse -o jdk-static-libs.tar.gz 234 | mkdir -p ${JAVA_HOME} 235 | tar xf jdk.tar.gz -C ${JAVA_HOME} --strip-components=1 236 | tar xf jdk-static-libs.tar.gz -C ${JAVA_HOME} --strip-components=1 237 | echo ${JAVA_HOME} 238 | ${JAVA_HOME}/bin/java --version 239 | echo "**Java version:** $(grep JAVA_RUNTIME_VERSION ${JAVA_HOME}/release | cut -d '=' -f 2)" >> $GITHUB_STEP_SUMMARY 240 | - name: Build Mandrel 241 | run: | 242 | MANDREL_COMMIT=$(cd ${MANDREL_REPO} && git rev-parse HEAD) 243 | echo "**Mandrel commit:** [$MANDREL_COMMIT](${GITHUB_SERVER_URL}/${{ inputs.repo }}/commits/$MANDREL_COMMIT)" >> $GITHUB_STEP_SUMMARY 244 | MVN_LOCAL="${{needs.build-vars.outputs.maven-deploy-local}}" 245 | if [ "$MVN_LOCAL" != "" ] 246 | then 247 | rm -rf ~/.m2/repository/org/graalvm 248 | fi 249 | cd ${MANDREL_PACKAGING_REPO} 250 | ${JAVA_HOME}/bin/java -ea build.java \ 251 | --mx-home ${MX_PATH} \ 252 | --mandrel-repo ${MANDREL_REPO} \ 253 | --mandrel-home ${MANDREL_HOME} \ 254 | --archive-suffix tar.gz \ 255 | "${{needs.build-vars.outputs.maven-deploy-local}}" 256 | ${MANDREL_HOME}/bin/native-image --version 257 | mv mandrel-java*-linux-amd64-*.tar.gz ${{ github.workspace }}/jdk.tgz 258 | if [ "$MVN_LOCAL" != "" ] 259 | then 260 | rm -rf graalvm-maven-artefacts.tgz && tar -czvf graalvm-maven-artefacts.tgz -C ~ .m2/repository/org/graalvm 261 | mv graalvm-maven-artefacts.tgz ${{ github.workspace }} 262 | rm -rf graalvm-version.tgz && tar -czvf graalvm-version.tgz -C $(dirname ${MANDREL_HOME}) $(basename ${MANDREL_HOME})/.maven-version 263 | mv graalvm-version.tgz ${{ github.workspace }} 264 | fi 265 | - name: Persist Mandrel build 266 | uses: actions/upload-artifact@v4 267 | with: 268 | name: jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 269 | path: jdk.tgz 270 | - name: Persist local maven repository 271 | if: needs.build-vars.outputs.maven-deploy-local != '' 272 | uses: actions/upload-artifact@v4 273 | with: 274 | name: org-graalvm-artefacts-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 275 | path: graalvm-maven-artefacts.tgz 276 | - name: Persist GraalVM maven version 277 | if: needs.build-vars.outputs.maven-deploy-local != '' 278 | uses: actions/upload-artifact@v4 279 | with: 280 | name: mandrel-maven-version-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 281 | path: graalvm-version.tgz 282 | - name: Prepare failure archive (if maven failed) 283 | if: failure() 284 | shell: bash 285 | run: find . -name '*svm_err_*pid*.md' | tar czvf test-reports.tgz -T - 286 | - name: Upload failure Archive (if maven failed) 287 | uses: actions/upload-artifact@v4 288 | if: failure() 289 | with: 290 | name: mandrel-reports-native-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 291 | path: 'test-reports.tgz' 292 | 293 | build-graal: 294 | name: GraalVM CE build 295 | runs-on: ubuntu-latest 296 | needs: 297 | - get-test-matrix 298 | - build-vars 299 | if: fromJson(needs.build-vars.outputs.build-from-source) == true && needs.build-vars.outputs.distribution == 'graalvm' && inputs.builder-image == 'null' 300 | steps: 301 | - uses: actions/checkout@v4 302 | with: 303 | repository: ${{ inputs.repo }} 304 | fetch-depth: 1 305 | ref: ${{ inputs.version }} 306 | path: graal 307 | - name: Set up Python 308 | uses: actions/setup-python@v5 309 | with: 310 | python-version: '3.8' 311 | - name: Checkout MX 312 | run: | 313 | VERSION=$(jq -r .mx_version graal/common.json) 314 | echo "**MX version:** [$VERSION](${GITHUB_SERVER_URL}/graalvm/mx/tree/$VERSION)" >> $GITHUB_STEP_SUMMARY 315 | git clone ${GITHUB_SERVER_URL}/graalvm/mx --depth 1 --branch ${VERSION} ${MX_PATH} 316 | ./mx/mx --version 317 | - uses: actions/cache@v4 318 | with: 319 | path: ~/.mx 320 | key: ${{ runner.os }}-mx-${{ hashFiles('**/suite.py') }} 321 | restore-keys: ${{ runner.os }}-mx- 322 | - name: Get labs OpenJDK 323 | run: | 324 | cd graal 325 | mkdir jdk-dl 326 | ${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} 327 | ${JAVA_HOME}/bin/java --version 328 | - name: Build graalvm native-image 329 | run: | 330 | GRAAL_COMMIT=$(cd graal && git rev-parse HEAD) 331 | echo "**Mandrel commit:** [$GRAAL_COMMIT](${GITHUB_SERVER_URL}/${{ inputs.repo }}/commits/$GRAAL_COMMIT)" >> $GITHUB_STEP_SUMMARY 332 | MVN_LOCAL="${{needs.build-vars.outputs.maven-deploy-local}}" 333 | if [ "$MVN_LOCAL" != "" ] 334 | then 335 | rm -rf ~/.m2/repository/org/graalvm 336 | fi 337 | cd graal/substratevm 338 | ${MX_PATH}/mx --native=native-image,lib:jvmcicompiler,lib:native-image-agent,lib:native-image-diagnostics-agent --components="Native Image,LibGraal,svml" build 339 | 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} 340 | ${MANDREL_HOME}/bin/native-image --version 341 | if [ "$MVN_LOCAL" != "" ] 342 | then 343 | cd ../ 344 | # Deploy maven artefacts to local repository 345 | ${MX_PATH}/mx --primary-suite-path sdk maven-deploy --suppress-javadoc 2>&1 | tee maven_deploy.log 346 | rm -rf graalvm-maven-artefacts.tgz && tar -czvf graalvm-maven-artefacts.tgz -C ~ .m2/repository/org/graalvm 347 | mv graalvm-maven-artefacts.tgz ${{ github.workspace }} 348 | # Derive Maven version from 'mx graalvm-version' output 349 | MAVEN_VERS=$(${MX_PATH}/mx --primary-suite-path substratevm graalvm-version 2>/dev/null | sed 's|-dev|-SNAPSHOT|g') 350 | echo "GraalVM maven version is: ${MAVEN_VERS}" 351 | echo ${MAVEN_VERS} > ${MANDREL_HOME}/.maven-version 352 | rm -rf graalvm-version.tgz && tar -czvf graalvm-version.tgz -C $(dirname ${MANDREL_HOME}) $(basename ${MANDREL_HOME})/.maven-version 353 | mv graalvm-version.tgz ${{ github.workspace }} 354 | fi 355 | - name: Tar GraalVM 356 | run: tar czvf jdk.tgz -C $(dirname ${MANDREL_HOME}) $(basename ${MANDREL_HOME}) 357 | - name: Persist GraalVM build 358 | uses: actions/upload-artifact@v4 359 | with: 360 | name: jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 361 | path: jdk.tgz 362 | - name: Persist local maven repository 363 | if: needs.build-vars.outputs.maven-deploy-local != '' 364 | uses: actions/upload-artifact@v4 365 | with: 366 | name: org-graalvm-artefacts-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 367 | path: graalvm-maven-artefacts.tgz 368 | - name: Persist GraalVM maven version 369 | if: needs.build-vars.outputs.maven-deploy-local != '' 370 | uses: actions/upload-artifact@v4 371 | with: 372 | name: mandrel-maven-version-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 373 | path: graalvm-version.tgz 374 | - name: Prepare failure archive (if maven failed) 375 | if: failure() 376 | shell: bash 377 | run: find . -name '*svm_err_*pid*.md' | tar czvf test-reports.tgz -T - 378 | - name: Upload failure Archive (if maven failed) 379 | uses: actions/upload-artifact@v4 380 | if: failure() 381 | with: 382 | name: graal-reports-native-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 383 | path: 'test-reports.tgz' 384 | 385 | get-jdk: 386 | name: Get JDK ${{ inputs.jdk }} 387 | runs-on: ubuntu-latest 388 | needs: 389 | - get-test-matrix 390 | - build-vars 391 | if: fromJson(needs.build-vars.outputs.build-from-source) == false && inputs.builder-image == 'null' 392 | steps: 393 | - name: Get Mandrel ${{ inputs.version }} 394 | if: needs.build-vars.outputs.distribution == 'mandrel' 395 | run: | 396 | VERSION=${{ inputs.version }} 397 | echo "**Mandrel version:** [$VERSION](${GITHUB_SERVER_URL}/graalvm/mandrel/releases/tag/$VERSION)" >> $GITHUB_STEP_SUMMARY 398 | curl \ 399 | -sL ${GITHUB_SERVER_URL}/graalvm/mandrel/releases/download/${VERSION}/mandrel-java$(echo ${{ inputs.jdk }} | cut -d / -f 1)-linux-amd64-${VERSION##mandrel-}.tar.gz \ 400 | -o jdk.tgz 401 | - name: Get GraalVM CE ${{ inputs.version }} 402 | if: needs.build-vars.outputs.distribution == 'graalvm' 403 | run: | 404 | VERSION=${{ inputs.version }} 405 | echo "**GraalVM version:** [$VERSION](${GITHUB_SERVER_URL}/oracle/graal/releases/tag/$VERSION)" >> $GITHUB_STEP_SUMMARY 406 | curl \ 407 | -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 \ 408 | -o graalvm.tgz 409 | mkdir -p ${JAVA_HOME} 410 | tar xzvf graalvm.tgz -C ${JAVA_HOME} --strip-components=1 411 | ${JAVA_HOME}/bin/gu install native-image 412 | ${JAVA_HOME}/bin/native-image --version 413 | tar czvf jdk.tgz -C $(dirname ${JAVA_HOME}) $(basename ${JAVA_HOME}) 414 | - name: Persist Mandrel or GraalVM 415 | uses: actions/upload-artifact@v4 416 | with: 417 | name: jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 418 | path: jdk.tgz 419 | 420 | build-quarkus: 421 | name: Quarkus build 422 | needs: 423 | - get-test-matrix 424 | - build-mandrel 425 | - build-graal 426 | - build-vars 427 | 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' 428 | uses: ./.github/workflows/build-quarkus.yml 429 | with: 430 | artifacts-suffix: ${{ needs.get-test-matrix.outputs.artifacts-suffix }} 431 | build-from-source: ${{ fromJson(needs.build-vars.outputs.build-from-source) }} 432 | builder-image: ${{ inputs.builder-image }} 433 | maven-deploy-local: ${{ needs.build-vars.outputs.maven-deploy-local }} 434 | target-os: 'linux' 435 | quarkus-repo: ${{ inputs.quarkus-repo }} 436 | quarkus-version: ${{ needs.get-test-matrix.outputs.quarkus-version }} 437 | 438 | native-tests: 439 | name: Q IT ${{ matrix.category }} 440 | needs: 441 | - build-mandrel 442 | - build-graal 443 | - get-jdk 444 | - build-quarkus 445 | - get-test-matrix 446 | if: always() && needs.build-quarkus.result == 'success' 447 | runs-on: ubuntu-latest 448 | env: 449 | # leave more space for the actual native compilation and execution 450 | MAVEN_OPTS: -Xmx1g 451 | # USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM: false 452 | # Ignore the following YAML Schema error 453 | timeout-minutes: ${{matrix.timeout}} 454 | strategy: 455 | fail-fast: false 456 | matrix: ${{ fromJson(needs.get-test-matrix.outputs.tests-matrix) }} 457 | steps: 458 | - uses: actions/checkout@v4 459 | with: 460 | repository: graalvm/mandrel 461 | fetch-depth: 1 462 | path: workflow-mandrel 463 | - name: Download Maven Repo 464 | uses: actions/download-artifact@v4 465 | with: 466 | name: linux-maven-repo-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 467 | path: . 468 | - name: Extract Maven Repo 469 | shell: bash 470 | run: tar -xzvf maven-repo.tgz -C ~ 471 | # Use Java 17 for Quarkus as it doesn't work with Java 21 yet 472 | - uses: actions/setup-java@v4 473 | with: 474 | distribution: 'temurin' 475 | java-version: '17' 476 | - name: Download Mandrel or GraalVM 477 | if: inputs.builder-image == 'null' 478 | uses: actions/download-artifact@v4 479 | with: 480 | name: jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 481 | path: . 482 | - name: Extract Mandrel or GraalVM 483 | if: inputs.builder-image == 'null' 484 | shell: bash 485 | run: | 486 | mkdir -p ${GRAALVM_HOME} 487 | tar -xzvf jdk.tgz -C ${GRAALVM_HOME} --strip-components=1 488 | - uses: actions/checkout@v4 489 | with: 490 | repository: ${{ inputs.quarkus-repo }} 491 | fetch-depth: 1 492 | ref: ${{ needs.get-test-matrix.outputs.quarkus-version }} 493 | path: ${{ env.QUARKUS_PATH }} 494 | - name: Reclaim disk space 495 | run: ${QUARKUS_PATH}/.github/ci-prerequisites.sh 496 | - name: Update Docker Client User Agent 497 | shell: bash 498 | run: | 499 | if [ -f ~/.docker/config.json ]; then 500 | cat <<< $(jq '.HttpHeaders += {"User-Agent": "Mandrel-CI-Docker-Client"}' ~/.docker/config.json) > ~/.docker/config.json.new 501 | mv ~/.docker/config.json.new ~/.docker/config.json 502 | fi 503 | - name: Change quarkus.version for Quarkus 2.2 to make mandrel-integration-test not apply quarkus_main.patch 504 | # See https://github.com/Karm/mandrel-integration-tests/pull/64 505 | run: | 506 | if [ "${{ inputs.quarkus-version }}" == "2.2" ] 507 | then 508 | cd quarkus 509 | bash ../workflow-mandrel/.github/update_quarkus_version.sh 2.2.999 510 | fi 511 | - name: Build with Maven 512 | env: 513 | TEST_MODULES: ${{matrix.test-modules}} 514 | CATEGORY: ${{matrix.category}} 515 | shell: bash 516 | run: | 517 | cd ${QUARKUS_PATH} 518 | if [[ ${{ inputs.builder-image }} == "null" ]] 519 | then 520 | export BUILDER_IMAGE="-Dquarkus.native.container-build=false" 521 | ${GRAALVM_HOME}/bin/native-image --version 522 | else 523 | export BUILDER_IMAGE="-Dquarkus.native.container-build=true -Dquarkus.native.builder-image=${{ inputs.builder-image }}" 524 | fi 525 | # Patch Gradle config to look for GraalVM dependencies in maven local repository 526 | for i in `grep -rl includeGroupByRegex .` 527 | do 528 | sed -i "s/\(^ *includeGroupByRegex\)\( 'io.quarkus.*'\)/\1\2\n\1 'org.graalvm.*'/g" $i 529 | done 530 | # Backwards compatibility with Quarkus < 2.x native-tests.json 531 | if ! echo $TEST_MODULES | grep ',' > /dev/null 532 | then 533 | for i in $TEST_MODULES 534 | do modules+=("$i"); done 535 | IFS=, 536 | TEST_MODULES="${modules[*]}" 537 | # add the 'simple with spaces' project to the run of 'Misc1' by executing it explicitly 538 | # done because there is no good way to pass strings with empty values to the previous command 539 | # so this hack is as good as any 540 | if [ "$CATEGORY" == "Misc1" ]; then 541 | TEST_MODULES="$TEST_MODULES,simple with space" 542 | fi 543 | unset IFS 544 | fi 545 | if [[ $TEST_MODULES == "main" ]] 546 | then 547 | # Build main module with constraint memory to ensure we can build apps on smaller machines too 548 | export NEW_MAX_HEAP_SIZE=-Dquarkus.native.native-image-xmx=5g 549 | fi 550 | ./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 551 | - name: Prepare failure archive (if maven failed) 552 | if: failure() 553 | shell: bash 554 | run: | 555 | find . -type d -name '*-reports' -o -wholename '*/build/reports/tests/functionalTest' -o -name '*svm_err_*pid*.md' | tar czvf test-reports.tgz -T - 556 | - name: Upload failure Archive (if maven failed) 557 | uses: actions/upload-artifact@v4 558 | if: failure() 559 | with: 560 | name: test-reports-native-${{matrix.category}}-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 561 | path: 'test-reports.tgz' 562 | - name: Collect build JSON stats 563 | if: ${{ always() && inputs.build-stats-tag != 'null' }} 564 | shell: bash 565 | run: find . -name '*runner*.json' | tar czvf build-stats.tgz -T - 566 | - name: Upload build JSON stats 567 | if: ${{ always() && inputs.build-stats-tag != 'null' }} 568 | uses: actions/upload-artifact@v4 569 | with: 570 | name: build-stats-${{matrix.category}}-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 571 | path: 'build-stats.tgz' 572 | 573 | native-tests-stats-upload: 574 | name: Upload build stats to collector 575 | if: always() && inputs.build-stats-tag != 'null' && github.event_name != 'pull_request' && needs.native-tests.result != 'skipped' && needs.native-tests.result != 'cancelled' 576 | needs: 577 | - native-tests 578 | - get-test-matrix 579 | uses: ./.github/workflows/native-tests-stats-upload.yml 580 | with: 581 | artifacts-suffix: ${{ needs.get-test-matrix.outputs.artifacts-suffix }} 582 | build-stats-tag: ${{ inputs.build-stats-tag }} 583 | secrets: 584 | UPLOAD_COLLECTOR_TOKEN: ${{ secrets.UPLOAD_COLLECTOR_TOKEN }} 585 | 586 | mandrel-integration-tests: 587 | name: Q Mandrel IT 588 | if: always() && needs.build-quarkus.result == 'success' 589 | needs: 590 | - build-vars 591 | - build-mandrel 592 | - get-jdk 593 | - build-quarkus 594 | - get-test-matrix 595 | runs-on: ubuntu-latest 596 | env: 597 | # leave more space for the actual native compilation and execution 598 | MAVEN_OPTS: -Xmx1g 599 | # Don't perform performance checks since GH runners are not that stable 600 | FAIL_ON_PERF_REGRESSION: false 601 | # USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM: false 602 | timeout-minutes: 80 603 | strategy: 604 | fail-fast: false 605 | steps: 606 | - uses: actions/checkout@v4 607 | with: 608 | repository: graalvm/mandrel 609 | fetch-depth: 1 610 | path: workflow-mandrel 611 | - uses: actions/checkout@v4 612 | with: 613 | repository: Karm/mandrel-integration-tests 614 | fetch-depth: 1 615 | path: ${{ env.MANDREL_IT_PATH }} 616 | - name: Download Maven Repo 617 | uses: actions/download-artifact@v4 618 | with: 619 | name: linux-maven-repo-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 620 | path: . 621 | - name: Extract Maven Repo 622 | run: tar -xzvf maven-repo.tgz -C ~ 623 | # Use Java 17 for Quarkus as it doesn't work with Java 21 yet 624 | - uses: actions/setup-java@v4 625 | with: 626 | distribution: 'temurin' 627 | java-version: '17' 628 | - name: Download Mandrel or GraalVM 629 | if: inputs.builder-image == 'null' 630 | uses: actions/download-artifact@v4 631 | with: 632 | name: jdk-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 633 | path: . 634 | - name: Extract Mandrel or GraalVM 635 | if: inputs.builder-image == 'null' 636 | shell: bash 637 | run: | 638 | mkdir -p ${GRAALVM_HOME} 639 | tar -xzvf jdk.tgz -C ${GRAALVM_HOME} --strip-components=1 640 | - name: Update Docker Client User Agent 641 | run: | 642 | if [ -f ~/.docker/config.json ]; then 643 | cat <<< $(jq '.HttpHeaders += {"User-Agent": "Mandrel-CI-Docker-Client"}' ~/.docker/config.json) > ~/.docker/config.json.new 644 | mv ~/.docker/config.json.new ~/.docker/config.json 645 | fi 646 | - name: Install gdb 647 | run: | 648 | sudo apt-get update -y 649 | sudo apt-get install -y gdb 650 | - name: Build with Maven 651 | run: | 652 | cd ${MANDREL_IT_PATH} 653 | export PATH="${GRAALVM_HOME}/bin:$PATH" 654 | export QUARKUS_VERSION=${{ needs.get-test-matrix.outputs.quarkus-version }} 655 | # Don't use SNAPSHOT version for 2.2 and release tags 656 | if [ "${{ inputs.quarkus-version }}" == "2.2" ] 657 | then 658 | export QUARKUS_VERSION=2.2.999 659 | elif $(expr match "${{ inputs.quarkus-version }}" "^[0-9]\+\.[0-9]\+$" > /dev/null) 660 | then 661 | # release branches use the branch name followed by .999-SNAPSHOT as the version 662 | export QUARKUS_VERSION="${{ inputs.quarkus-version }}.999-SNAPSHOT" 663 | elif ! $(expr match "$QUARKUS_VERSION" "^.*\.\(Final\|CR\|Alpha\|Beta\)[0-9]\?$" > /dev/null) 664 | then 665 | export QUARKUS_VERSION="999-SNAPSHOT" 666 | fi 667 | echo $QUARKUS_VERSION 668 | if [[ ${{ inputs.builder-image }} == "null" ]] 669 | then 670 | ${GRAALVM_HOME}/bin/native-image --version 671 | mvn clean verify -Dquarkus.native.native-image-xmx=13g \ 672 | -Dquarkus.version=$QUARKUS_VERSION \ 673 | -Ptestsuite 674 | else 675 | mvn clean verify -Dquarkus.native.native-image-xmx=13g \ 676 | -Dquarkus.version=$QUARKUS_VERSION \ 677 | -Dquarkus.native.builder-image=${{ inputs.builder-image }} \ 678 | -Ptestsuite-builder-image 679 | fi 680 | - name: Prepare failure archive (if maven failed) 681 | if: failure() 682 | run: tar czvf test-reports-mandrel-it.tgz ${MANDREL_IT_PATH}/testsuite/target/archived-logs/ 683 | - name: Upload failure Archive (if maven failed) 684 | uses: actions/upload-artifact@v4 685 | if: failure() 686 | with: 687 | name: test-reports-mandrel-it-${{ needs.get-test-matrix.outputs.artifacts-suffix }} 688 | path: 'test-reports-mandrel-it.tgz' 689 | -------------------------------------------------------------------------------- /.github/workflows/build-quarkus.yml: -------------------------------------------------------------------------------- 1 | name: Build Quarkus 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | artifacts-suffix: 7 | type: string 8 | description: 'The maven repo artifact suffix to use' 9 | default: "null" 10 | build-from-source: 11 | type: boolean 12 | description: 'Build from source or use a release' 13 | default: true 14 | builder-image: 15 | type: string 16 | 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)' 17 | default: "null" 18 | maven-deploy-local: 19 | type: string 20 | description: 'Build flag controlling whether to deploy maven artifacts locally' 21 | default: "" 22 | target-os: 23 | type: string 24 | description: 'The operating system we are building for (linux or windows)' 25 | default: "linux" 26 | quarkus-repo: 27 | type: string 28 | description: 'The Quarkus repository to be used' 29 | default: 'quarkusio/quarkus' 30 | quarkus-version: 31 | type: string 32 | description: 'Quarkus version to test (branch, tag, commit, or "latest")' 33 | # "latest" is replaced by the latest release available in maven 34 | default: "main" 35 | # Builder image can't be tested on Windows due to https://github.com/actions/virtual-environments/issues/1143 36 | # builder-image: 37 | # 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)' 38 | # default: "null" 39 | 40 | env: 41 | QUARKUS_PATH: quarkus 42 | COMMON_MAVEN_ARGS: "-e -B --settings .github/mvn-settings.xml --fail-at-end" 43 | MANDREL_HOME: ${{ github.workspace }}/mandrelvm 44 | 45 | jobs: 46 | build-quarkus: 47 | name: Quarkus build 48 | runs-on: ubuntu-latest 49 | strategy: 50 | fail-fast: false 51 | steps: 52 | - uses: actions/checkout@v4 53 | with: 54 | repository: graalvm/mandrel 55 | fetch-depth: 1 56 | path: workflow-mandrel 57 | - uses: actions/checkout@v4 58 | with: 59 | repository: ${{ inputs.quarkus-repo }} 60 | fetch-depth: 1 61 | ref: ${{ inputs.quarkus-version }} 62 | path: ${{ env.QUARKUS_PATH }} 63 | - uses: actions/cache@v4 64 | with: 65 | path: ~/.m2/repository 66 | key: ${{ inputs.target-os }}-${{ inputs.quarkus-version }}-maven-${{ hashFiles('**/pom.xml') }} 67 | restore-keys: ${{ inputs.target-os }}-${{ inputs.quarkus-version }}-maven- 68 | - name: Change quarkus.version for Quarkus 2.2 to make mandrel-integration-test not apply quarkus_main.patch 69 | # See https://github.com/Karm/mandrel-integration-tests/pull/64 70 | run: | 71 | if [ "${{ inputs.quarkus-version }}" == "2.2" ] 72 | then 73 | cd quarkus 74 | bash ../workflow-mandrel/.github/update_quarkus_version.sh 2.2.999 75 | fi 76 | # Use Java 17 to build Quarkus as that's the lowest supported JDK version currently 77 | - uses: actions/setup-java@v4 78 | with: 79 | distribution: 'temurin' 80 | java-version: '17' 81 | - name: Download GraalVM Maven Repo 82 | if: ${{ inputs.build-from-source == true && inputs.builder-image == 'null' && inputs.maven-deploy-local != ''}} 83 | uses: actions/download-artifact@v4 84 | with: 85 | name: org-graalvm-artefacts-${{ inputs.artifacts-suffix }} 86 | path: . 87 | - name: Download GraalVM Maven Version 88 | if: ${{ inputs.build-from-source == true && inputs.builder-image == 'null' && inputs.maven-deploy-local != ''}} 89 | uses: actions/download-artifact@v4 90 | with: 91 | name: mandrel-maven-version-${{ inputs.artifacts-suffix }} 92 | path: . 93 | - name: Extract GraalVM Maven Repo and GraalVM Maven Version 94 | if: ${{ inputs.build-from-source == true && inputs.builder-image == 'null' && inputs.maven-deploy-local != ''}} 95 | run: | 96 | tar -xzvf graalvm-maven-artefacts.tgz -C ~ 97 | tar -xzvf graalvm-version.tgz -C $(dirname ${MANDREL_HOME}) 98 | - name: Build quarkus with local graalvm version 99 | if: ${{ inputs.build-from-source == true && inputs.builder-image == 'null' && inputs.maven-deploy-local != ''}} 100 | run: | 101 | rm -f maven_graalvm_before_build.txt maven_graalvm_after_build.txt 102 | find ~/.m2/repository/org/graalvm | sort > maven_graalvm_before_build.txt 103 | GRAAL_MVN_ARTIFACTS_VERS=$(cat ${MANDREL_HOME}/.maven-version) 104 | echo "Building quarkus with locally installed GraalVM maven artefacts in version: ${GRAAL_MVN_ARTIFACTS_VERS}" 105 | cd ${QUARKUS_PATH} 106 | ./mvnw ${COMMON_MAVEN_ARGS} -Dquickly -Dgraal-sdk.version="${GRAAL_MVN_ARTIFACTS_VERS}" 107 | cd - 108 | find ~/.m2/repository/org/graalvm | sort > maven_graalvm_after_build.txt 109 | diff -u maven_graalvm_before_build.txt maven_graalvm_after_build.txt 110 | - name: Build quarkus with default graalvm version 111 | if: ${{ inputs.build-from-source == false || inputs.builder-image != 'null' || inputs.maven-deploy-local == ''}} 112 | run: | 113 | cd ${QUARKUS_PATH} 114 | ./mvnw ${COMMON_MAVEN_ARGS} -Dquickly 115 | cd - 116 | - name: Tar Maven Repo 117 | if: inputs.target-os != 'windows' 118 | run: | 119 | tar -czvf maven-repo.tgz -C ~ .m2/repository 120 | - name: Tar Maven Repo (windows) 121 | if: inputs.target-os == 'windows' 122 | run: | 123 | tar -I 'pigz -9' -cf maven-repo.tgz -C ~ .m2/repository 124 | - name: Persist Maven Repo 125 | uses: actions/upload-artifact@v4 126 | with: 127 | name: ${{ inputs.target-os }}-maven-repo-${{ inputs.artifacts-suffix }} 128 | path: maven-repo.tgz 129 | - name: Delete Local Quarkus Artifacts From Cache 130 | run: | 131 | rm -r ~/.m2/repository/io/quarkus 132 | - name: Delete Local GraalVM Artifacts From Cache 133 | if: ${{ inputs.build-from-source == true && inputs.builder-image == 'null' && inputs.maven-deploy-local != ''}} 134 | run: | 135 | rm -rf ~/.m2/repository/org/graalvm 136 | -------------------------------------------------------------------------------- /.github/workflows/github-issue-updater.yml: -------------------------------------------------------------------------------- 1 | name: GitHub Issue Updater 2 | 3 | on: 4 | workflow_run: 5 | workflows: ["Nightly CI", "Weekly CI", "Repo Sync"] 6 | types: 7 | - completed 8 | branches: 9 | - default 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v4 16 | with: 17 | repository: graalvm/mandrel 18 | fetch-depth: 1 19 | ref: ${{ github.event.workflow_run.head_branch }} 20 | path: workflow-mandrel 21 | - name: Get Triggering Workflow Run ID 22 | shell: bash 23 | run: | 24 | echo "Triggering Workflow Run ID: ${{ github.event.workflow_run.id }}" 25 | - uses: actions/setup-java@v4 26 | with: 27 | distribution: 'temurin' 28 | java-version: '21' 29 | - name: Setup jbang and report results 30 | env: 31 | BOT_TOKEN: ${{ secrets.MANDREL_BOT_TOKEN }} 32 | run: | 33 | echo "Installing JBang" 34 | wget https://github.com/jbangdev/jbang/releases/download/v0.121.0/jbang.zip 35 | unzip jbang.zip 36 | echo "Attempting to report results" 37 | ./jbang/bin/jbang ./workflow-mandrel/.github/quarkus-ecosystem-issue.java \ 38 | token="${BOT_TOKEN}" \ 39 | thisRepo="${{ github.event.workflow_run.repository.full_name }}" \ 40 | runId="${{ github.event.workflow_run.id }}" 41 | -------------------------------------------------------------------------------- /.github/workflows/mark-stale-issues-and-prs.yml: -------------------------------------------------------------------------------- 1 | name: Mark stale issues and PRs 2 | 3 | on: 4 | schedule: 5 | - cron: '0 0 * * *' 6 | 7 | permissions: 8 | issues: write 9 | pull-requests: write 10 | 11 | jobs: 12 | mark-stale-issues-and-prs: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/stale@v6 16 | with: 17 | repo-token: ${{ secrets.GITHUB_TOKEN }} 18 | stale-issue-message: 'This issue appears to be stale because it has been open 30 days with no activity. This issue will be closed in 7 days unless `Stale` label is removed, a new comment is made, or `not-Stale` label is added.' 19 | exempt-issue-labels: 'not-Stale' 20 | stale-pr-message: 'This PR appears to be stale because it has been open 30 days with no activity. This PR will be closed in 7 days unless `Stale` label is removed, a new comment is made, or `not-Stale` label is added.' 21 | exempt-pr-labels: 'not-Stale' 22 | labels-to-remove-when-unstale: 'Stale' 23 | days-before-stale: 30 24 | days-before-close: 7 25 | -------------------------------------------------------------------------------- /.github/workflows/native-tests-stats-upload.yml: -------------------------------------------------------------------------------- 1 | name: Native tests stats upload 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | artifacts-suffix: 7 | type: string 8 | description: 'The stats artifact suffix to download' 9 | default: "null" 10 | build-stats-tag: 11 | type: string 12 | description: 'The tag to use for build stats upload of native tests (e.g. 22.3.0-dev-jdk17-mytest-patch-before)' 13 | default: "null" 14 | secrets: 15 | UPLOAD_COLLECTOR_TOKEN: 16 | description: 'A token used to report build statistics to a collector' 17 | required: false 18 | 19 | jobs: 20 | native-tests-stats-upload: 21 | name: Upload build stats to collector 22 | runs-on: ubuntu-latest 23 | steps: 24 | - uses: actions/checkout@v4 25 | with: 26 | repository: graalvm/mandrel 27 | fetch-depth: 1 28 | path: workflow-mandrel 29 | - uses: actions/download-artifact@v4 30 | with: 31 | pattern: build-stats-*-${{ inputs.artifacts-suffix }} 32 | path: . 33 | - name: Extract and import build stats 34 | env: 35 | BUILD_STATS_TAG: ${{ inputs.build-stats-tag }} 36 | UPLOAD_TOKEN: ${{ secrets.UPLOAD_COLLECTOR_TOKEN }} 37 | COLLECTOR_URL: https://collector.foci.life/api/v1/image-stats 38 | shell: bash 39 | run: | 40 | ls ./build-stats-*/ 41 | echo "Tag for stat upload is going to be: '${BUILD_STATS_TAG}'" 42 | for directory in ./build-stats-*/; do 43 | echo "Processing $directory" 44 | cd "$directory" 45 | tar -xvf build-stats.tgz 46 | DIR=./quarkus TAG="${BUILD_STATS_TAG}" TOKEN="${UPLOAD_TOKEN}" URL="${COLLECTOR_URL}" bash ../workflow-mandrel/.github/import_stats.sh 47 | cd - 48 | done 49 | -------------------------------------------------------------------------------- /.github/workflows/nightly.yml: -------------------------------------------------------------------------------- 1 | name: Nightly CI 2 | 3 | on: 4 | push: 5 | paths: 6 | - '.github/workflows/nightly.yml' 7 | - '.github/workflows/base.yml' 8 | - '.github/workflows/base-windows.yml' 9 | pull_request: 10 | paths: 11 | - '.github/workflows/nightly.yml' 12 | - '.github/workflows/base.yml' 13 | - '.github/workflows/base-windows.yml' 14 | schedule: 15 | # Don't run on weekends as merges are infrequent 16 | - cron: '15 0 * * 2-6' 17 | workflow_dispatch: 18 | 19 | # The following aims to reduce CI CPU cycles by: 20 | # 1. Cancelling any previous builds of this PR when pushing new changes to it 21 | # 2. Cancelling any previous builds of a branch when pushing new changes to it in a fork 22 | # 3. Cancelling any pending builds, but not active ones, when pushing to a branch in the main 23 | # repository. This prevents us from constantly cancelling CI runs, while being able to skip 24 | # intermediate builds. E.g., if we perform two pushes the first one will start a CI job and 25 | # the second one will add another one to the queue; if we perform a third push while the 26 | # first CI job is still running the previously queued CI job (for the second push) will be 27 | # cancelled and a new CI job will be queued for the latest (third) push. 28 | concurrency: 29 | group: "workflow = ${{ github.workflow }}, ref = ${{ github.event.ref }}, pr = ${{ github.event.pull_request.id }}" 30 | cancel-in-progress: ${{ github.event_name == 'pull_request' || github.repository != 'graalvm/mandrel' }} 31 | 32 | jobs: 33 | #### 34 | # Test Quarkus main with latest graal sources built as Mandrel and GraalVM 35 | #### 36 | q-main-graal-25-latest: 37 | name: "Q main G 25 latest" 38 | uses: ./.github/workflows/base.yml 39 | with: 40 | quarkus-version: "main" 41 | version: "graal/master" 42 | build-type: "graal-source" 43 | jdk: "latest/ea" 44 | build-stats-tag: "gha-linux-graal-qmain-glatest-jdk25ea" 45 | secrets: 46 | UPLOAD_COLLECTOR_TOKEN: ${{ secrets.UPLOAD_COLLECTOR_TOKEN }} 47 | q-main-mandrel-25-latest: 48 | name: "Q main M 25 latest" 49 | uses: ./.github/workflows/base.yml 50 | with: 51 | quarkus-version: "main" 52 | version: "graal/master" 53 | jdk: "25/ea" 54 | issue-number: "812" 55 | issue-repo: "graalvm/mandrel" 56 | mandrel-it-issue-number: "300" 57 | build-stats-tag: "gha-linux-mandrel-qmain-mlatest-jdk25ea" 58 | secrets: 59 | ISSUE_BOT_TOKEN: ${{ secrets.MANDREL_BOT_TOKEN }} 60 | UPLOAD_COLLECTOR_TOKEN: ${{ secrets.UPLOAD_COLLECTOR_TOKEN }} 61 | q-main-mandrel-25-latest-win: 62 | name: "Q main M 25 latest windows" 63 | uses: ./.github/workflows/base-windows.yml 64 | with: 65 | quarkus-version: "main" 66 | version: "graal/master" 67 | issue-number: "813" 68 | issue-repo: "graalvm/mandrel" 69 | mandrel-it-issue-number: "301" 70 | jdk: "25/ea" 71 | build-stats-tag: "gha-win-mandrel-qmain-mlatest-jdk25ea" 72 | secrets: 73 | ISSUE_BOT_TOKEN: ${{ secrets.MANDREL_BOT_TOKEN }} 74 | UPLOAD_COLLECTOR_TOKEN: ${{ secrets.UPLOAD_COLLECTOR_TOKEN }} 75 | -------------------------------------------------------------------------------- /.github/workflows/repo-sync.yml: -------------------------------------------------------------------------------- 1 | name: Repo Sync 2 | 3 | on: 4 | push: 5 | branches: 6 | - default 7 | paths: 8 | - .github/workflows/repo-sync.yml 9 | schedule: 10 | - cron: '0 0 * * *' 11 | 12 | permissions: 13 | contents: write 14 | 15 | jobs: 16 | graal-master: 17 | name: Keep graal/master in sync with upstream master 18 | runs-on: ubuntu-latest 19 | steps: 20 | - name: Checkout graal/master branch 21 | uses: actions/checkout@v4 22 | with: 23 | ref: graal/master 24 | fetch-depth: 0 25 | - name: Echo issue repo and number 26 | run: | 27 | echo "issue-repo: graalvm/mandrel" 28 | echo "issue-number: 741" 29 | - name: Sync branch 30 | run: | 31 | git config --local user.email "fzakkak@redhat.com" 32 | git config --local user.name "Foivos Zakkak through GH action" 33 | git remote add upstream https://github.com/oracle/graal 34 | git fetch upstream master 35 | git merge --ff-only upstream/master 36 | git push --quiet origin graal/master 37 | -------------------------------------------------------------------------------- /.github/workflows/weekly.yml: -------------------------------------------------------------------------------- 1 | name: Weekly CI 2 | 3 | on: 4 | push: 5 | paths: 6 | - '.github/workflows/weekly.yml' 7 | - '.github/workflows/base.yml' 8 | - '.github/workflows/base-windows.yml' 9 | pull_request: 10 | paths: 11 | - '.github/workflows/weekly.yml' 12 | - '.github/workflows/base.yml' 13 | - '.github/workflows/base-windows.yml' 14 | schedule: 15 | # Run at 00:00 on Sundays 16 | - cron: '0 0 * * 0' 17 | workflow_dispatch: 18 | 19 | # The following aims to reduce CI CPU cycles by: 20 | # 1. Cancelling any previous builds of this PR when pushing new changes to it 21 | # 2. Cancelling any previous builds of a branch when pushing new changes to it in a fork 22 | # 3. Cancelling any pending builds, but not active ones, when pushing to a branch in the main 23 | # repository. This prevents us from constantly cancelling CI runs, while being able to skip 24 | # intermediate builds. E.g., if we perform two pushes the first one will start a CI job and 25 | # the second one will add another one to the queue; if we perform a third push while the 26 | # first CI job is still running the previously queued CI job (for the second push) will be 27 | # cancelled and a new CI job will be queued for the latest (third) push. 28 | concurrency: 29 | group: "workflow = ${{ github.workflow }}, ref = ${{ github.event.ref }}, pr = ${{ github.event.pull_request.id }}" 30 | cancel-in-progress: ${{ github.event_name == 'pull_request' || github.repository != 'graalvm/mandrel' }} 31 | 32 | jobs: 33 | #### 34 | # Test Q main and Mandrel 24.2 JDK 24 35 | #### 36 | q-main-mandrel-24_2-ea: 37 | name: "Q main M 24.2 JDK 24 EA" 38 | uses: ./.github/workflows/base.yml 39 | with: 40 | quarkus-version: "main" 41 | version: "mandrel/24.2" 42 | jdk: "24/ea" 43 | issue-number: "814" 44 | issue-repo: "graalvm/mandrel" 45 | mandrel-it-issue-number: "302" 46 | build-stats-tag: "gha-linux-qmain-m24_2-jdk24ea" 47 | mandrel-packaging-version: "24.2" 48 | secrets: 49 | ISSUE_BOT_TOKEN: ${{ secrets.MANDREL_BOT_TOKEN }} 50 | UPLOAD_COLLECTOR_TOKEN: ${{ secrets.UPLOAD_COLLECTOR_TOKEN }} 51 | q-main-mandrel-24_2-ea-win: 52 | name: "Q main M 24.2 JDK 24 EA windows" 53 | uses: ./.github/workflows/base-windows.yml 54 | with: 55 | quarkus-version: "main" 56 | version: "mandrel/24.2" 57 | jdk: "24/ea" 58 | issue-number: "815" 59 | issue-repo: "graalvm/mandrel" 60 | mandrel-it-issue-number: "303" 61 | build-stats-tag: "gha-win-qmain-m24_2-jdk24ea" 62 | mandrel-packaging-version: "24.2" 63 | secrets: 64 | ISSUE_BOT_TOKEN: ${{ secrets.MANDREL_BOT_TOKEN }} 65 | UPLOAD_COLLECTOR_TOKEN: ${{ secrets.UPLOAD_COLLECTOR_TOKEN }} 66 | #### 67 | # Test Q main and Mandrel 23.1 JDK 21 68 | #### 69 | q-main-mandrel-23_1: 70 | name: "Q main M 23.1 JDK 21" 71 | uses: ./.github/workflows/base.yml 72 | with: 73 | quarkus-version: "main" 74 | version: "mandrel/23.1" 75 | jdk: "21/ea" 76 | issue-number: "739" 77 | issue-repo: "graalvm/mandrel" 78 | mandrel-it-issue-number: "198" 79 | build-stats-tag: "gha-linux-qmain-m23_1-jdk21ea" 80 | mandrel-packaging-version: "23.1" 81 | secrets: 82 | ISSUE_BOT_TOKEN: ${{ secrets.MANDREL_BOT_TOKEN }} 83 | UPLOAD_COLLECTOR_TOKEN: ${{ secrets.UPLOAD_COLLECTOR_TOKEN }} 84 | q-main-mandrel-23_1-win: 85 | name: "Q main M 23.1 windows" 86 | uses: ./.github/workflows/base-windows.yml 87 | with: 88 | quarkus-version: "main" 89 | version: "mandrel/23.1" 90 | jdk: "21/ea" 91 | issue-number: "740" 92 | issue-repo: "graalvm/mandrel" 93 | mandrel-it-issue-number: "199" 94 | build-stats-tag: "gha-win-qmain-m23_1-jdk21ea" 95 | mandrel-packaging-version: "23.1" 96 | secrets: 97 | ISSUE_BOT_TOKEN: ${{ secrets.MANDREL_BOT_TOKEN }} 98 | UPLOAD_COLLECTOR_TOKEN: ${{ secrets.UPLOAD_COLLECTOR_TOKEN }} 99 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.aux 3 | *.bak 4 | *.bgv 5 | *.cfg 6 | *.class 7 | *.config 8 | *.csv 9 | *.dot 10 | *.hprof 11 | *.iml 12 | *.jar 13 | *.log 14 | *.o 15 | *.obj 16 | *.orig 17 | *.pdf 18 | *.pyc 19 | *.rej 20 | *.swn 21 | *.swo 22 | *.swp 23 | *.zip 24 | .DS_Store 25 | .checkstyle 26 | .classpath 27 | .externalToolBuilders 28 | .factorypath 29 | .idea 30 | .metadata/ 31 | .project 32 | .pydevproject 33 | .settings/ 34 | bin/ 35 | build.xml 36 | clibraries/ 37 | svmbuild/ 38 | core.* 39 | eclipse-launches/ 40 | env 41 | hs_err_pid*.log 42 | javadoc/ 43 | lib/ 44 | mx.imports/ 45 | mxbuild/ 46 | nbproject/ 47 | scratch/ 48 | src_gen/ 49 | test-output/ 50 | workingsets.xml 51 | bench-results.json 52 | jmh_result.json 53 | /vm/src/installer/dist/ 54 | /tools/generators/node_modules/ 55 | /tools/generators/out/ -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Mandrel 2 | 3 | Mandrel is a downstream distribution of [GraalVM CE](www.github.com/oracle/graal). 4 | As a result contributions to Mandrel should be limited to: 5 | 6 | 1. Backports from the upstream repository of GraalVM (e.g. bringing a feature/bug-fix from GraalVM CE 20.2 to Mandrel 20.1) 7 | 2. Mandrel specific bug fixes (e.g. patches to make it work with upstream OpenJDK instead of [LabsJDK CE](https://github.com/graalvm/labs-openjdk-11)) 8 | 3. Mandrel specific documentation 9 | 10 | Anything not fitting the above list should probably be contributed upstream instead. 11 | 12 | ## Workflow 13 | 14 | Mandrel follows the github workflow. 15 | To contribute please fork this repository and open a pull request (PR). 16 | 17 | ## Repository Structure 18 | 19 | Mandrel, being a downstream distribution of GraalVM CE, is not developed on the `default` branch. 20 | Instead version specific branches, based on the corresponding GraalVM CE release, are used for development and maintenance. 21 | For instance, Mandrel 20.1.x.x releases are developed in the `mandrel/20.1` branch. 22 | Similarly, Mandrel 20.2.x.x releases are developed in the `mandrel/20.2` branch and so on. 23 | 24 | The `default` branch is used only as a landing page and for hosting some housekeeping github actions workflows and templates. 25 | 26 | In addition to the `mandrel/XX.Y` branches Mandrel also includes `graal/X` branches like `graal/master`. 27 | These branches are mirrors of the corresponding upstream branch and are being synchronized and tested nightly, in an effort to detect breaking changes upstream as soon as possible. 28 | 29 | ## Oracle Contributor Agreement (OCA) 30 | 31 | As part of the GraalVM community and similarly to OpenJDK, Mandrel requires contributors to sign the [Oracle Contributor Agreement (OCA)](https://www.oracle.com/technical-resources/oracle-contributor-agreement.html). 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Product License - GraalVM Community Edition 2 | 3 | This is a release of GraalVM Community Edition. GraalVM Community Edition 4 | consists of multiple modules. The software as a whole, as well as the JVMCI 5 | and VisualVM modules, are released under version 2 of the GNU General Public 6 | License with the “Classpath” Exception. 7 | The text of the foregoing licenses is reproduced below. 8 | 9 | Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. 10 | 11 | =========================================================================== 12 | 13 | The GNU General Public License (GPL) 14 | 15 | Version 2, June 1991 16 | 17 | Copyright (C) 1989, 1991 Free Software Foundation, Inc. 18 | 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 | 20 | Everyone is permitted to copy and distribute verbatim copies of this license 21 | document, but changing it is not allowed. 22 | 23 | Preamble 24 | 25 | The licenses for most software are designed to take away your freedom to share 26 | and change it. By contrast, the GNU General Public License is intended to 27 | guarantee your freedom to share and change free software--to make sure the 28 | software is free for all its users. This General Public License applies to 29 | most of the Free Software Foundation's software and to any other program whose 30 | authors commit to using it. (Some other Free Software Foundation software is 31 | covered by the GNU Library General Public License instead.) You can apply it to 32 | your programs, too. 33 | 34 | When we speak of free software, we are referring to freedom, not price. Our 35 | General Public Licenses are designed to make sure that you have the freedom to 36 | distribute copies of free software (and charge for this service if you wish), 37 | that you receive source code or can get it if you want it, that you can change 38 | the software or use pieces of it in new free programs; and that you know you 39 | can do these things. 40 | 41 | To protect your rights, we need to make restrictions that forbid anyone to deny 42 | you these rights or to ask you to surrender the rights. These restrictions 43 | translate to certain responsibilities for you if you distribute copies of the 44 | software, or if you modify it. 45 | 46 | For example, if you distribute copies of such a program, whether gratis or for 47 | a fee, you must give the recipients all the rights that you have. You must 48 | make sure that they, too, receive or can get the source code. And you must 49 | show them these terms so they know their rights. 50 | 51 | We protect your rights with two steps: (1) copyright the software, and (2) 52 | offer you this license which gives you legal permission to copy, distribute 53 | and/or modify the software. 54 | 55 | Also, for each author's protection and ours, we want to make certain that 56 | everyone understands that there is no warranty for this free software. If the 57 | software is modified by someone else and passed on, we want its recipients to 58 | know that what they have is not the original, so that any problems introduced 59 | by others will not reflect on the original authors' reputations. 60 | 61 | Finally, any free program is threatened constantly by software patents. We 62 | wish to avoid the danger that redistributors of a free program will 63 | individually obtain patent licenses, in effect making the program proprietary. 64 | To prevent this, we have made it clear that any patent must be licensed for 65 | everyone's free use or not licensed at all. 66 | 67 | The precise terms and conditions for copying, distribution and modification 68 | follow. 69 | 70 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 71 | 72 | 0. This License applies to any program or other work which contains a notice 73 | placed by the copyright holder saying it may be distributed under the terms of 74 | this General Public License. The "Program", below, refers to any such program 75 | or work, and a "work based on the Program" means either the Program or any 76 | derivative work under copyright law: that is to say, a work containing the 77 | Program or a portion of it, either verbatim or with modifications and/or 78 | translated into another language. (Hereinafter, translation is included 79 | without limitation in the term "modification".) Each licensee is addressed as 80 | "you". 81 | 82 | Activities other than copying, distribution and modification are not covered by 83 | this License; they are outside its scope. The act of running the Program is 84 | not restricted, and the output from the Program is covered only if its contents 85 | constitute a work based on the Program (independent of having been made by 86 | running the Program). Whether that is true depends on what the Program does. 87 | 88 | 1. You may copy and distribute verbatim copies of the Program's source code as 89 | you receive it, in any medium, provided that you conspicuously and 90 | appropriately publish on each copy an appropriate copyright notice and 91 | disclaimer of warranty; keep intact all the notices that refer to this License 92 | and to the absence of any warranty; and give any other recipients of the 93 | Program a copy of this License along with the Program. 94 | 95 | You may charge a fee for the physical act of transferring a copy, and you may 96 | at your option offer warranty protection in exchange for a fee. 97 | 98 | 2. You may modify your copy or copies of the Program or any portion of it, thus 99 | forming a work based on the Program, and copy and distribute such modifications 100 | or work under the terms of Section 1 above, provided that you also meet all of 101 | these conditions: 102 | 103 | a) You must cause the modified files to carry prominent notices stating 104 | that you changed the files and the date of any change. 105 | 106 | b) You must cause any work that you distribute or publish, that in whole or 107 | in part contains or is derived from the Program or any part thereof, to be 108 | licensed as a whole at no charge to all third parties under the terms of 109 | this License. 110 | 111 | c) If the modified program normally reads commands interactively when run, 112 | you must cause it, when started running for such interactive use in the 113 | most ordinary way, to print or display an announcement including an 114 | appropriate copyright notice and a notice that there is no warranty (or 115 | else, saying that you provide a warranty) and that users may redistribute 116 | the program under these conditions, and telling the user how to view a copy 117 | of this License. (Exception: if the Program itself is interactive but does 118 | not normally print such an announcement, your work based on the Program is 119 | not required to print an announcement.) 120 | 121 | These requirements apply to the modified work as a whole. If identifiable 122 | sections of that work are not derived from the Program, and can be reasonably 123 | considered independent and separate works in themselves, then this License, and 124 | its terms, do not apply to those sections when you distribute them as separate 125 | works. But when you distribute the same sections as part of a whole which is a 126 | work based on the Program, the distribution of the whole must be on the terms 127 | of this License, whose permissions for other licensees extend to the entire 128 | whole, and thus to each and every part regardless of who wrote it. 129 | 130 | Thus, it is not the intent of this section to claim rights or contest your 131 | rights to work written entirely by you; rather, the intent is to exercise the 132 | right to control the distribution of derivative or collective works based on 133 | the Program. 134 | 135 | In addition, mere aggregation of another work not based on the Program with the 136 | Program (or with a work based on the Program) on a volume of a storage or 137 | distribution medium does not bring the other work under the scope of this 138 | License. 139 | 140 | 3. You may copy and distribute the Program (or a work based on it, under 141 | Section 2) in object code or executable form under the terms of Sections 1 and 142 | 2 above provided that you also do one of the following: 143 | 144 | a) Accompany it with the complete corresponding machine-readable source 145 | code, which must be distributed under the terms of Sections 1 and 2 above 146 | on a medium customarily used for software interchange; or, 147 | 148 | b) Accompany it with a written offer, valid for at least three years, to 149 | give any third party, for a charge no more than your cost of physically 150 | performing source distribution, a complete machine-readable copy of the 151 | corresponding source code, to be distributed under the terms of Sections 1 152 | and 2 above on a medium customarily used for software interchange; or, 153 | 154 | c) Accompany it with the information you received as to the offer to 155 | distribute corresponding source code. (This alternative is allowed only 156 | for noncommercial distribution and only if you received the program in 157 | object code or executable form with such an offer, in accord with 158 | Subsection b above.) 159 | 160 | The source code for a work means the preferred form of the work for making 161 | modifications to it. For an executable work, complete source code means all 162 | the source code for all modules it contains, plus any associated interface 163 | definition files, plus the scripts used to control compilation and installation 164 | of the executable. However, as a special exception, the source code 165 | distributed need not include anything that is normally distributed (in either 166 | source or binary form) with the major components (compiler, kernel, and so on) 167 | of the operating system on which the executable runs, unless that component 168 | itself accompanies the executable. 169 | 170 | If distribution of executable or object code is made by offering access to copy 171 | from a designated place, then offering equivalent access to copy the source 172 | code from the same place counts as distribution of the source code, even though 173 | third parties are not compelled to copy the source along with the object code. 174 | 175 | 4. You may not copy, modify, sublicense, or distribute the Program except as 176 | expressly provided under this License. Any attempt otherwise to copy, modify, 177 | sublicense or distribute the Program is void, and will automatically terminate 178 | your rights under this License. However, parties who have received copies, or 179 | rights, from you under this License will not have their licenses terminated so 180 | long as such parties remain in full compliance. 181 | 182 | 5. You are not required to accept this License, since you have not signed it. 183 | However, nothing else grants you permission to modify or distribute the Program 184 | or its derivative works. These actions are prohibited by law if you do not 185 | accept this License. Therefore, by modifying or distributing the Program (or 186 | any work based on the Program), you indicate your acceptance of this License to 187 | do so, and all its terms and conditions for copying, distributing or modifying 188 | the Program or works based on it. 189 | 190 | 6. Each time you redistribute the Program (or any work based on the Program), 191 | the recipient automatically receives a license from the original licensor to 192 | copy, distribute or modify the Program subject to these terms and conditions. 193 | You may not impose any further restrictions on the recipients' exercise of the 194 | rights granted herein. You are not responsible for enforcing compliance by 195 | third parties to this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), conditions 199 | are imposed on you (whether by court order, agreement or otherwise) that 200 | contradict the conditions of this License, they do not excuse you from the 201 | conditions of this License. If you cannot distribute so as to satisfy 202 | simultaneously your obligations under this License and any other pertinent 203 | obligations, then as a consequence you may not distribute the Program at all. 204 | For example, if a patent license would not permit royalty-free redistribution 205 | of the Program by all those who receive copies directly or indirectly through 206 | you, then the only way you could satisfy both it and this License would be to 207 | refrain entirely from distribution of the Program. 208 | 209 | If any portion of this section is held invalid or unenforceable under any 210 | particular circumstance, the balance of the section is intended to apply and 211 | the section as a whole is intended to apply in other circumstances. 212 | 213 | It is not the purpose of this section to induce you to infringe any patents or 214 | other property right claims or to contest validity of any such claims; this 215 | section has the sole purpose of protecting the integrity of the free software 216 | distribution system, which is implemented by public license practices. Many 217 | people have made generous contributions to the wide range of software 218 | distributed through that system in reliance on consistent application of that 219 | system; it is up to the author/donor to decide if he or she is willing to 220 | distribute software through any other system and a licensee cannot impose that 221 | choice. 222 | 223 | This section is intended to make thoroughly clear what is believed to be a 224 | consequence of the rest of this License. 225 | 226 | 8. If the distribution and/or use of the Program is restricted in certain 227 | countries either by patents or by copyrighted interfaces, the original 228 | copyright holder who places the Program under this License may add an explicit 229 | geographical distribution limitation excluding those countries, so that 230 | distribution is permitted only in or among countries not thus excluded. In 231 | such case, this License incorporates the limitation as if written in the body 232 | of this License. 233 | 234 | 9. The Free Software Foundation may publish revised and/or new versions of the 235 | General Public License from time to time. Such new versions will be similar in 236 | spirit to the present version, but may differ in detail to address new problems 237 | or concerns. 238 | 239 | Each version is given a distinguishing version number. If the Program 240 | specifies a version number of this License which applies to it and "any later 241 | version", you have the option of following the terms and conditions either of 242 | that version or of any later version published by the Free Software Foundation. 243 | If the Program does not specify a version number of this License, you may 244 | choose any version ever published by the Free Software Foundation. 245 | 246 | 10. If you wish to incorporate parts of the Program into other free programs 247 | whose distribution conditions are different, write to the author to ask for 248 | permission. For software which is copyrighted by the Free Software Foundation, 249 | write to the Free Software Foundation; we sometimes make exceptions for this. 250 | Our decision will be guided by the two goals of preserving the free status of 251 | all derivatives of our free software and of promoting the sharing and reuse of 252 | software generally. 253 | 254 | NO WARRANTY 255 | 256 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR 257 | THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE 258 | STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE 259 | PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 260 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 261 | FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND 262 | PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, 263 | YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 264 | 265 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL 266 | ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE 267 | PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 268 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR 269 | INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA 270 | BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A 271 | FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER 272 | OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 273 | 274 | END OF TERMS AND CONDITIONS 275 | 276 | How to Apply These Terms to Your New Programs 277 | 278 | If you develop a new program, and you want it to be of the greatest possible 279 | use to the public, the best way to achieve this is to make it free software 280 | which everyone can redistribute and change under these terms. 281 | 282 | To do so, attach the following notices to the program. It is safest to attach 283 | them to the start of each source file to most effectively convey the exclusion 284 | of warranty; and each file should have at least the "copyright" line and a 285 | pointer to where the full notice is found. 286 | 287 | One line to give the program's name and a brief idea of what it does. 288 | 289 | Copyright (C) <year> <name of author> 290 | 291 | This program is free software; you can redistribute it and/or modify it 292 | under the terms of the GNU General Public License as published by the Free 293 | Software Foundation; either version 2 of the License, or (at your option) 294 | any later version. 295 | 296 | This program is distributed in the hope that it will be useful, but WITHOUT 297 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 298 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 299 | more details. 300 | 301 | You should have received a copy of the GNU General Public License along 302 | with this program; if not, write to the Free Software Foundation, Inc., 59 303 | Temple Place, Suite 330, Boston, MA 02111-1307 USA 304 | 305 | Also add information on how to contact you by electronic and paper mail. 306 | 307 | If the program is interactive, make it output a short notice like this when it 308 | starts in an interactive mode: 309 | 310 | Gnomovision version 69, Copyright (C) year name of author Gnomovision comes 311 | with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free 312 | software, and you are welcome to redistribute it under certain conditions; 313 | type 'show c' for details. 314 | 315 | The hypothetical commands 'show w' and 'show c' should show the appropriate 316 | parts of the General Public License. Of course, the commands you use may be 317 | called something other than 'show w' and 'show c'; they could even be 318 | mouse-clicks or menu items--whatever suits your program. 319 | 320 | You should also get your employer (if you work as a programmer) or your school, 321 | if any, to sign a "copyright disclaimer" for the program, if necessary. Here 322 | is a sample; alter the names: 323 | 324 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 325 | 'Gnomovision' (which makes passes at compilers) written by James Hacker. 326 | 327 | signature of Ty Coon, 1 April 1989 328 | 329 | Ty Coon, President of Vice 330 | 331 | This General Public License does not permit incorporating your program into 332 | proprietary programs. If your program is a subroutine library, you may 333 | consider it more useful to permit linking proprietary applications with the 334 | library. If this is what you want to do, use the GNU Library General Public 335 | License instead of this License. 336 | 337 | 338 | "CLASSPATH" EXCEPTION TO THE GPL 339 | 340 | Certain source files distributed by Oracle America and/or its affiliates 341 | are subject to the following clarification and special exception to the GPLv2, 342 | based on the GNU Project exception for its Classpath libraries, known as the 343 | GNU Classpath Exception, but only where Oracle has expressly included in the 344 | particular source file's header the words "Oracle designates this particular 345 | file as subject to the "Classpath" exception as provided by Oracle in the 346 | LICENSE file that accompanied this code." 347 | 348 | You should also note that Oracle includes multiple, independent programs in 349 | this software package. Some of those programs are provided under licenses 350 | deemed incompatible with the GPLv2 by the Free Software Foundation and others. 351 | For example, the package includes programs licensed under the Apache License, 352 | Version 2.0. Such programs are licensed to you under their original licenses. 353 | 354 | Oracle facilitates your further distribution of this package by adding the 355 | Classpath Exception to the necessary parts of its GPLv2 code, which permits you 356 | to use that code in combination with other independent modules not licensed 357 | under the GPLv2. However, note that this would not permit you to commingle code 358 | under an incompatible license with Oracle's GPLv2 licensed code by, for 359 | example, cutting and pasting such code into a file also containing Oracle's 360 | GPLv2 licensed code and then distributing the result. 361 | 362 | Additionally, if you were to remove the Classpath Exception from any of the 363 | files to which it applies and distribute the result, you would likely be 364 | required to license some or all of the other code in that distribution under 365 | the GPLv2 as well, and since the GPLv2 is incompatible with the license terms 366 | of some items included in the distribution by Oracle, removing the Classpath 367 | Exception could therefore effectively compromise your ability to further 368 | distribute the package. 369 | 370 | Proceed with caution and we recommend that you obtain the advice of a lawyer 371 | skilled in open source matters before removing the Classpath Exception or 372 | making modifications to this package which may subsequently be redistributed 373 | and/or involve the use of third party software. 374 | 375 | CLASSPATH EXCEPTION 376 | 377 | Linking this library statically or dynamically with other modules is making a 378 | combined work based on this library. Thus, the terms and conditions of the GNU 379 | General Public License version 2 cover the whole combination. 380 | 381 | As a special exception, the copyright holders of this library give you 382 | permission to link this library with independent modules to produce an 383 | executable, regardless of the license terms of these independent modules, and 384 | to copy and distribute the resulting executable under terms of your choice, 385 | provided that you also meet, for each linked independent module, the terms and 386 | conditions of the license of that module. An independent module is a module 387 | which is not derived from or based on this library. If you modify this library, 388 | you may extend this exception to your version of the library, but you are not 389 | obligated to do so. If you do not wish to do so, delete this exception 390 | statement from your version. 391 | 392 | =========================================================================== 393 | 394 | WRITTEN OFFER FOR SOURCE CODE 395 | For any software that you receive from Oracle in binary form which is licensed 396 | under an open source license that gives you the right to receive the source 397 | code for that binary, you can obtain a copy of the applicable source code by 398 | visiting http://www.oracle.com/goto/opensourcecode. If the source code for the 399 | binary was not provided to you with the binary, you can also receive a copy of 400 | the source code on physical media by submitting a written request to the 401 | address listed below or by sending an email to Oracle using the following link: 402 | http://www.oracle.com/goto/opensourcecode/request. 403 | 404 | Oracle America, Inc. 405 | Attn: Senior Vice President 406 | Development and Engineering Legal 407 | 500 Oracle Parkway, 10th Floor 408 | Redwood Shores, CA 94065 409 | 410 | Your request should include: 411 | • The name of the binary for which you are requesting the source code 412 | • The name and version number of the Oracle product containing the binary 413 | • The date you received the Oracle product 414 | • Your name 415 | • Your company name (if applicable) 416 | • Your return mailing address and email, and 417 | • A telephone number in the event we need to reach you. 418 | 419 | We may charge you a fee to cover the cost of physical media and processing. 420 | Your request must be sent 421 | a. within three (3) years of the date you received the Oracle product that 422 | included the binary that is the subject of your request, or 423 | b. in the case of code licensed under the GPL v3 for as long as Oracle 424 | offers spare parts or customer support for that product model. 425 | 426 | =========================================================================== 427 | 428 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mandrel 2 | 3 | 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/). 4 | Mandrel's main goal is to provide a `native-image` release specifically to support [Quarkus](https://quarkus.io). 5 | 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. 6 | Mandrel can best be described as a distribution of a regular OpenJDK with a specially packaged GraalVM Native Image builder (`native-image`). 7 | 8 | ## How Does Mandrel Differ From Graal 9 | 10 | Mandrel releases are built from a code base derived from the upstream GraalVM code base, with only minor changes but some significant exclusions. 11 | 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. 12 | Mandrel is the small subset of that functionality we support for the `native-image` use-case. 13 | 14 | Mandrel's `native-image` also doesn't include the following features: 15 | * The experimental image-build server, i.e., the `--experimental-build-server` option. 16 | * The LLVM backend, i.e., the `-H:CompilerBackend=llvm` option. 17 | * The musl libc implementation, i.e., the `--libc=musl` option. 18 | * Support for generating static native images, i.e., the `--static` option. 19 | * Support for non JVM-based languages and polyglot, i.e., the `--language:<languageId>` option. 20 | 21 | Mandrel is also built slightly differently to GraalVM, using the standard OpenJDK project release of jdk17u. 22 | 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. 23 | Most of these enhancements are to the JVMCI module that allows the Graal compiler to be run inside OpenJDK. 24 | The others are small cosmetic changes to behaviour. 25 | These enhancements may in some cases cause minor differences in the progress of native image generation. 26 | They should not cause the resulting images themselves to execute in a noticeably different manner. 27 | 28 | ## Communication Channels 29 | 30 | * [Slack](https://www.graalvm.org/slack-invitation) - Join `#mandrel` channel at graalvm's slack workspace 31 | * [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) 32 | * [GitHub issues](https://github.com/graalvm/mandrel/issues) for bug reports, questions, or requests for enhancements. 33 | 34 | Please report security vulnerabilities according to the [Reporting Vulnerabilities guide](https://www.oracle.com/corporate/security-practices/assurance/vulnerability/reporting.html). 35 | 36 | ## Getting Started 37 | 38 | Mandrel distributions can be downloaded from [the repository's releases](https://github.com/graalvm/mandrel/releases) 39 | and container images are available at [quay.io](https://quay.io/repository/quarkus/ubi-quarkus-mandrel-builder-image?tag=latest&tab=tags). 40 | 41 | ### Prerequisites 42 | 43 | Mandrel's `native-image` depends on the following packages: 44 | * freetype-devel 45 | * gcc 46 | * glibc-devel 47 | * libstdc++-static 48 | * zlib-devel 49 | 50 | On Fedora/CentOS/RHEL they can be installed with: 51 | ```bash 52 | dnf install glibc-devel zlib-devel gcc freetype-devel libstdc++-static 53 | ``` 54 | 55 | **Note**: The package might be called `glibc-static` or `libstdc++-devel` instead of `libstdc++-static` depending on your system. 56 | If the system is missing stdc++, `gcc-c++` package is needed too. 57 | 58 | On Ubuntu-like systems with: 59 | ```bash 60 | apt install g++ zlib1g-dev libfreetype6-dev 61 | ``` 62 | 63 | ## Building Mandrel From Source 64 | 65 | For building Mandrel from source please see [mandrel-packaging](https://github.com/graalvm/mandrel-packaging) 66 | and consult [Repository Structure in CONTRIBUTING.md](CONTRIBUTING.md#repository-structure) regarding which branch of Mandrel to use. 67 | 68 | # Community 69 | Empowering Software Development with Works on Arm Initiative 70 | ![Works on Arm logo](img/works_on_arm_900x77.png) 71 | [Works on Arm](https://www.arm.com/solutions/infrastructure/works-on-arm) is a strategic initiative to enable and accelerate the 72 | software ecosystem for Arm64. 73 | 74 | [GraalVM's](https://www.graalvm.org/) [Mandrel](https://github.com/graalvm/mandrel) distribution that 75 | powers [Quarkus Native](https://quarkus.io/guides/building-native-image) proudly counts itself among the libraries and 76 | tools that successfully leveraged the resources from Works on Arm. 77 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Reporting Security Vulnerabilities 2 | 3 | The GraalVM team values the independent security research community and believes that responsible disclosure of security vulnerabilities in GraalVM Community Edition as well as GraalVM Enterprise Edition helps us ensure the security and privacy of all our users. 4 | 5 | If you believe you have found a security vulnerability, please submit a report to secalert_us@oracle.com preferably with a proof of concept. Please refer to [Reporting Vulnerabilities](https://www.oracle.com/corporate/security-practices/assurance/vulnerability/reporting.html) for additional information including our public encryption key for secure email. We ask that you do not contact project contributors directly or through other channels about a report. 6 | 7 | ### Security Updates, Alerts and Bulletins 8 | 9 | GraalVM Community Edition security updates will be released on a quarterly basis in conjunction withe GraalVM Enterprise Edition security updates that are part of the Oracle Critical Patch Update program. Security updates are released on the Tuesday closest to the 17th day of January, April, July and October. A pre-release announcement will be published on the Thursday preceding each Critical Patch Update release. For additional information including past advisories, please refer to [Security Alerts](https://www.oracle.com/security-alerts/). 10 | 11 | ### Security-Related Information 12 | 13 | Please refer to the [GraalVM Security Guide](https://www.graalvm.org/docs/security-guide/) for security related topics such as how to support trusted and less trusted code execution using the Truffle language framework, or compiler mitigations for transitive execution attacks. However please note that we do not currently support the execution of untrusted or adversarial code. Non-vulnerability related security issues may be discussed on GitHub Issues or the Security channel in the [GraalVM Slack Workspace](https://graalvm.slack.com/) 14 | 15 | -------------------------------------------------------------------------------- /THIRD_PARTY_LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | LICENSES FOR THIRD-PARTY COMPONENTS 3 | 4 | =============================================================================== 5 | 6 | The following sections contain licensing information for libraries that we have 7 | included with the GraalVM Community Edition source and components used to 8 | test GraalVM Community Edition. We are thankful to all individuals that 9 | have created these. 10 | The following software may be included in this product: 11 | 12 | =============================================================================== 13 | 14 | JSON 20180813 15 | 16 | Copyright (c) 2002 JSON.org 17 | 18 | Permission is hereby granted, free of charge, to any person obtaining a copy of 19 | this software and associated documentation files (the "Software"), to deal in 20 | the Software without restriction, including without limitation the rights to 21 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 22 | the Software, and to permit persons to whom the Software is furnished to do so, 23 | subject to the following conditions: 24 | 25 | The above copyright notice and this permission notice shall be included in all 26 | copies or substantial portions of the Software. 27 | 28 | The Software shall be used for Good, not Evil. 29 | 30 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 31 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 32 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 33 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 34 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 35 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 36 | ================================================================================ 37 | 38 | LibFFI Library 3.2.1 39 | 40 | https://github.com/atgreen/libffi/blob/master/LICENSE 41 | 42 | libffi - Copyright (c) 1996-2014 Anthony Green, Red Hat, Inc and others. 43 | See source files for details. 44 | 45 | Permission is hereby granted, free of charge, to any person obtaining 46 | a copy of this software and associated documentation files (the 47 | ``Software''), to deal in the Software without restriction, including 48 | without limitation the rights to use, copy, modify, merge, publish, 49 | distribute, sublicense, and/or sell copies of the Software, and to 50 | permit persons to whom the Software is furnished to do so, subject to 51 | the following conditions: 52 | 53 | The above copyright notice and this permission notice shall be 54 | included in all copies or substantial portions of the Software. 55 | 56 | THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, 57 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 58 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 59 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 60 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 61 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 62 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 63 | ================================================================================ 64 | 65 | nanohttpd efb2ebf 66 | 67 | Copyright (c) 2012-2013 by Paul S. Hawke, 2001,2005-2013 by Jarno Elonen, 2010 68 | by Konstantinos Togias 69 | All rights reserved. 70 | 71 | Redistribution and use in source and binary forms, with or without modification, 72 | are permitted provided that the following conditions are met: 73 | 74 | * Redistributions of source code must retain the above copyright notice, this 75 | list of conditions and the following disclaimer. 76 | 77 | * Redistributions in binary form must reproduce the above copyright notice, this 78 | list of conditions and the following disclaimer in the documentation and/or 79 | other materials provided with the distribution. 80 | 81 | * Neither the name of the NanoHttpd organization nor the names of its 82 | contributors may be used to endorse or promote products derived from this 83 | software without specific prior written permission. 84 | 85 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 86 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 87 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 88 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 89 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 90 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 91 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 92 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 93 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 94 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 95 | 96 | ================================================================================ 97 | 98 | ANTLR 4.7.2 99 | 100 | Include the following verbatim in the documentation: 101 | 102 | Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. 103 | 104 | Redistribution and use in source and binary forms, with or without 105 | modification, are permitted provided that the following conditions 106 | are met: 107 | 108 | 1. Redistributions of source code must retain the above copyright 109 | notice, this list of conditions and the following disclaimer. 110 | 2. Redistributions in binary form must reproduce the above copyright 111 | notice, this list of conditions and the following disclaimer in the 112 | documentation and/or other materials provided with the distribution. 113 | 3. Neither the name of the copyright holder nor the names of its contributors 114 | may be used to endorse or promote products derived from this software 115 | without specific prior written permission. 116 | 117 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 118 | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 119 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 120 | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 121 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 122 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 123 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 124 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 125 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 126 | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 127 | 128 | ===== 129 | 130 | MIT License for codepointat.js from https://git.io/codepointat 131 | MIT License for fromcodepoint.js from https://git.io/vDW1m 132 | 133 | Copyright Mathias Bynens <https://mathiasbynens.be/> 134 | 135 | Permission is hereby granted, free of charge, to any person obtaining 136 | a copy of this software and associated documentation files (the 137 | "Software"), to deal in the Software without restriction, including 138 | without limitation the rights to use, copy, modify, merge, publish, 139 | distribute, sublicense, and/or sell copies of the Software, and to 140 | permit persons to whom the Software is furnished to do so, subject to 141 | the following conditions: 142 | 143 | The above copyright notice and this permission notice shall be 144 | included in all copies or substantial portions of the Software. 145 | 146 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 147 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 148 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 149 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 150 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 151 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 152 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 153 | 154 | 155 | ********************************* 156 | Modules: 157 | ********************************* 158 | runtime 159 | tool 160 | antlr4-maven-plugin 161 | tool-testsuite 162 | runtime-testsuite/annotations 163 | runtime-testsuite/processors 164 | runtime-testsuite 165 | 166 | 167 | ********************************* 168 | 4P Dependencies: 169 | ********************************* 170 | 171 | com.ibm.icu » icu4j 61.1 172 | https://github.com/unicode-org/icu/tree/release-61-1 173 | COPYRIGHT: © 2016 and later: Unicode, Inc. and others. 174 | LICENSE: MIT 175 | 176 | COPYRIGHT AND PERMISSION NOTICE 177 | 178 | Copyright © 1991-2018 Unicode, Inc. All rights reserved. 179 | Distributed under the Terms of Use in http://www.unicode.org/copyright.html. 180 | 181 | Permission is hereby granted, free of charge, to any person obtaining 182 | a copy of the Unicode data files and any associated documentation 183 | (the "Data Files") or Unicode software and any associated documentation 184 | (the "Software") to deal in the Data Files or Software 185 | without restriction, including without limitation the rights to use, 186 | copy, modify, merge, publish, distribute, and/or sell copies of 187 | the Data Files or Software, and to permit persons to whom the Data Files 188 | or Software are furnished to do so, provided that either 189 | (a) this copyright and permission notice appear with all copies 190 | of the Data Files or Software, or 191 | (b) this copyright and permission notice appear in associated 192 | Documentation. 193 | 194 | THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF 195 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 196 | WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 197 | NONINFRINGEMENT OF THIRD PARTY RIGHTS. 198 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS 199 | NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL 200 | DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 201 | DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 202 | TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 203 | PERFORMANCE OF THE DATA FILES OR SOFTWARE. 204 | 205 | 206 | --- 207 | org.abego.treelayout.core 1.0.3 208 | COPYRIGHT and LICENSE: 209 | BSD 3-Clause License 210 | 211 | Copyright (c) 2011, abego Software GmbH, Germany (http://www.abego.org) 212 | All rights reserved. 213 | 214 | Redistribution and use in source and binary forms, with or without 215 | modification, are permitted provided that the following conditions are met: 216 | 217 | * Redistributions of source code must retain the above copyright notice, this 218 | list of conditions and the following disclaimer. 219 | 220 | * Redistributions in binary form must reproduce the above copyright notice, 221 | this list of conditions and the following disclaimer in the documentation 222 | and/or other materials provided with the distribution. 223 | 224 | * Neither the name of the copyright holder nor the names of its 225 | contributors may be used to endorse or promote products derived from 226 | this software without specific prior written permission. 227 | 228 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 229 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 230 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 231 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 232 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 233 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 234 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 235 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 236 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 237 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 238 | 239 | 240 | --- 241 | antlr-runtime 3.5.2 242 | COPYRIGHT: 243 | Copyright (c) 2003-2008 Terence Parr. All rights reserved. 244 | Copyright (c) 2008, Yahoo! Inc. All rights reserved. 245 | 246 | Code licensed under the BSD License: 247 | http://www.antlr.org/license.html 248 | 249 | [The BSD License] 250 | Copyright (c) 2012 Terence Parr and Sam Harwell 251 | All rights reserved. 252 | 253 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 254 | 255 | Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 256 | Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 257 | Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 258 | 259 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260 | 261 | 262 | --- 263 | org.antlr » ST4 4.1 264 | COPYRIGHT and LICENSE: 265 | 266 | [The "BSD license"] 267 | Copyright (c) 2011-2013 Terence Parr 268 | All rights reserved. 269 | 270 | Redistribution and use in source and binary forms, with or without 271 | modification, are permitted provided that the following conditions 272 | are met: 273 | 274 | 1. Redistributions of source code must retain the above copyright 275 | notice, this list of conditions and the following disclaimer. 276 | 2. Redistributions in binary form must reproduce the above copyright 277 | notice, this list of conditions and the following disclaimer in the 278 | documentation and/or other materials provided with the distribution. 279 | 3. The name of the author may not be used to endorse or promote products 280 | derived from this software without specific prior written permission. 281 | 282 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 283 | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 284 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 285 | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 286 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 287 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 288 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 289 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 290 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 291 | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 292 | 293 | 294 | 295 | ------- 296 | org.apache.maven » maven-plugin-api 3.0.5 297 | org.apache.maven » maven-project 2.2.2 298 | COPYRIGHT: Copyright 2001-2018 The Apache Software Foundation 299 | LICENSE: Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt 300 | 301 | 302 | 303 | --- 304 | org.codehaus.plexus » plexus-compiler-api 2.2 305 | COPYRIGHT: Copyright 2004 The Apache Software Foundation 306 | LICENSE: Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0 307 | 308 | 309 | --- 310 | org.sonatype.plexus » plexus-build-api 0.0.7 311 | COPYRIGHT: http://www.apache.org/licenses/LICENSE-2.0 312 | LICENSE: Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0 313 | 314 | 315 | --- 316 | com.github.olivergondza » maven-jdk-tools-wrapper 0.1 317 | COPYRIGHT and LICENSE: 318 | The MIT License 319 | 320 | Copyright (c) 2016 Red Hat, Inc. 321 | 322 | Permission is hereby granted, free of charge, to any person obtaining a copy 323 | of this software and associated documentation files (the "Software"), to deal 324 | in the Software without restriction, including without limitation the rights 325 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 326 | copies of the Software, and to permit persons to whom the Software is 327 | furnished to do so, subject to the following conditions: 328 | 329 | The above copyright notice and this permission notice shall be included in 330 | all copies or substantial portions of the Software. 331 | 332 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 333 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 334 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 335 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 336 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 337 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 338 | THE SOFTWARE. 339 | 340 | =============================================================================== 341 | 342 | Unicode Data Files 13.0.0 343 | 344 | UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE 345 | 346 | Unicode Data Files ("DATA FILES") include all data files under the directories: 347 | https://www.unicode.org/Public/ 348 | https://www.unicode.org/reports/ 349 | https://www.unicode.org/ivd/data/ 350 | 351 | Unicode Data Files do not include PDF online code charts under the directory: 352 | https://www.unicode.org/Public/ 353 | 354 | Unicode Software ("SOFTWARE") includes any source code published in the Unicode Standard 355 | or any source code or compiled code under the directories: 356 | https://www.unicode.org/Public/PROGRAMS/ 357 | https://www.unicode.org/Public/cldr/ 358 | http://site.icu-project.org/download/ 359 | 360 | NOTICE TO USER: Carefully read the following legal agreement. 361 | BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S 362 | DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), 363 | YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE 364 | TERMS AND CONDITIONS OF THIS AGREEMENT. 365 | IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE 366 | THE DATA FILES OR SOFTWARE. 367 | 368 | COPYRIGHT AND PERMISSION NOTICE 369 | 370 | Copyright © 1991-2020 Unicode, Inc. All rights reserved. 371 | Distributed under the Terms of Use in https://www.unicode.org/copyright.html. 372 | 373 | Permission is hereby granted, free of charge, to any person obtaining 374 | a copy of the Unicode data files and any associated documentation 375 | (the "Data Files") or Unicode software and any associated documentation 376 | (the "Software") to deal in the Data Files or Software 377 | without restriction, including without limitation the rights to use, 378 | copy, modify, merge, publish, distribute, and/or sell copies of 379 | the Data Files or Software, and to permit persons to whom the Data Files 380 | or Software are furnished to do so, provided that either 381 | (a) this copyright and permission notice appear with all copies 382 | of the Data Files or Software, or 383 | (b) this copyright and permission notice appear in associated 384 | Documentation. 385 | 386 | THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF 387 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 388 | WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 389 | NONINFRINGEMENT OF THIRD PARTY RIGHTS. 390 | IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS 391 | NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL 392 | DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 393 | DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 394 | TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 395 | PERFORMANCE OF THE DATA FILES OR SOFTWARE. 396 | 397 | Except as contained in this notice, the name of a copyright holder 398 | shall not be used in advertising or otherwise to promote the sale, 399 | use or other dealings in these Data Files or Software without prior 400 | written authorization of the copyright holder. 401 | 402 | ================================================================================ 403 | 404 | Java-WebSocket 1.5.1 405 | 406 | Copyright (c) 2010-2020 Nathan Rajlich 407 | 408 | Permission is hereby granted, free of charge, to any person 409 | obtaining a copy of this software and associated documentation 410 | files (the "Software"), to deal in the Software without 411 | restriction, including without limitation the rights to use, 412 | copy, modify, merge, publish, distribute, sublicense, and/or sell 413 | copies of the Software, and to permit persons to whom the 414 | Software is furnished to do so, subject to the following 415 | conditions: 416 | 417 | The above copyright notice and this permission notice shall be 418 | included in all copies or substantial portions of the Software. 419 | 420 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 421 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 422 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 423 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 424 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 425 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 426 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 427 | OTHER DEALINGS IN THE SOFTWARE. 428 | ================================================================================ 429 | 430 | Simple Logging Facade for Java (SLF4J) 1.7.30 431 | 432 | org.slf4j:slf4j-parent 433 | -------- Copyrights 434 | Copyright (c) 2004-2017 QOS.ch 435 | * Copyright (c) 2004-2011 QOS.ch 436 | * Copyright (c) 2004-2016 QOS.ch 437 | * Copyright 2001-2004 The Apache Software Foundation. 438 | * Copyright (C) 1999-2006, QOS.ch 439 | * Copyright (c) 2004-2005 QOS.ch 440 | Copyright (c) 2004-2013 QOS.ch 441 | * Copyright (c) 2004-2013 QOS.ch 442 | Copyright (c) 2004-2007 QOS.ch 443 | * Copyright (c) 2004-2013 QOS.ch, Copyright (C) 2015 Google Inc. 444 | * Copyright (c) 2004-2012 QOS.ch 445 | Copyright (c) 2004-2011 QOS.ch 446 | 447 | ======== License 448 | SPDX:MIT 449 | Permission is hereby granted, free of charge, to any person 450 | obtaining a copy of this software and associated documentation files 451 | (the "Software"), to deal in the Software without restriction, including without 452 | limitation the rights to use, copy, modify, merge, publish, distribute, 453 | sublicense, and/or sell copies of the Software, and to permit persons to whom 454 | the Software is furnished to do so, subject to the following conditions: 455 | 456 | The above copyright notice and this permission notice shall be included in all 457 | copies or substantial portions of the Software. 458 | 459 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 460 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 461 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 462 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 463 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 464 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 465 | 466 | ======================= Dependencies Grouped by License ============ 467 | -------- Dependency 468 | com.google.android:android 469 | -------- Copyrights 470 | 471 | -------- Dependency 472 | org.apache.felix:org.apache.felix.framework 473 | -------- Copyrights 474 | 475 | Apache Felix Framework 476 | Copyright 2006-2016 The Apache Software Foundation 477 | 478 | This product includes software developed at 479 | The Apache Software Foundation (http://www.apache.org/). 480 | 481 | 482 | This product includes software developed at 483 | The OSGi Alliance (http://www.osgi.org/). 484 | Copyright (c) OSGi Alliance (2000, 2015). 485 | Licensed under the Apache License 2.0. 486 | 487 | * Copyright (c) OSGi Alliance (2012, 2014). All Rights Reserved. 488 | * Copyright (c) OSGi Alliance (2012, 2013). All Rights Reserved. 489 | * Copyright (c) OSGi Alliance (2010, 2013). All Rights Reserved. 490 | * Copyright (c) OSGi Alliance (2000, 2013). All Rights Reserved. 491 | * Copyright (c) OSGi Alliance (2005, 2013). All Rights Reserved. 492 | * Copyright (c) OSGi Alliance (2000, 2014). All Rights Reserved. 493 | * Copyright (c) OSGi Alliance (2004, 2013). All Rights Reserved. 494 | * Copyright (c) OSGi Alliance (2009, 2013). All Rights Reserved. 495 | * Copyright (c) OSGi Alliance (2007, 2014). All Rights Reserved. 496 | * Copyright (c) OSGi Alliance (2001, 2013). All Rights Reserved. 497 | * Copyright (c) OSGi Alliance (2011, 2013). All Rights Reserved. 498 | * Copyright (c) OSGi Alliance (2004, 2014). All Rights Reserved. 499 | * Copyright (c) OSGi Alliance (2008, 2013). All Rights Reserved. 500 | * Copyright (c) OSGi Alliance (2008, 2014). All Rights Reserved. 501 | * Copyright (c) OSGi Alliance (2010, 2014). All Rights Reserved. 502 | * Copyright (c) OSGi Alliance (2002, 2013). All Rights Reserved. 503 | * Copyright (c) OSGi Alliance (2014). All Rights Reserved. 504 | * Copyright (c) OSGi Alliance (2010, 2012). All Rights Reserved. 505 | * Copyright (c) OSGi Alliance (2007, 2013). All Rights Reserved. 506 | 507 | -------- Dependency 508 | org.apache.felix:org.apache.felix.main 509 | -------- Copyrights 510 | Apache Felix Main 511 | Copyright 2006-2016 The Apache Software Foundation 512 | 513 | This product includes software developed at 514 | The Apache Software Foundation (http://www.apache.org/). 515 | 516 | 517 | This product includes software developed at 518 | The OSGi Alliance (http://www.osgi.org/). 519 | Copyright (c) OSGi Alliance (2000, 2015). 520 | Licensed under the Apache License 2.0. 521 | 522 | -------- Dependency 523 | org.apache.httpcomponents:httpclient 524 | -------- Copyrights 525 | Apache HttpComponents Client - ${project.name} 526 | Copyright 1999-2009 The Apache Software Foundation 527 | 528 | This product includes software developed by 529 | The Apache Software Foundation (http://www.apache.org/). 530 | 531 | This project contains annotations derived from JCIP-ANNOTATIONS 532 | Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net 533 | 534 | Copyright (c) 2005 Brian Goetz and Tim Peierls. 535 | 536 | -------- Dependency 537 | org.apache.httpcomponents:httpcore 538 | -------- Copyrights 539 | HttpCore 540 | Copyright 2005-2009 Apache Software Foundation 541 | 542 | This product includes software developed at 543 | The Apache Software Foundation (http://www.apache.org/). 544 | 545 | -------- Dependency 546 | org.khronos:opengl-api 547 | -------- Copyrights 548 | 549 | -------- Dependency 550 | org.osgi:org.osgi.core 551 | -------- Copyrights 552 | * Copyright (c) OSGi Alliance (2000, 2009). All Rights Reserved. 553 | * Copyright (c) OSGi Alliance (2005, 2008). All Rights Reserved. 554 | * Copyright (c) OSGi Alliance (2000, 2008). All Rights Reserved. 555 | * Copyright (c) OSGi Alliance (2004, 2009). All Rights Reserved. 556 | * Copyright (c) OSGi Alliance (2009). All Rights Reserved. 557 | * Copyright (c) OSGi Alliance (2005, 2009). All Rights Reserved. 558 | * Copyright (c) OSGi Alliance (2007, 2009). All Rights Reserved. 559 | * Copyright (c) OSGi Alliance (2001, 2008). All Rights Reserved. 560 | * Copyright (c) OSGi Alliance (2008, 2009). All Rights Reserved. 561 | * Copyright (c) OSGi Alliance (2001, 2009). All Rights Reserved. 562 | * Copyright (c) OSGi Alliance (2004, 2008). All Rights Reserved. 563 | * Copyright (c) OSGi Alliance (2002, 2009). All Rights Reserved. 564 | * Copyright (c) OSGi Alliance (2002, 2008). All Rights Reserved. 565 | 566 | -------- Dependency 567 | org.osgi:org.osgi.enterprise 568 | -------- Copyrights 569 | * Copyright (c) OSGi Alliance (2009). All Rights Reserved. 570 | * Copyright (c) OSGi Alliance (2009, 2010). All Rights Reserved. 571 | * Copyright (c) OSGi Alliance (2008, 2010). All Rights Reserved. 572 | * Copyright (c) OSGi Alliance (2008, 2009). All Rights Reserved. 573 | * Copyright (c) OSGi Alliance (2001, 2008). All Rights Reserved. 574 | * Copyright (c) OSGi Alliance (2001, 2009). All Rights Reserved. 575 | * Copyright (c) OSGi Alliance (2004, 2009). All Rights Reserved. 576 | * Copyright (c) OSGi Alliance (2004, 2008). All Rights Reserved. 577 | * Copyright (c) OSGi Alliance (2005, 2009). All Rights Reserved. 578 | * Copyright (c) OSGi Alliance (2005, 2008). All Rights Reserved. 579 | * Copyright (c) OSGi Alliance (2000, 2008). All Rights Reserved. 580 | * Copyright (c) OSGi Alliance (2002, 2009). All Rights Reserved. 581 | * Copyright (c) OSGi Alliance (2000, 2010). All Rights Reserved. 582 | * Copyright (c) OSGi Alliance (2007, 2008). All Rights Reserved. 583 | * Copyright (c) OSGi Alliance (2000, 2009). All Rights Reserved. 584 | * Copyright (c) OSGi Alliance (2002, 2008). All Rights Reserved. 585 | 586 | ======== Dependencies Summary 587 | com.google.android:android 588 | org.apache.felix:org.apache.felix.framework 589 | org.apache.felix:org.apache.felix.main 590 | org.apache.httpcomponents:httpclient 591 | org.apache.httpcomponents:httpcore 592 | org.khronos:opengl-api 593 | org.osgi:org.osgi.core 594 | org.osgi:org.osgi.enterprise 595 | 596 | ======== License used by Dependencies 597 | SPDX:Apache-2.0 598 | Apache License 599 | Version 2.0, January 2004 600 | http://www.apache.org/licenses/ 601 | 602 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 603 | 604 | 1. Definitions. 605 | 606 | "License" shall mean the terms and conditions for use, reproduction, 607 | and distribution as defined by Sections 1 through 9 of this document. 608 | 609 | "Licensor" shall mean the copyright owner or entity authorized by 610 | the copyright owner that is granting the License. 611 | 612 | "Legal Entity" shall mean the union of the acting entity and all 613 | other entities that control, are controlled by, or are under common 614 | control with that entity. For the purposes of this definition, 615 | "control" means (i) the power, direct or indirect, to cause the 616 | direction or management of such entity, whether by contract or 617 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 618 | outstanding shares, or (iii) beneficial ownership of such entity. 619 | 620 | "You" (or "Your") shall mean an individual or Legal Entity 621 | exercising permissions granted by this License. 622 | 623 | "Source" form shall mean the preferred form for making modifications, 624 | including but not limited to software source code, documentation 625 | source, and configuration files. 626 | 627 | "Object" form shall mean any form resulting from mechanical 628 | transformation or translation of a Source form, including but 629 | not limited to compiled object code, generated documentation, 630 | and conversions to other media types. 631 | 632 | "Work" shall mean the work of authorship, whether in Source or 633 | Object form, made available under the License, as indicated by a 634 | copyright notice that is included in or attached to the work 635 | (an example is provided in the Appendix below). 636 | 637 | "Derivative Works" shall mean any work, whether in Source or Object 638 | form, that is based on (or derived from) the Work and for which the 639 | editorial revisions, annotations, elaborations, or other modifications 640 | represent, as a whole, an original work of authorship. For the purposes 641 | of this License, Derivative Works shall not include works that remain 642 | separable from, or merely link (or bind by name) to the interfaces of, 643 | the Work and Derivative Works thereof. 644 | 645 | "Contribution" shall mean any work of authorship, including 646 | the original version of the Work and any modifications or additions 647 | to that Work or Derivative Works thereof, that is intentionally 648 | submitted to Licensor for inclusion in the Work by the copyright owner 649 | or by an individual or Legal Entity authorized to submit on behalf of 650 | the copyright owner. For the purposes of this definition, "submitted" 651 | means any form of electronic, verbal, or written communication sent 652 | to the Licensor or its representatives, including but not limited to 653 | communication on electronic mailing lists, source code control systems, 654 | and issue tracking systems that are managed by, or on behalf of, the 655 | Licensor for the purpose of discussing and improving the Work, but 656 | excluding communication that is conspicuously marked or otherwise 657 | designated in writing by the copyright owner as "Not a Contribution." 658 | 659 | "Contributor" shall mean Licensor and any individual or Legal Entity 660 | on behalf of whom a Contribution has been received by Licensor and 661 | subsequently incorporated within the Work. 662 | 663 | 2. Grant of Copyright License. Subject to the terms and conditions of 664 | this License, each Contributor hereby grants to You a perpetual, 665 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 666 | copyright license to reproduce, prepare Derivative Works of, 667 | publicly display, publicly perform, sublicense, and distribute the 668 | Work and such Derivative Works in Source or Object form. 669 | 670 | 3. Grant of Patent License. Subject to the terms and conditions of 671 | this License, each Contributor hereby grants to You a perpetual, 672 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 673 | (except as stated in this section) patent license to make, have made, 674 | use, offer to sell, sell, import, and otherwise transfer the Work, 675 | where such license applies only to those patent claims licensable 676 | by such Contributor that are necessarily infringed by their 677 | Contribution(s) alone or by combination of their Contribution(s) 678 | with the Work to which such Contribution(s) was submitted. If You 679 | institute patent litigation against any entity (including a 680 | cross-claim or counterclaim in a lawsuit) alleging that the Work 681 | or a Contribution incorporated within the Work constitutes direct 682 | or contributory patent infringement, then any patent licenses 683 | granted to You under this License for that Work shall terminate 684 | as of the date such litigation is filed. 685 | 686 | 4. Redistribution. You may reproduce and distribute copies of the 687 | Work or Derivative Works thereof in any medium, with or without 688 | modifications, and in Source or Object form, provided that You 689 | meet the following conditions: 690 | 691 | (a) You must give any other recipients of the Work or 692 | Derivative Works a copy of this License; and 693 | 694 | (b) You must cause any modified files to carry prominent notices 695 | stating that You changed the files; and 696 | 697 | (c) You must retain, in the Source form of any Derivative Works 698 | that You distribute, all copyright, patent, trademark, and 699 | attribution notices from the Source form of the Work, 700 | excluding those notices that do not pertain to any part of 701 | the Derivative Works; and 702 | 703 | (d) If the Work includes a "NOTICE" text file as part of its 704 | distribution, then any Derivative Works that You distribute must 705 | include a readable copy of the attribution notices contained 706 | within such NOTICE file, excluding those notices that do not 707 | pertain to any part of the Derivative Works, in at least one 708 | of the following places: within a NOTICE text file distributed 709 | as part of the Derivative Works; within the Source form or 710 | documentation, if provided along with the Derivative Works; or, 711 | within a display generated by the Derivative Works, if and 712 | wherever such third-party notices normally appear. The contents 713 | of the NOTICE file are for informational purposes only and 714 | do not modify the License. You may add Your own attribution 715 | notices within Derivative Works that You distribute, alongside 716 | or as an addendum to the NOTICE text from the Work, provided 717 | that such additional attribution notices cannot be construed 718 | as modifying the License. 719 | 720 | You may add Your own copyright statement to Your modifications and 721 | may provide additional or different license terms and conditions 722 | for use, reproduction, or distribution of Your modifications, or 723 | for any such Derivative Works as a whole, provided Your use, 724 | reproduction, and distribution of the Work otherwise complies with 725 | the conditions stated in this License. 726 | 727 | 5. Submission of Contributions. Unless You explicitly state otherwise, 728 | any Contribution intentionally submitted for inclusion in the Work 729 | by You to the Licensor shall be under the terms and conditions of 730 | this License, without any additional terms or conditions. 731 | Notwithstanding the above, nothing herein shall supersede or modify 732 | the terms of any separate license agreement you may have executed 733 | with Licensor regarding such Contributions. 734 | 735 | 6. Trademarks. This License does not grant permission to use the trade 736 | names, trademarks, service marks, or product names of the Licensor, 737 | except as required for reasonable and customary use in describing the 738 | origin of the Work and reproducing the content of the NOTICE file. 739 | 740 | 7. Disclaimer of Warranty. Unless required by applicable law or 741 | agreed to in writing, Licensor provides the Work (and each 742 | Contributor provides its Contributions) on an "AS IS" BASIS, 743 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 744 | implied, including, without limitation, any warranties or conditions 745 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 746 | PARTICULAR PURPOSE. You are solely responsible for determining the 747 | appropriateness of using or redistributing the Work and assume any 748 | risks associated with Your exercise of permissions under this License. 749 | 750 | 8. Limitation of Liability. In no event and under no legal theory, 751 | whether in tort (including negligence), contract, or otherwise, 752 | unless required by applicable law (such as deliberate and grossly 753 | negligent acts) or agreed to in writing, shall any Contributor be 754 | liable to You for damages, including any direct, indirect, special, 755 | incidental, or consequential damages of any character arising as a 756 | result of this License or out of the use or inability to use the 757 | Work (including but not limited to damages for loss of goodwill, 758 | work stoppage, computer failure or malfunction, or any and all 759 | other commercial damages or losses), even if such Contributor 760 | has been advised of the possibility of such damages. 761 | 762 | 9. Accepting Warranty or Additional Liability. While redistributing 763 | the Work or Derivative Works thereof, You may choose to offer, 764 | and charge a fee for, acceptance of support, warranty, indemnity, 765 | or other liability obligations and/or rights consistent with this 766 | License. However, in accepting such obligations, You may act only 767 | on Your own behalf and on Your sole responsibility, not on behalf 768 | of any other Contributor, and only if You agree to indemnify, 769 | defend, and hold each Contributor harmless for any liability 770 | incurred by, or claims asserted against, such Contributor by reason 771 | of your accepting any such warranty or additional liability. 772 | 773 | ======================= Dependencies Grouped by License ============ 774 | -------- Dependency 775 | ch.qos.cal10n:cal10n-api 776 | -------- Copyrights 777 | * Copyright (c) 2009 QOS.ch All rights reserved. 778 | * Copyright (c) 2009-2013 QOS.ch All rights reserved. 779 | 780 | ======== Dependencies Summary 781 | ch.qos.cal10n:cal10n-api 782 | 783 | ======== License used by Dependencies 784 | SPDX:MIT 785 | Permission is hereby granted, free of charge, to any person 786 | obtaining a copy of this software and associated documentation files 787 | (the "Software"), to deal in the Software without restriction, including without 788 | limitation the rights to use, copy, modify, merge, publish, distribute, 789 | sublicense, and/or sell copies of the Software, and to permit persons to whom 790 | the Software is furnished to do so, subject to the following conditions: 791 | 792 | The above copyright notice and this permission notice shall be included in all 793 | copies or substantial portions of the Software. 794 | 795 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 796 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 797 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 798 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 799 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 800 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 801 | -------------------------------------------------------------------------------- /img/works_on_arm_900x77.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graalvm/mandrel/4bbb779887e15fbab7dc008b5b433b8e950d80ac/img/works_on_arm_900x77.png --------------------------------------------------------------------------------