diff --git a/.mvn/extensions.xml b/.mvn/extensions.xml
new file mode 100644
index 0000000..4e0774d
--- /dev/null
+++ b/.mvn/extensions.xml
@@ -0,0 +1,7 @@
+<extensions xmlns="http: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/EXTENSIONS/1.0.0 http://maven.apache.org/xsd/core-extensions-1.0.0.xsd">
+ <extension>
+ <groupId>io.jenkins.tools.incrementals</groupId>
+ <artifactId>git-changelist-maven-extension</artifactId>
+ <version>1.8</version>
+ </extension>
+</extensions>
diff --git a/.mvn/maven.config b/.mvn/maven.config
new file mode 100644
index 0000000..2a0299c
--- /dev/null
+++ b/.mvn/maven.config
@@ -0,0 +1,2 @@
+-Pconsume-incrementals
+-Pmight-produce-incrementals
diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000..8d88969
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,4 @@
+buildPlugin(useContainerAgent: true, forkCount: '1C', configurations: [
+ [platform: 'linux', jdk: 21],
+ [platform: 'windows', jdk: 17],
+])
diff --git a/pom.xml b/pom.xml
index 357366f..620d1e8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,21 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
- <version>4.16</version>
+ <version>5.9</version>
<relativePath />
</parent>
<groupId>com.qasymphony.ci.jenkins</groupId>
<artifactId>qtest</artifactId>
- <version>1.4.9-SNAPSHOT</version>
+ <version>${revision}${changelist}</version>
<packaging>hpi</packaging>
<name>Jenkins qTest Plugin</name>
<description>This plugin collects and reports unit test results to qTest.
It supports any testing frameworks which are capable of generating JUnit XML format test reports.
</description>
- <url>https:+ <url>https:
<licenses>
<license>
@@ -29,19 +30,21 @@
</organization>
<properties>
- <findbugs.skip>true</findbugs.skip>
- <jackson.version>2.10.4</jackson.version>
- <junit.plugin.version>1.9</junit.plugin.version>
- <httpclient.version>4.5.12</httpclient.version>
-
- <commons-codec.version>1.15</commons-codec.version>
- <java.level>8</java.level>
+ <revision>1.4.9</revision>
+ <changelist>-SNAPSHOT</changelist>
+ <!-- https:+ <jenkins.baseline>2.479</jenkins.baseline>
+ <jenkins.version>${jenkins.baseline}.1</jenkins.version>
+ <gitHubRepo>jenkinsci/${project.artifactId}-plugin</gitHubRepo>
+ <!-- TODO fix violations -->
+ <spotbugs.skip>true</spotbugs.skip>
</properties>
+
<scm>
- <connection>scm:git:git:- <developerConnection>scm:git:git@github.com:jenkinsci/${project.artifactId}-plugin.git</developerConnection>
- <url>http:- <tag>qtest-1.3.1</tag>
+ <connection>scm:git:https:+ <developerConnection>scm:git:git@github.com:${gitHubRepo}.git</developerConnection>
+ <url>https:+ <tag>${scmTag}</tag>
</scm>
<developers>
@@ -80,14 +83,14 @@
<repositories>
<repository>
<id>repo.jenkins-ci.org</id>
- <url>http:+ <url>https: </repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>repo.jenkins-ci.org</id>
- <url>http:+ <url>https: </pluginRepository>
</pluginRepositories>
@@ -98,131 +101,56 @@
</repository>
</distributionManagement>
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>io.jenkins.tools.bom</groupId>
+ <artifactId>bom-${jenkins.baseline}.x</artifactId>
+ <version>3944.v1a_e4f8b_452db_</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
<dependencies>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>junit</artifactId>
- <version>${junit.plugin.version}</version>
</dependency>
<dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>${jackson.version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- <version>${jackson.version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-annotations</artifactId>
- <version>${jackson.version}</version>
+ <groupId>org.jenkins-ci.plugins</groupId>
+ <artifactId>jackson2-api</artifactId>
</dependency>
<dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>${httpclient.version}</version>
+ <groupId>org.jenkins-ci.plugins</groupId>
+ <artifactId>apache-httpcomponents-client-4-api</artifactId>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
- <version>1.8.5</version>
<scope>test</scope>
- <exclusions>
- <exclusion>
- <groupId>org.hamcrest</groupId>
- <artifactId>hamcrest-core</artifactId>
- </exclusion>
- </exclusions>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>matrix-project</artifactId>
- <version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins.workflow</groupId>
- <artifactId>workflow-job</artifactId>
- <version>1.15</version>
+ <artifactId>workflow-cps</artifactId>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins.workflow</groupId>
- <artifactId>workflow-step-api</artifactId>
- <version>2.23</version>
+ <artifactId>workflow-job</artifactId>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins.workflow</groupId>
- <artifactId>workflow-support</artifactId>
- <version>2.15</version>
+ <artifactId>workflow-step-api</artifactId>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins.workflow</groupId>
- <artifactId>workflow-aggregator</artifactId>
- <version>1.15</version>
- </dependency>
- <dependency>
- <groupId>commons-codec</groupId>
- <artifactId>commons-codec</artifactId>
- <version>${commons-codec.version}</version>
+ <artifactId>workflow-support</artifactId>
</dependency>
</dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <source>1.${java.level}</source>
- <target>1.${java.level}</target>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>findbugs-maven-plugin</artifactId>
- <version>3.0.5</version>
- <configuration>
- <skip>true</skip>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <version>2.1</version>
- <configuration>
- <archive>
- <manifest>
- <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
- </manifest>
- </archive>
- </configuration>
- </plugin>
-
-
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>animal-sniffer-maven-plugin</artifactId>
- <version>1.16</version>
- <configuration>
- <signature>
- <groupId>org.codehaus.mojo.signature</groupId>
- <artifactId>java17</artifactId>
- <version>1.0</version>
- </signature>
- </configuration>
- <executions>
- <execution>
- <id>animal-sniffer</id>
- <phase>verify</phase>
- <goals>
- <goal>check</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
-
- </plugins>
- </build>
-</project>
\ No newline at end of file
+</project>
diff --git a/src/main/java/com/qasymphony/ci/plugin/ConfigService.java b/src/main/java/com/qasymphony/ci/plugin/ConfigService.java
index 05c7795..51b664f 100644
--- a/src/main/java/com/qasymphony/ci/plugin/ConfigService.java
+++ b/src/main/java/com/qasymphony/ci/plugin/ConfigService.java
@@ -14,7 +14,7 @@ import hudson.util.DescribableList;
import jenkins.model.Jenkins;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
-import org.apache.commons.httpclient.HttpStatus;
+import java.net.HttpURLConnection;
import org.apache.commons.lang.StringUtils;
import java.io.IOException;
@@ -124,7 +124,7 @@ public class ConfigService {
String url = String.format("%s/api/v3/projects?assigned=true", qTestUrl);
try {
ResponseEntity responseEntity = HttpClientUtils.get(url, OauthProvider.buildHeaders(qTestUrl, apiKey, null));
- if (HttpStatus.SC_OK != responseEntity.getStatusCode()) {
+ if (HttpURLConnection.HTTP_OK != responseEntity.getStatusCode()) {
return null;
}
return responseEntity.getBody();
@@ -138,7 +138,7 @@ public class ConfigService {
String url = String.format("%s/api/v3/projects/%s", qTestUrl, projectId);
try {
ResponseEntity responseEntity = HttpClientUtils.get(url, OauthProvider.buildHeaders(accessToken, null));
- if (HttpStatus.SC_OK != responseEntity.getStatusCode()) {
+ if (HttpURLConnection.HTTP_OK != responseEntity.getStatusCode()) {
return null;
}
return responseEntity.getBody();
@@ -158,7 +158,7 @@ public class ConfigService {
String url = String.format("%s/api/v3/projects/%s/releases?includeClosed=true", qTestUrl, projectId);
try {
ResponseEntity responseEntity = HttpClientUtils.get(url, OauthProvider.buildHeaders(accessToken, null));
- if (HttpStatus.SC_OK != responseEntity.getStatusCode()) {
+ if (HttpURLConnection.HTTP_OK != responseEntity.getStatusCode()) {
return null;
}
return responseEntity.getBody();
@@ -180,7 +180,7 @@ public class ConfigService {
String url = String.format("%s/api/v3/projects/%s/settings/test-suites/fields?includeInactive=true", qTestUrl, projectId);
try {
ResponseEntity responseEntity = HttpClientUtils.get(url, OauthProvider.buildHeaders(accessToken, null));
- if (HttpStatus.SC_OK != responseEntity.getStatusCode()) {
+ if (HttpURLConnection.HTTP_OK != responseEntity.getStatusCode()) {
return null;
}
JSONArray fields = StringUtils.isEmpty(responseEntity.getBody()) ? null : JSONArray.fromObject(responseEntity.getBody());
@@ -217,13 +217,13 @@ public class ConfigService {
ResponseEntity responseEntity = HttpClientUtils.get(urlByProject, headers);
- if (HttpStatus.SC_OK != responseEntity.getStatusCode()) {
+ if (HttpURLConnection.HTTP_OK != responseEntity.getStatusCode()) {
String urlById = String.format("%s/api/v3/projects/%s/ci/%s", qTestUrl, setting.getProjectId(), setting.getId());
responseEntity = HttpClientUtils.get(urlById, headers);
}
- if (HttpStatus.SC_OK != responseEntity.getStatusCode()) {
+ if (HttpURLConnection.HTTP_OK != responseEntity.getStatusCode()) {
LOG.log(Level.WARNING, String.format("Cannot get config from qTest: %s, %s, error: %s", qTestUrl, setting, responseEntity.getBody()));
return null;
}
@@ -305,7 +305,7 @@ public class ConfigService {
responseEntity = HttpClientUtils.post(url, headers, JsonUtils.toJson(setting));
}
- if (HttpStatus.SC_OK != responseEntity.getStatusCode()) {
+ if (HttpURLConnection.HTTP_OK != responseEntity.getStatusCode()) {
LOG.log(Level.WARNING, String.format("Cannot save config to qTest, statusCode:%s, error:%s",
responseEntity.getStatusCode(), responseEntity.getBody()));
throw new SaveSettingException(ConfigService.getErrorMessage(responseEntity.getBody()), responseEntity.getStatusCode());
@@ -408,7 +408,7 @@ public class ConfigService {
}
try {
ResponseEntity responseEntity = HttpClientUtils.get(url, OauthProvider.buildHeaders(accessToken, null));
- if (HttpStatus.SC_OK != responseEntity.getStatusCode()) {
+ if (HttpURLConnection.HTTP_OK != responseEntity.getStatusCode()) {
return null;
}
return responseEntity.getBody();
@@ -428,7 +428,7 @@ public class ConfigService {
}
try {
ResponseEntity responseEntity = HttpClientUtils.get(url, OauthProvider.buildHeaders(accessToken, null));
- if (HttpStatus.SC_OK != responseEntity.getStatusCode()) {
+ if (HttpURLConnection.HTTP_OK != responseEntity.getStatusCode()) {
return null;
}
return responseEntity.getBody();
@@ -457,7 +457,7 @@ public class ConfigService {
try {
String jsonData = JsonUtils.toJson(json);
ResponseEntity responseEntity = HttpClientUtils.post(url, OauthProvider.buildHeaders(accessToken, null), jsonData);
- if (HttpStatus.SC_OK != responseEntity.getStatusCode()) {
+ if (HttpURLConnection.HTTP_OK != responseEntity.getStatusCode()) {
return null;
}
return responseEntity.getBody();
diff --git a/src/main/java/com/qasymphony/ci/plugin/OauthProvider.java b/src/main/java/com/qasymphony/ci/plugin/OauthProvider.java
index d1db89a..30a8d96 100644
--- a/src/main/java/com/qasymphony/ci/plugin/OauthProvider.java
+++ b/src/main/java/com/qasymphony/ci/plugin/OauthProvider.java
@@ -5,7 +5,7 @@ import com.qasymphony.ci.plugin.exception.OAuthException;
import com.qasymphony.ci.plugin.utils.HttpClientUtils;
import com.qasymphony.ci.plugin.utils.JsonUtils;
import com.qasymphony.ci.plugin.utils.ResponseEntity;
-import org.apache.commons.httpclient.HttpStatus;
+import java.net.HttpURLConnection;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
@@ -45,7 +45,7 @@ public class OauthProvider {
headers.put(Constants.HEADER_AUTH, secretKey);
try {
ResponseEntity entity = HttpClientUtils.post(sb.toString(), headers, null);
- if (HttpStatus.SC_OK != entity.getStatusCode()) {
+ if (HttpURLConnection.HTTP_OK != entity.getStatusCode()) {
throw new OAuthException(entity.getBody(), entity.getStatusCode());
}
JsonNode node = JsonUtils.readTree(entity.getBody());
diff --git a/src/main/java/com/qasymphony/ci/plugin/ValidationFormService.java b/src/main/java/com/qasymphony/ci/plugin/ValidationFormService.java
index 0d00a5d..d1bbe1d 100644
--- a/src/main/java/com/qasymphony/ci/plugin/ValidationFormService.java
+++ b/src/main/java/com/qasymphony/ci/plugin/ValidationFormService.java
@@ -4,7 +4,7 @@ import hudson.model.AbstractProject;
import hudson.util.FormValidation;
import org.apache.commons.lang.StringUtils;
-import javax.servlet.ServletException;
+import jakarta.servlet.ServletException;
import java.io.IOException;
import java.net.URL;
diff --git a/src/main/java/com/qasymphony/ci/plugin/action/PushingResultAction.java b/src/main/java/com/qasymphony/ci/plugin/action/PushingResultAction.java
index 0305848..af2b22f 100644
--- a/src/main/java/com/qasymphony/ci/plugin/action/PushingResultAction.java
+++ b/src/main/java/com/qasymphony/ci/plugin/action/PushingResultAction.java
@@ -33,7 +33,7 @@ import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.*;
import org.kohsuke.stapler.bind.JavaScriptMethod;
-import javax.servlet.ServletException;
+import jakarta.servlet.ServletException;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Collections;
@@ -404,7 +404,7 @@ public class PushingResultAction extends Notifier {
}
@Override
- public Publisher newInstance(StaplerRequest req, JSONObject formData) throws hudson.model.Descriptor.FormException {
+ public Publisher newInstance(StaplerRequest2 req, JSONObject formData) throws hudson.model.Descriptor.FormException {
Configuration configuration = req.bindParameters(Configuration.class, "config.");
configuration.setJenkinsServerUrl(HttpClientUtils.getServerUrl(req));
@@ -532,7 +532,7 @@ public class PushingResultAction extends Notifier {
*/
@JavaScriptMethod
public JSONObject getProjectData(final String qTestUrl, final String apiKey, final Long projectId, final String jenkinsProjectName) {
- final StaplerRequest request = Stapler.getCurrentRequest();
+ final StaplerRequest2 request = Stapler.getCurrentRequest2();
final String jenkinsServerName = HttpClientUtils.getServerUrl(request);
return qTestService.getProjectData(qTestUrl, apiKey, projectId, jenkinsProjectName, jenkinsServerName);
}
diff --git a/src/main/java/com/qasymphony/ci/plugin/action/SubmitJUnitStep.java b/src/main/java/com/qasymphony/ci/plugin/action/SubmitJUnitStep.java
index f21866e..21c5228 100644
--- a/src/main/java/com/qasymphony/ci/plugin/action/SubmitJUnitStep.java
+++ b/src/main/java/com/qasymphony/ci/plugin/action/SubmitJUnitStep.java
@@ -38,7 +38,7 @@ import org.kohsuke.stapler.*;
import org.kohsuke.stapler.bind.JavaScriptMethod;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
-import javax.servlet.ServletException;
+import jakarta.servlet.ServletException;
import java.io.IOException;
import java.io.PrintStream;
import java.util.*;
@@ -88,7 +88,7 @@ public class SubmitJUnitStep extends Step {
@Override
- public Step newInstance(@CheckForNull StaplerRequest req, @Nonnull JSONObject formData) throws FormException {
+ public Step newInstance(@CheckForNull StaplerRequest2 req, @Nonnull JSONObject formData) throws FormException {
Boolean createTestSuiteEveryBuildDate = false;
formData.remove("stapler-class");
formData.remove("$class");
@@ -221,7 +221,7 @@ public class SubmitJUnitStep extends Step {
@JavaScriptMethod
public JSONObject getProjectData(final String qTestUrl, final String apiKey, final Long projectId, final String jenkinsProjectName) {
- final StaplerRequest request = Stapler.getCurrentRequest();
+ final StaplerRequest2 request = Stapler.getCurrentRequest2();
final String jenkinsServerName = HttpClientUtils.getServerUrl(request);
return qTestService.getProjectData(qTestUrl, apiKey, projectId, jenkinsProjectName, jenkinsServerName);
}
diff --git a/src/main/java/com/qasymphony/ci/plugin/submitter/JunitQtestSubmitterImpl.java b/src/main/java/com/qasymphony/ci/plugin/submitter/JunitQtestSubmitterImpl.java
index 9e8e697..096cdee 100644
--- a/src/main/java/com/qasymphony/ci/plugin/submitter/JunitQtestSubmitterImpl.java
+++ b/src/main/java/com/qasymphony/ci/plugin/submitter/JunitQtestSubmitterImpl.java
@@ -16,7 +16,7 @@ import com.qasymphony.ci.plugin.utils.JsonUtils;
import com.qasymphony.ci.plugin.utils.LoggerUtils;
import com.qasymphony.ci.plugin.utils.ResponseEntity;
import hudson.model.Run;
-import org.apache.commons.httpclient.HttpStatus;
+import java.net.HttpURLConnection;
import org.apache.commons.lang.StringUtils;
import java.io.PrintStream;
@@ -42,7 +42,7 @@ public class JunitQtestSubmitterImpl implements JunitSubmitter {
ResponseEntity responseEntity = AutomationTestService.push(request.getBuildNumber(), request.getBuildPath(),
request.getTestResults(), request, accessToken);
AutomationTestResponse response = null;
- if (responseEntity.getStatusCode() == HttpStatus.SC_CREATED) {
+ if (responseEntity.getStatusCode() == HttpURLConnection.HTTP_CREATED) {
SubmittedTask task = JsonUtils.fromJson(responseEntity.getBody(), SubmittedTask.class);
if (task == null || task.getId() <= 0)
@@ -119,7 +119,7 @@ public class JunitQtestSubmitterImpl implements JunitSubmitter {
LOG.info(String.format("project:%s, status:%s, body:%s", request.getJenkinsProjectName(),
null == responseEntity ? -1 : responseEntity.getStatusCode(), null == responseEntity ? "" : responseEntity.getBody()));
- if ((null == responseEntity) || (responseEntity.getStatusCode() != HttpStatus.SC_OK)) {
+ if ((null == responseEntity) || (responseEntity.getStatusCode() != HttpURLConnection.HTTP_OK)) {
throw new SubmittedException(ConfigService.getErrorMessage(responseEntity.getBody()), responseEntity.getStatusCode());
}
return new AutomationTestResponse(responseEntity.getBody());
diff --git a/src/main/java/com/qasymphony/ci/plugin/utils/HttpClientUtils.java b/src/main/java/com/qasymphony/ci/plugin/utils/HttpClientUtils.java
index 19acf97..f606da7 100644
--- a/src/main/java/com/qasymphony/ci/plugin/utils/HttpClientUtils.java
+++ b/src/main/java/com/qasymphony/ci/plugin/utils/HttpClientUtils.java
@@ -24,7 +24,7 @@ import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.protocol.HttpContext;
-import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerRequest2;
import java.net.*;
import java.util.Arrays;
@@ -96,7 +96,7 @@ public class HttpClientUtils {
* @param request request
* @return server url
*/
- public static String getServerUrl(StaplerRequest request) {
+ public static String getServerUrl(StaplerRequest2 request) {
return getServerUrl(request.getServerPort(), request.getScheme(), request.getServerName(), request.getContextPath());
}
francisbolduc The qasymphony team will need to apply a patch like