From 3211d17cf9d24bca9ceccba47c8ae1d3c631e386 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Wed, 15 Nov 2023 13:31:53 +0100 Subject: [PATCH 1/3] Update to Quarkus 3 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1095ad7..260542c 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 2.16.1.Final + 3.5.1 true 3.0.0-M8 @@ -33,7 +33,7 @@ io.quarkiverse.githubaction quarkus-github-action - 1.0.1 + 2.0.2 io.quarkus From 6fe74019ddb0b4792840af3f1e1a1517aff49a70 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Thu, 16 Nov 2023 14:19:30 +0100 Subject: [PATCH 2/3] First iteration of Develocity work --- action.yml | 3 + pom.xml | 361 +++++++++--------- .../develocity/InjectBuildScansAction.java | 277 ++++++++++++++ .../BuildMetadataJsonParsingTest.java | 46 +++ .../resources/develocity/build-metadata.json | 200 ++++++++++ 5 files changed, 714 insertions(+), 173 deletions(-) create mode 100644 src/main/java/io/quarkus/bot/develocity/InjectBuildScansAction.java create mode 100644 src/test/java/io/quarkus/bot/develocity/BuildMetadataJsonParsingTest.java create mode 100644 src/test/resources/develocity/build-metadata.json diff --git a/action.yml b/action.yml index 526836e..9776b3e 100644 --- a/action.yml +++ b/action.yml @@ -4,6 +4,9 @@ inputs: github-token: description: 'GitHub token' required: true + workflow-run-id: + description: 'Workflow run id' + required: false runs: using: "composite" steps: diff --git a/pom.xml b/pom.xml index 260542c..8ceb82b 100644 --- a/pom.xml +++ b/pom.xml @@ -1,180 +1,195 @@ - - 4.0.0 - io.quarkus.bot - action-helpers - 999-SNAPSHOT - Action helpers - GitHub Actions helpers for the Quarkus project - - 3.11.0 - 11 - UTF-8 - UTF-8 - quarkus-bom - io.quarkus.platform - 3.5.1 - true - 3.0.0-M8 - - + 4.0.0 + io.quarkus.bot + action-helpers + 999-SNAPSHOT + Action helpers + GitHub Actions helpers for the Quarkus project + + 3.11.0 + 11 + UTF-8 + UTF-8 + quarkus-bom + io.quarkus.platform + 3.5.1 + true + 3.0.0-M8 + + + + + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} + pom + import + + + - - ${quarkus.platform.group-id} - ${quarkus.platform.artifact-id} - ${quarkus.platform.version} - pom - import - + + io.quarkiverse.githubaction + quarkus-github-action + 2.0.2 + + + io.quarkus + quarkus-arc + + + io.quarkus + quarkus-jackson + + + io.quarkus + quarkus-junit5 + test + + + org.assertj + assertj-core + 3.24.2 + test + - - - - io.quarkiverse.githubaction - quarkus-github-action - 2.0.2 - - - io.quarkus - quarkus-arc - - - io.quarkus - quarkus-junit5 - test - - - - - - ${quarkus.platform.group-id} - quarkus-maven-plugin - ${quarkus.platform.version} - true - - - - build - generate-code - generate-code-tests - - - - - - maven-compiler-plugin - ${compiler-plugin.version} - - - -parameters - - - - - maven-surefire-plugin - ${surefire-plugin.version} - - - org.jboss.logmanager.LogManager - ${maven.home} - - - - - maven-failsafe-plugin - ${surefire-plugin.version} - - - - integration-test - verify - - - - ${project.build.directory}/${project.build.finalName}-runner - org.jboss.logmanager.LogManager - ${maven.home} - - - - - - - - - - native - - - native - - - - false - native - - - - flatten - - - quarkus.package.type - uber-jar - - - + - - org.codehaus.mojo - flatten-maven-plugin - 1.5.0 - - - flatten - process-resources - - flatten - - - - flatten.clean - clean - - clean - - - - - - keep - keep - keep - keep - keep - remove - remove - remove - - - + + ${quarkus.platform.group-id} + quarkus-maven-plugin + ${quarkus.platform.version} + true + + + + build + generate-code + generate-code-tests + + + + + + maven-compiler-plugin + ${compiler-plugin.version} + + + -parameters + + + + + maven-surefire-plugin + ${surefire-plugin.version} + + + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + maven-failsafe-plugin + ${surefire-plugin.version} + + + + integration-test + verify + + + + + ${project.build.directory}/${project.build.finalName}-runner + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + - - - - github-action - - - env.GITHUB_REPOSITORY - - - - - github - GitHub Repository Apache Maven Packages - https://maven.pkg.github.com/${env.GITHUB_REPOSITORY} - - - - + + + + native + + + native + + + + false + native + + + + flatten + + + quarkus.package.type + uber-jar + + + + + + org.codehaus.mojo + flatten-maven-plugin + 1.5.0 + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + + + keep + keep + keep + keep + keep + remove + remove + remove + + + + + + + + github-action + + + env.GITHUB_REPOSITORY + + + + + github + GitHub Repository Apache Maven Packages + https://maven.pkg.github.com/${env.GITHUB_REPOSITORY} + + + + diff --git a/src/main/java/io/quarkus/bot/develocity/InjectBuildScansAction.java b/src/main/java/io/quarkus/bot/develocity/InjectBuildScansAction.java new file mode 100644 index 0000000..8c3521d --- /dev/null +++ b/src/main/java/io/quarkus/bot/develocity/InjectBuildScansAction.java @@ -0,0 +1,277 @@ +package io.quarkus.bot.develocity; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.OptionalLong; +import java.util.TreeSet; +import java.util.stream.Collectors; + +import jakarta.inject.Inject; + +import org.kohsuke.github.GHCheckRun; +import org.kohsuke.github.GHCheckRunBuilder.Output; +import org.kohsuke.github.GHIssueComment; +import org.kohsuke.github.GHPullRequest; +import org.kohsuke.github.GHRepository; +import org.kohsuke.github.GHWorkflowRun; +import org.kohsuke.github.GHWorkflowRun.Conclusion; +import org.kohsuke.github.GitHub; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.quarkiverse.githubaction.Action; +import io.quarkiverse.githubaction.Commands; +import io.quarkiverse.githubaction.Context; +import io.quarkiverse.githubaction.Inputs; + +public class InjectBuildScansAction { + + private static final String BUILD_SUMMARY_CHECK_RUN_PREFIX = "Build summary for "; + private static final String WORKFLOW_RUN_ID_MARKER = ""; + private static final String BUILD_SCANS = "Build scans"; + + @Inject + ObjectMapper objectMapper; + + @Action("inject-build-scans") + void injectBuildScans(Context context, Commands commands, Inputs inputs, GitHub github) { + Path buildMetadataJson = Path.of("build-metadata.json"); + if (!Files.isReadable(buildMetadataJson)) { + commands.warning(buildMetadataJson + " is not readable, ignoring"); + return; + } + + OptionalLong workflowRunIdInput = inputs.getLong("workflow-run-id"); + if (workflowRunIdInput.isEmpty()) { + commands.warning("No workflow run id provided ignoring"); + return; + } + long workflowRunId = workflowRunIdInput.getAsLong(); + + BuildScanStatuses statuses; + try { + statuses = objectMapper.readValue(buildMetadataJson.toFile(), BuildScanStatuses.class); + } catch (IOException e) { + commands.error("Unable to parse " + buildMetadataJson + ": " + e.getMessage()); + return; + } + + Map buildScanMapping = statuses.builds.stream() + .collect(Collectors.toMap(s -> s.jobName, s -> s.buildScanLink)); + + try { + GHRepository repository = github.getRepository(context.getGitHubRepository()); + GHPullRequest pullRequest = repository.getPullRequest(statuses.prNumber); + GHWorkflowRun workflowRun = repository.getWorkflowRun(workflowRunId); + + if (workflowRun.getConclusion() == Conclusion.CANCELLED) { + return; + } + + updateComment(commands, pullRequest, workflowRun, buildScanMapping); + updateCheckRun(commands, repository, workflowRun, buildScanMapping); + createBuildScansOutput(workflowRun, statuses); + } catch (IOException e) { + commands.error("Error trying to attach build scans to pull request #" + statuses.prNumber + ": " + e.getMessage()); + } + } + + private void updateComment(Commands commands, GHPullRequest pullRequest, GHWorkflowRun workflowRun, + Map buildScanMapping) throws IOException { + List commentsSinceWorkflowRunStarted = pullRequest.queryComments() + .since(workflowRun.getCreatedAt()) + .list().toList(); + Collections.reverse(commentsSinceWorkflowRunStarted); + + String workflowRunIdMarker = String.format(WORKFLOW_RUN_ID_MARKER, workflowRun.getId()); + Optional reportCommentCandidate = commentsSinceWorkflowRunStarted.stream() + .filter(c -> c.getBody().contains(workflowRunIdMarker)) + .findFirst(); + + if (reportCommentCandidate.isEmpty()) { + commands.warning("Unable to find a report comment to update"); + return; + } + + GHIssueComment reportComment = reportCommentCandidate.get(); + + String updatedCommentBody = reportComment.getBody().lines().map(line -> { + for (Entry buildScanEntry : buildScanMapping.entrySet()) { + if (line.contains("| " + buildScanEntry.getKey() + " |")) { + return line.replace(":construction:", "[:mag:](" + buildScanEntry.getValue() + ")"); + } + } + return line; + }).collect(Collectors.joining("\n")); + + if (!updatedCommentBody.equals(reportComment.getBody())) { + reportComment.update(updatedCommentBody); + } + } + + private void updateCheckRun(Commands commands, GHRepository repository, GHWorkflowRun workflowRun, + Map buildScanMapping) throws IOException { + + Optional reportCheckRunCandidate = repository.getCheckRuns(workflowRun.getHeadSha()).toList().stream() + .filter(cr -> cr.getOutput() != null) + .filter(cr -> cr.getOutput().getTitle().startsWith(BUILD_SUMMARY_CHECK_RUN_PREFIX)) + .filter(cr -> cr.getOutput().getText() != null && !cr.getOutput().getText().isBlank()) + .findAny(); + + if (reportCheckRunCandidate.isEmpty()) { + commands.warning("Unable to find a check run to update"); + return; + } + + GHCheckRun reportCheckRun = reportCheckRunCandidate.get(); + + Output output = new Output(reportCheckRun.getOutput().getTitle(), reportCheckRun.getOutput().getSummary()); + + String updatedReportText = reportCheckRun.getOutput().getText().lines().map(line -> { + for (Entry buildScanEntry : buildScanMapping.entrySet()) { + if (line.contains("| " + buildScanEntry.getKey() + " |")) { + return line.replace(":construction:", "[:mag:](" + buildScanEntry.getValue() + ")"); + } + } + return line; + }).collect(Collectors.joining("\n")); + + if (!updatedReportText.equals(reportCheckRun.getOutput().getText())) { + reportCheckRun.update().add(output).create(); + } + } + + private void createBuildScansOutput(GHWorkflowRun workflowRun, BuildScanStatuses statuses) throws IOException { + Output output = new Output(BUILD_SCANS, BUILD_SCANS); + + StringBuilder buildScans = new StringBuilder(); + buildScans.append("| Status | Name | Build scan |\n"); + buildScans.append("| :-: | -- | :-: |\n"); + + for (BuildScanStatus build : statuses.builds) { + buildScans.append("| ").append(getConclusionEmoji(build.status)).append(" | ").append(build.jobName) + .append(" | [:mag:](").append(build.buildScanLink).append(") |"); + } + + output.withText(buildScans.toString()); + + workflowRun.getRepository().createCheckRun(BUILD_SCANS, workflowRun.getHeadSha()) + .add(output) + .withConclusion(GHCheckRun.Conclusion.NEUTRAL) + .withCompletedAt(new Date()) + .create(); + } + + private static String getConclusionEmoji(String conclusion) { + // apparently, conclusion can sometimes be null... + if (conclusion == null) { + return ":question:"; + } + + switch (conclusion) { + case "success": + return ":heavy_check_mark:"; + case "failure": + return "✖"; + case "cancelled": + return ":hourglass:"; + case "skipped": + return ":no_entry_sign:"; + default: + return ":question:"; + } + } + + public static class BuildScanStatuses { + + public int prNumber; + + public TreeSet builds; + } + + public static class BuildScanStatus implements Comparable { + + public String jobName; + + public String status; + + public String buildScanLink; + + @Override + public int compareTo(BuildScanStatus o) { + int order1 = getOrder(jobName); + int order2 = getOrder(o.jobName); + + if (order1 == order2) { + return jobName.compareToIgnoreCase(o.jobName); + } + + return order1 - order2; + } + + @Override + public String toString() { + return "BuildScanStatus [jobName=" + jobName + "]"; + } + } + + private static int getOrder(String jobName) { + if (jobName.startsWith("Initial JDK")) { + return 1; + } + if (jobName.startsWith("Calculate Test Jobs")) { + return 2; + } + if (jobName.startsWith("JVM Tests - ")) { + if (jobName.contains("Windows")) { + return 12; + } + return 11; + } + if (jobName.startsWith("Maven Tests - ")) { + if (jobName.contains("Windows")) { + return 22; + } + return 21; + } + if (jobName.startsWith("Gradle Tests - ")) { + if (jobName.contains("Windows")) { + return 32; + } + return 31; + } + if (jobName.startsWith("Devtools Tests - ")) { + if (jobName.contains("Windows")) { + return 42; + } + return 41; + } + if (jobName.startsWith("Kubernetes Tests - ")) { + if (jobName.contains("Windows")) { + return 52; + } + return 51; + } + if (jobName.startsWith("Quickstarts Compilation")) { + return 61; + } + if (jobName.startsWith("MicroProfile TCKs Tests")) { + return 71; + } + if (jobName.startsWith("Native Tests - ")) { + if (jobName.contains("Windows")) { + return 82; + } + return 81; + } + + return 200; + } +} diff --git a/src/test/java/io/quarkus/bot/develocity/BuildMetadataJsonParsingTest.java b/src/test/java/io/quarkus/bot/develocity/BuildMetadataJsonParsingTest.java new file mode 100644 index 0000000..a7950ff --- /dev/null +++ b/src/test/java/io/quarkus/bot/develocity/BuildMetadataJsonParsingTest.java @@ -0,0 +1,46 @@ +package io.quarkus.bot.develocity; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; +import java.util.stream.Collectors; + +import jakarta.inject.Inject; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.core.exc.StreamReadException; +import com.fasterxml.jackson.databind.DatabindException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.quarkus.bot.develocity.InjectBuildScansAction.BuildScanStatuses; +import io.quarkus.test.junit.QuarkusTest; + +@QuarkusTest +public class BuildMetadataJsonParsingTest { + + @Inject + ObjectMapper objectMapper; + + @Test + void testParsing() throws StreamReadException, DatabindException, IOException { + BuildScanStatuses statuses = objectMapper.readValue( + BuildMetadataJsonParsingTest.class.getClassLoader().getResourceAsStream("develocity/build-metadata.json"), + BuildScanStatuses.class); + + assertThat(statuses.builds.stream().map(s -> s.jobName).collect(Collectors.toList())) + .containsExactly("Initial JDK 11 Build", "Maven Tests - JDK 11", "Maven Tests - JDK 11 Windows", + "Gradle Tests - JDK 11", "Gradle Tests - JDK 11 Windows", "Devtools Tests - JDK 11", + "Devtools Tests - JDK 17", "Devtools Tests - JDK 11 Windows", "Kubernetes Tests - JDK 11", + "Kubernetes Tests - JDK 17", "Kubernetes Tests - JDK 11 Windows", "MicroProfile TCKs Tests", + "Native Tests - Amazon", "Native Tests - AWT, ImageIO and Java2D", "Native Tests - Cache", + "Native Tests - Data1", "Native Tests - Data2", "Native Tests - Data3", "Native Tests - Data4", + "Native Tests - Data5", "Native Tests - Data6", "Native Tests - Data7", + "Native Tests - DevTools Integration Tests", "Native Tests - gRPC", "Native Tests - HTTP", + "Native Tests - Main", "Native Tests - Messaging1", "Native Tests - Messaging2", "Native Tests - Misc1", + "Native Tests - Misc2", "Native Tests - Misc3", "Native Tests - Misc4", "Native Tests - Security1", + "Native Tests - Security2", "Native Tests - Security3", "Native Tests - Spring", + "Native Tests - Virtual Thread - Main", "Native Tests - Virtual Thread - Messaging", + "Native Tests - Windows - RESTEasy Jackson"); + } +} diff --git a/src/test/resources/develocity/build-metadata.json b/src/test/resources/develocity/build-metadata.json new file mode 100644 index 0000000..251ca54 --- /dev/null +++ b/src/test/resources/develocity/build-metadata.json @@ -0,0 +1,200 @@ +{ + "prNumber":36961, + "builds":[ + { + "jobName":"MicroProfile TCKs Tests", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/a5blr2wdztpck" + }, + { + "jobName":"Native Tests - gRPC", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/5mjgymi7nf6n4" + }, + { + "jobName":"Native Tests - Data4", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/iszy7kalminy6" + }, + { + "jobName":"Native Tests - DevTools Integration Tests", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/epia7m3odrol2" + }, + { + "jobName":"Maven Tests - JDK 11 Windows", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/t4aczvt2aoyfo" + }, + { + "jobName":"Native Tests - Data5", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/y64rfrck4v5pa" + }, + { + "jobName":"Native Tests - Data1", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/zgac47a7h6kd6" + }, + { + "jobName":"Native Tests - HTTP", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/dxa73uhrty7cm" + }, + { + "jobName":"Native Tests - Main", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/bay5d5zvo4mgs" + }, + { + "jobName":"Kubernetes Tests - JDK 11 Windows", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/5htlvjl3rytqo" + }, + { + "jobName":"Devtools Tests - JDK 11 Windows", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/ccrry6ezrr4o6" + }, + { + "jobName":"Native Tests - Data3", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/rddacfj56h2hy" + }, + { + "jobName":"Native Tests - Cache", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/thlq74uc4xf3w" + }, + { + "jobName":"Native Tests - Misc2", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/bcnfkayxhrezy" + }, + { + "jobName":"Native Tests - Spring", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/5ifwx6sffl4dg" + }, + { + "jobName":"Maven Tests - JDK 11", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/4xfgorxn3nkjw" + }, + { + "jobName":"Gradle Tests - JDK 11 Windows", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/b4eoxjvawoy2y" + }, + { + "jobName":"Native Tests - Security2", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/gtfjqkklttcw2" + }, + { + "jobName":"Native Tests - Virtual Thread - Messaging", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/kjubo3h7soaag" + }, + { + "jobName":"Native Tests - Virtual Thread - Main", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/znqxtapks64qy" + }, + { + "jobName":"Kubernetes Tests - JDK 17", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/io4xaosdj2nic" + }, + { + "jobName":"Kubernetes Tests - JDK 11", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/fwzad3vm6ht7w" + }, + { + "jobName":"Native Tests - Messaging1", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/grz7q3oszn36m" + }, + { + "jobName":"Native Tests - Security3", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/viq6xi76ewbrs" + }, + { + "jobName":"Native Tests - Windows - RESTEasy Jackson", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/j2znyd6rqoy6k" + }, + { + "jobName":"Devtools Tests - JDK 11", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/kxyfbk3udsczk" + }, + { + "jobName":"Native Tests - Data6", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/e3uwwippzac2a" + }, + { + "jobName":"Devtools Tests - JDK 17", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/2vdj2daxhkrqa" + }, + { + "jobName":"Native Tests - Misc3", + "status":"failure", + "buildScanLink":"https://ge.quarkus.io/s/fkfmjvlzhklbi" + }, + { + "jobName":"Native Tests - Misc4", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/wpstm43qwnf5o" + }, + { + "jobName":"Initial JDK 11 Build", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/pwth2kg4ujq2u" + }, + { + "jobName":"Gradle Tests - JDK 11", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/njy5i7v5k5kya" + }, + { + "jobName":"Native Tests - Misc1", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/any7ki66ntnmk" + }, + { + "jobName":"Native Tests - Data2", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/6t53jhahfwgqq" + }, + { + "jobName":"Native Tests - Amazon", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/x44ccg7m7ucym" + }, + { + "jobName":"Native Tests - Messaging2", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/hrb6wurkfpsge" + }, + { + "jobName":"Native Tests - Security1", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/bo5l3yt65txf6" + }, + { + "jobName":"Native Tests - AWT, ImageIO and Java2D", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/imcvtq6r3qosa" + }, + { + "jobName":"Native Tests - Data7", + "status":"success", + "buildScanLink":"https://ge.quarkus.io/s/hvbupylhbl6ri" + } + ] +} \ No newline at end of file From 8bb1dddec4837f526654780fafbd39fa0efe4dd4 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Thu, 16 Nov 2023 14:20:19 +0100 Subject: [PATCH 3/3] Update Maven Surefire plugin to 3.2.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8ceb82b..53c2312 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ io.quarkus.platform 3.5.1 true - 3.0.0-M8 + 3.2.2