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();