This is an automated email from the ASF dual-hosted git repository.

olamy pushed a commit to branch use_json_jenkins_api
in repository https://gitbox.apache.org/repos/asf/maven-dist-tool.git


The following commit(s) were added to refs/heads/use_json_jenkins_api by this 
push:
     new bc2bfb8  real testing
bc2bfb8 is described below

commit bc2bfb8a4bc1237db0f62f3e96590cbf0cdd95c8
Author: Olivier Lamy <[email protected]>
AuthorDate: Sun Mar 15 12:00:05 2026 +1000

    real testing
    
    Signed-off-by: Olivier Lamy <[email protected]>
---
 Jenkinsfile                                        |  4 +-
 pom.xml                                            | 10 +++
 .../org/apache/maven/dist/tools/JsonRetry.java     | 20 +++++
 .../tools/jobs/master/ListMasterJobsReport.java    | 86 ++++++++++------------
 4 files changed, 71 insertions(+), 49 deletions(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index a57cb21..0b29bf8 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -47,7 +47,7 @@ pipeline {
 
         stage('Publish') {
             when {
-                branch 'master'
+                branch 'use_json_jenkins_api'
             }
             steps {
                 publishHTML([allowMissing: false, alwaysLinkToLastBuild: true, 
keepAll: true, reportDir: "${env.WORKSPACE}/target/site", reportFiles: 
'index.html', reportName: 'site', reportTitles: ''])
@@ -56,7 +56,7 @@ pipeline {
 
         stage('Check errors') {
             when {
-                branch 'master'
+                branch 'use_json_jenkins_api'
             }
             steps {
                 withCredentials([string(credentialsId: 'API_TOKEN', variable: 
'API_TOKEN')]) {
diff --git a/pom.xml b/pom.xml
index 985eabd..c3e9108 100644
--- a/pom.xml
+++ b/pom.xml
@@ -164,6 +164,16 @@
       <artifactId>jetty-client</artifactId>
       <version>12.1.7</version>
     </dependency>
+    <dependency>
+      <groupId>io.projectreactor</groupId>
+      <artifactId>reactor-core</artifactId>
+      <version>3.7.3</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-reactive-httpclient</artifactId>
+      <version>4.1.4</version>
+    </dependency>
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-core</artifactId>
diff --git a/src/main/java/org/apache/maven/dist/tools/JsonRetry.java 
b/src/main/java/org/apache/maven/dist/tools/JsonRetry.java
index 9f7abae..35a07b8 100644
--- a/src/main/java/org/apache/maven/dist/tools/JsonRetry.java
+++ b/src/main/java/org/apache/maven/dist/tools/JsonRetry.java
@@ -23,6 +23,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.commons.lang3.StringUtils;
 import org.eclipse.jetty.client.HttpClient;
 import org.eclipse.jetty.client.Request;
+import org.eclipse.jetty.reactive.client.ReactiveRequest;
+import org.eclipse.jetty.reactive.client.ReactiveResponse;
+import reactor.core.publisher.Mono;
 
 public class JsonRetry {
 
@@ -55,4 +58,21 @@ public class JsonRetry {
         String json = request.send().getContentAsString();
         return json != null ? OBJECT_MAPPER.readTree(json) : null;
     }
+
+    public static Mono<JsonNode> getAsync(String url) {
+        Request request = getInstance().httpClient.newRequest(url);
+        String apiToken = System.getenv("API_TOKEN");
+        if (StringUtils.isNotBlank(apiToken)) {
+            request.headers(httpFields -> httpFields.add("Authorization", 
"Basic " + apiToken));
+        }
+        ReactiveRequest reactiveRequest = 
ReactiveRequest.newBuilder(request).build();
+        return 
Mono.from(reactiveRequest.response(ReactiveResponse.Content.asString()))
+                .flatMap(json -> {
+                    try {
+                        return Mono.justOrEmpty(OBJECT_MAPPER.readTree(json));
+                    } catch (Exception e) {
+                        return Mono.error(e);
+                    }
+                });
+    }
 }
diff --git 
a/src/main/java/org/apache/maven/dist/tools/jobs/master/ListMasterJobsReport.java
 
b/src/main/java/org/apache/maven/dist/tools/jobs/master/ListMasterJobsReport.java
index bd62f19..9c6666e 100644
--- 
a/src/main/java/org/apache/maven/dist/tools/jobs/master/ListMasterJobsReport.java
+++ 
b/src/main/java/org/apache/maven/dist/tools/jobs/master/ListMasterJobsReport.java
@@ -20,7 +20,6 @@ package org.apache.maven.dist.tools.jobs.master;
 
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
@@ -36,6 +35,8 @@ import org.apache.maven.dist.tools.jobs.AbstractJobsReport;
 import org.apache.maven.doxia.sink.Sink;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.reporting.MavenReportException;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
 
 /**
  * Generate report with build status of the Jenkins job for the master branch 
of every Git repository in
@@ -75,56 +76,47 @@ public class ListMasterJobsReport extends 
AbstractJobsReport {
     protected void executeReport(Locale locale) throws MavenReportException {
         Collection<String> repositoryNames = repositoryNames();
 
-        List<Result> repoStatus = new ArrayList<>(repositoryNames.size());
-
-        for (String repository : repositoryNames) {
-            final String repositoryJobUrl = MAVENBOX_JOBS_BASE_URL + 
repository;
-
-            try {
-
-                JsonNode jsonNode = JsonRetry.get(
-                        repositoryJobUrl + 
"/api/json?tree=jobs[name,url,color,lastBuild[result,number]]");
-                if (jsonNode == null) {
-                    getLog().warn("Failed to read JSON for " + repository + " 
Jenkins job " + repositoryJobUrl);
-                    continue;
-                }
-
-                // find the master node
-                if (jsonNode instanceof ObjectNode objectNode) {
-                    objectNode
-                            .get("jobs")
-                            .valueStream()
-                            .filter(jsonNode1 -> 
jsonNode1.get("name").asText().equals("master"))
-                            .findFirst()
-                            .ifPresent(jsonNode1 -> {
-                                JsonNode lastBuild = 
jsonNode1.get("lastBuild");
-                                String status = "UNKNOWN";
-                                if (lastBuild != null) {
-                                    status = lastBuild.get("result").asText();
-                                }
-
-                                String buildUrl = jsonNode1.get("url").asText()
-                                        + jsonNode1
-                                                .get("lastBuild")
-                                                .get("number")
-                                                .asText();
-                                Result result = new Result(repository, 
buildUrl);
-                                result.setStatus(status);
-                                // 
https://ci-maven.apache.org/static/67d6365a/images/24x24/blue.png
-                                
result.setIcon("https://ci-maven.apache.org/static/48x48/";
-                                        + 
jsonNode1.get("color").asText().toLowerCase() + ".png");
-                                repoStatus.add(result);
-                            });
-                }
-
-            } catch (Exception e) {
-                getLog().warn("Failed to read status for " + repository + " 
Jenkins job " + repositoryJobUrl);
-            }
-        }
+        List<Result> repoStatus = Flux.fromIterable(repositoryNames)
+                .flatMap(repo -> JsonRetry.getAsync(MAVENBOX_JOBS_BASE_URL + 
repo
+                                + 
"/api/json?tree=jobs[name,url,color,lastBuild[result,number]]")
+                        .flatMap(jsonNode -> buildResult(repo, jsonNode))
+                        .onErrorResume(e -> {
+                            getLog().warn("Failed to read status for " + repo 
+ " Jenkins job " + MAVENBOX_JOBS_BASE_URL
+                                    + repo);
+                            return Mono.empty();
+                        }))
+                .collectList()
+                .block();
 
         generateReport(repoStatus);
     }
 
+    private Mono<Result> buildResult(String repository, JsonNode jsonNode) {
+        if (!(jsonNode instanceof ObjectNode objectNode)) {
+            getLog().warn("Failed to read JSON for " + repository + " Jenkins 
job " + MAVENBOX_JOBS_BASE_URL
+                    + repository);
+            return Mono.empty();
+        }
+        // find the master node
+        return Mono.justOrEmpty(objectNode
+                .get("jobs")
+                .valueStream()
+                .filter(n -> n.get("name").asText().equals("master"))
+                .findFirst()
+                .map(n -> {
+                    JsonNode lastBuild = n.get("lastBuild");
+                    String status = lastBuild != null ? 
lastBuild.get("result").asText() : "UNKNOWN";
+                    String buildUrl = n.get("url").asText()
+                            + n.get("lastBuild").get("number").asText();
+                    Result result = new Result(repository, buildUrl);
+                    result.setStatus(status);
+                    // 
https://ci-maven.apache.org/static/67d6365a/images/24x24/blue.png
+                    result.setIcon("https://ci-maven.apache.org/static/48x48/";
+                            + n.get("color").asText().toLowerCase() + ".png");
+                    return result;
+                }));
+    }
+
     private void generateReport(List<Result> repoStatus) {
         Sink sink = getSink();
 

Reply via email to