From 3d7eb3e51835bad5aa6d48405923d0cf53b7a869 Mon Sep 17 00:00:00 2001 From: strangelookingnerd <49242855+strangelookingnerd@users.noreply.github.com> Date: Tue, 14 Jan 2025 09:28:42 +0100 Subject: [PATCH 01/23] Use `jenkins.baseline` to reduce bom update mistakes (#824) --- pom.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e3e846e34..8678d4768 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,9 @@ 999999-SNAPSHOT jenkinsci/${project.artifactId}-plugin 2.2.0 - 2.440.3 + + 2.440 + ${jenkins.baseline}.3 true false @@ -42,7 +44,7 @@ io.jenkins.tools.bom - bom-2.440.x + bom-${jenkins.baseline}.x 3234.v5ca_5154341ef pom import From 088b5f22c7680d6e4d29ce39542d32f9c2b2998f Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue, 14 Jan 2025 09:12:11 +0000 Subject: [PATCH 02/23] Update BOM, update to Jakarta (#823) * Init * Update pom.xml --------- Co-authored-by: Adrien Lecharpentier --- pom.xml | 8 ++++---- .../FillErrorResponse.java | 10 ++++------ .../GitHubConfiguration.java | 4 ++-- .../github_branch_source/GitHubSCMSource.java | 2 +- .../github_branch_source/EndpointTest.java | 20 +++++++++---------- .../GitHubSCMBuilderTest.java | 3 ++- .../GitHubSCMNavigatorTest.java | 13 ++++++++++-- 7 files changed, 34 insertions(+), 26 deletions(-) diff --git a/pom.xml b/pom.xml index 8678d4768..f68d7ed06 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jenkins-ci.plugins plugin - 4.88 + 5.5 @@ -34,8 +34,8 @@ jenkinsci/${project.artifactId}-plugin 2.2.0 - 2.440 - ${jenkins.baseline}.3 + 2.479 + ${jenkins.baseline}.1 true false @@ -45,7 +45,7 @@ io.jenkins.tools.bom bom-${jenkins.baseline}.x - 3234.v5ca_5154341ef + 3893.v213a_42768d35 pom import diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/FillErrorResponse.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/FillErrorResponse.java index c2513a629..3d030fbf6 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/FillErrorResponse.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/FillErrorResponse.java @@ -1,13 +1,12 @@ package org.jenkinsci.plugins.github_branch_source; import hudson.Util; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletResponse; import jenkins.model.Jenkins; import org.kohsuke.stapler.HttpResponse; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.StaplerRequest2; +import org.kohsuke.stapler.StaplerResponse2; // TODO replace with corresponding core functionality once Jenkins core has JENKINS-42443 class FillErrorResponse extends IOException implements HttpResponse { @@ -20,8 +19,7 @@ public FillErrorResponse(String message, boolean clearList) { } @Override - public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) - throws IOException, ServletException { + public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException { rsp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); rsp.setContentType("text/html;charset=UTF-8"); rsp.setHeader("X-Jenkins-Select-Error", clearList ? "clear" : "retain"); diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubConfiguration.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubConfiguration.java index 5360b3d8e..54bd14fda 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubConfiguration.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubConfiguration.java @@ -42,7 +42,7 @@ import jenkins.model.Jenkins; import net.sf.json.JSONObject; import org.apache.commons.lang.StringUtils; -import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerRequest2; @Extension public class GitHubConfiguration extends GlobalConfiguration { @@ -60,7 +60,7 @@ public GitHubConfiguration() { } @Override - public boolean configure(StaplerRequest req, JSONObject json) throws FormException { + public boolean configure(StaplerRequest2 req, JSONObject json) throws FormException { req.bindJSON(this, json); return true; } diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java index 857ed773a..0a5570f69 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java @@ -58,6 +58,7 @@ import hudson.util.FormValidation; import hudson.util.ListBoxModel; import hudson.util.LogTaskListener; +import jakarta.servlet.http.HttpServletResponse; import java.io.Closeable; import java.io.FileNotFoundException; import java.io.IOException; @@ -85,7 +86,6 @@ import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.http.HttpServletResponse; import jenkins.model.Jenkins; import jenkins.plugins.git.AbstractGitSCMSource; import jenkins.plugins.git.GitTagSCMRevision; diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/EndpointTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/EndpointTest.java index b470e6fc3..9693adbfb 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/EndpointTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/EndpointTest.java @@ -10,13 +10,13 @@ import hudson.Util; import hudson.model.UnprotectedRootAction; import hudson.security.csrf.CrumbExclusion; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URL; import java.util.Arrays; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import jenkins.model.Jenkins; import org.htmlunit.FailingHttpStatusCodeException; import org.htmlunit.HttpMethod; @@ -31,8 +31,8 @@ import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockAuthorizationStrategy; import org.jvnet.hudson.test.TestExtension; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.StaplerRequest2; +import org.kohsuke.stapler.StaplerResponse2; import org.xml.sax.SAXException; public class EndpointTest { @@ -103,7 +103,7 @@ private String appendCrumb(String url) { } private String getCrumb() { - return Functions.getCrumbRequestField() + "=" + Functions.getCrumb(null); + return Functions.getCrumbRequestField() + "=" + Functions.getCrumb((StaplerRequest2) null); } private Page post(String relative, String userName) throws Exception { @@ -116,8 +116,8 @@ private Page post(String relative, String userName) throws Exception { final WebRequest request = new WebRequest(new URL(client.getContextPath() + relative), HttpMethod.POST); request.setAdditionalHeader("Accept", client.getBrowserVersion().getHtmlAcceptHeader()); - request.setRequestParameters( - Arrays.asList(new NameValuePair(Functions.getCrumbRequestField(), Functions.getCrumb(null)))); + request.setRequestParameters(Arrays.asList( + new NameValuePair(Functions.getCrumbRequestField(), Functions.getCrumb((StaplerRequest2) null)))); return client.getPage(request); } @@ -141,7 +141,7 @@ public String getUrlName() { return "testroot"; } - public void doIndex(StaplerRequest request, StaplerResponse response) throws IOException { + public void doIndex(StaplerRequest2 request, StaplerResponse2 response) throws IOException { visited = true; response.getWriter().println("OK"); } diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMBuilderTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMBuilderTest.java index 1f1ef4d95..1b39e0f4c 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMBuilderTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMBuilderTest.java @@ -20,6 +20,7 @@ import com.cloudbees.plugins.credentials.SystemCredentialsProvider; import com.cloudbees.plugins.credentials.domains.Domain; import com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl; +import hudson.model.Descriptor; import hudson.plugins.git.GitSCM; import hudson.plugins.git.Revision; import hudson.plugins.git.UserRemoteConfig; @@ -82,7 +83,7 @@ public void createGitHubSCMSourceForTest(boolean configuredByUrl, String repoUrl } @Before - public void setUp() throws IOException { + public void setUp() throws IOException, Descriptor.FormException { owner = j.createProject(WorkflowMultiBranchProject.class); Credentials userPasswordCredential = new UsernamePasswordCredentialsImpl( CredentialsScope.GLOBAL, "user-pass", null, "git-user", "git-secret"); diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigatorTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigatorTest.java index 4a501b6a0..df9057d09 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigatorTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigatorTest.java @@ -37,6 +37,7 @@ import com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl; import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; +import hudson.model.Descriptor; import hudson.model.Item; import hudson.model.TaskListener; import hudson.model.User; @@ -75,8 +76,16 @@ public class GitHubSCMNavigatorTest extends AbstractGitHubWireMockTest { @Mock private SCMSourceOwner scmSourceOwner; - private BaseStandardCredentials credentials = new UsernamePasswordCredentialsImpl( - CredentialsScope.GLOBAL, "authenticated-user", null, "git-user", "git-secret"); + private BaseStandardCredentials credentials; + + { + try { + credentials = new UsernamePasswordCredentialsImpl( + CredentialsScope.GLOBAL, "authenticated-user", null, "git-user", "git-secret"); + } catch (Descriptor.FormException e) { + throw new RuntimeException(e); + } + } private GitHubSCMNavigator navigator; From 913311241fa98eccdf243999b4e1270ae81adb29 Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Mon, 20 Jan 2025 01:26:09 -0800 Subject: [PATCH 03/23] Migrate from EE 8 to EE 9 (#825) --- .../plugins/github_branch_source/GitHubOrgMetadataAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubOrgMetadataAction.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubOrgMetadataAction.java index 37c170ecf..c2c88d89e 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubOrgMetadataAction.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubOrgMetadataAction.java @@ -76,7 +76,7 @@ public String getAvatarImageOf(String size) { String image = avatarIconClassNameImageOf(getAvatarIconClassName(), size); return image != null ? image - : (Stapler.getCurrentRequest().getContextPath() + : (Stapler.getCurrentRequest2().getContextPath() + Hudson.RESOURCE_PATH + "/plugin/github-branch-source/images/" + "/github-logo.svg"); From 611ea6a2da04f05c5589fb19d4b4ddc58e59328f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Mar 2025 17:10:57 -0700 Subject: [PATCH 04/23] Bump org.jenkins-ci.plugins:plugin from 5.5 to 5.9 (#837) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- .../plugins/github_branch_source/ApiRateLimitChecker.java | 2 -- .../plugins/github_branch_source/GitHubAppCredentials.java | 1 - .../plugins/github_branch_source/GitHubSCMBuilder.java | 2 -- .../plugins/github_branch_source/PullRequestSCMRevision.java | 2 +- 5 files changed, 2 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index f68d7ed06..849ed6654 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jenkins-ci.plugins plugin - 5.5 + 5.9 diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/ApiRateLimitChecker.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/ApiRateLimitChecker.java index 57ce199ad..93c0c8de0 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/ApiRateLimitChecker.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/ApiRateLimitChecker.java @@ -1,7 +1,6 @@ package org.jenkinsci.plugins.github_branch_source; import edu.umd.cs.findbugs.annotations.NonNull; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Util; import hudson.model.TaskListener; import hudson.util.LogTaskListener; @@ -18,7 +17,6 @@ import org.kohsuke.github.GitHub; import org.kohsuke.github.RateLimitChecker; -@SuppressFBWarnings("DMI_RANDOM_USED_ONLY_ONCE") // https://github.com/spotbugs/spotbugs/issues/1539 public enum ApiRateLimitChecker { /** Attempt to evenly distribute GitHub API requests. */ diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubAppCredentials.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubAppCredentials.java index 0c2927aa2..d210a2911 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubAppCredentials.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubAppCredentials.java @@ -82,7 +82,6 @@ public class GitHubAppCredentials extends BaseStandardCredentials implements Sta private String apiUri; - @SuppressFBWarnings(value = "IS2_INCONSISTENT_SYNC", justification = "#withOwner locking only for #byOwner") private String owner; private transient AppInstallationToken cachedToken; diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMBuilder.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMBuilder.java index 44bd2ee37..b677f0aeb 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMBuilder.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMBuilder.java @@ -32,7 +32,6 @@ import com.cloudbees.plugins.credentials.domains.URIRequirementBuilder; import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.NonNull; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.Item; import hudson.model.Queue; import hudson.plugins.git.GitSCM; @@ -59,7 +58,6 @@ * * @since 2.2.0 */ -@SuppressFBWarnings("DMI_RANDOM_USED_ONLY_ONCE") // https://github.com/spotbugs/spotbugs/issues/1539 public class GitHubSCMBuilder extends GitSCMBuilder { private static final Random ENTROPY = new Random(); diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/PullRequestSCMRevision.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/PullRequestSCMRevision.java index 9931447a9..9c3cddfea 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/PullRequestSCMRevision.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/PullRequestSCMRevision.java @@ -58,7 +58,7 @@ public PullRequestSCMRevision( this.mergeHash = mergeHash; } - @SuppressFBWarnings({"SE_PRIVATE_READ_RESOLVE_NOT_INHERITED", "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE"}) + @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE") private Object readResolve() { if (getTarget() == null) { // fix an instance prior to the type migration, thankfully we have all the required info From d3867245f290b37bc905160beb880eca18481210 Mon Sep 17 00:00:00 2001 From: Allan Burdajewicz Date: Mon, 24 Mar 2025 17:57:16 +1000 Subject: [PATCH 05/23] [JENKINS-75471] Add test to reproduce exception in SCMSource observer --- .../GitHubSCMNavigatorTest.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigatorTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigatorTest.java index df9057d09..f2b8d395a 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigatorTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigatorTest.java @@ -47,6 +47,7 @@ import hudson.security.SecurityRealm; import hudson.util.ListBoxModel; import hudson.util.LogTaskListener; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -460,6 +461,42 @@ public void appliesFilters() throws Exception { assertEquals(projectNames, Collections.singleton("yolo")); } + @Test + public void fetchBadRepo() throws Exception { + final Set projectNames = new HashSet<>(); + final SCMSourceObserver observer = new SCMSourceObserver() { + @NonNull + @Override + public SCMSourceOwner getContext() { + return scmSourceOwner; + } + + @NonNull + @Override + public TaskListener getListener() { + return new LogTaskListener(Logger.getAnonymousLogger(), Level.INFO); + } + + @NonNull + @Override + public ProjectObserver observe(@NonNull String projectName) throws IllegalArgumentException, IOException { + if ("basic".equalsIgnoreCase(projectName)) { + throw new IOException("Failed to get repo basic"); + } + projectNames.add(projectName); + return new NoOpProjectObserver(); + } + + @Override + public void addAttribute(@NonNull String key, @Nullable Object value) + throws IllegalArgumentException, ClassCastException {} + }; + + navigator.visitSources(SCMSourceObserver.filter(observer, "basic", "yolo")); + + assertThat(projectNames, containsInAnyOrder("yolo")); + } + @Test public void fetchActions() throws Exception { assertThat( From 5e36d7cb6e4c6c54588e29d960fa6844bdbf9785 Mon Sep 17 00:00:00 2001 From: Allan Burdajewicz Date: Tue, 25 Mar 2025 15:01:21 +1000 Subject: [PATCH 06/23] [JENKINS-75471] Add test to reproduce exception in SCMSource observer --- .../GitHubSCMNavigator.java | 179 ++++++++++-------- 1 file changed, 101 insertions(+), 78 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java index 6dc522c57..bac837f40 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java @@ -39,6 +39,7 @@ import hudson.AbortException; import hudson.Extension; import hudson.ExtensionList; +import hudson.Functions; import hudson.RestrictedSince; import hudson.Util; import hudson.console.HyperlinkNote; @@ -1034,50 +1035,60 @@ public void visitSources(SCMSourceObserver observer) throws IOException, Interru continue; // ignore repos in other orgs when using GHMyself } - if (repo.isArchived() && gitHubSCMNavigatorContext.isExcludeArchivedRepositories()) { - witness.record(repo.getName(), false); - listener.getLogger() - .println(GitHubConsoleNote.create( - System.currentTimeMillis(), - String.format( - "Skipping repository %s because it is archived", - repo.getName()))); - - } else if (!topicMatches(gitHubSCMNavigatorContext, repo, listener.getLogger())) { - // exclude repositories which are missing one or more of the specified topics - witness.record(repo.getName(), false); - } else if (!repo.isPrivate() && gitHubSCMNavigatorContext.isExcludePublicRepositories()) { - witness.record(repo.getName(), false); - listener.getLogger() - .println(GitHubConsoleNote.create( - System.currentTimeMillis(), - String.format( - "Skipping repository %s because it is public", - repo.getName()))); - } else if (repo.isPrivate() && gitHubSCMNavigatorContext.isExcludePrivateRepositories()) { - witness.record(repo.getName(), false); - listener.getLogger() - .println(GitHubConsoleNote.create( - System.currentTimeMillis(), - String.format( - "Skipping repository %s because it is private", - repo.getName()))); - } else if (gitHubSCMNavigatorContext.isExcludeForkedRepositories() - && repo.getSource() != null) { - witness.record(repo.getName(), false); + try { + if (repo.isArchived() && gitHubSCMNavigatorContext.isExcludeArchivedRepositories()) { + witness.record(repo.getName(), false); + listener.getLogger() + .println(GitHubConsoleNote.create( + System.currentTimeMillis(), + String.format( + "Skipping repository %s because it is archived", + repo.getName()))); + + } else if (!topicMatches(gitHubSCMNavigatorContext, repo, listener.getLogger())) { + // exclude repositories which are missing one or more of the specified topics + witness.record(repo.getName(), false); + } else if (!repo.isPrivate() + && gitHubSCMNavigatorContext.isExcludePublicRepositories()) { + witness.record(repo.getName(), false); + listener.getLogger() + .println(GitHubConsoleNote.create( + System.currentTimeMillis(), + String.format( + "Skipping repository %s because it is public", + repo.getName()))); + } else if (repo.isPrivate() + && gitHubSCMNavigatorContext.isExcludePrivateRepositories()) { + witness.record(repo.getName(), false); + listener.getLogger() + .println(GitHubConsoleNote.create( + System.currentTimeMillis(), + String.format( + "Skipping repository %s because it is private", + repo.getName()))); + } else if (gitHubSCMNavigatorContext.isExcludeForkedRepositories() + && repo.getSource() != null) { + witness.record(repo.getName(), false); + listener.getLogger() + .println(GitHubConsoleNote.create( + System.currentTimeMillis(), + String.format( + "Skipping repository %s because it is a fork", + repo.getName()))); + } else if (request.process(repo.getName(), sourceFactory, null, witness)) { + listener.getLogger() + .println(GitHubConsoleNote.create( + System.currentTimeMillis(), + String.format( + "%d repositories were processed (query completed)", + witness.getCount()))); + } + } catch (Exception e) { listener.getLogger() .println(GitHubConsoleNote.create( System.currentTimeMillis(), - String.format( - "Skipping repository %s because it is a fork", - repo.getName()))); - } else if (request.process(repo.getName(), sourceFactory, null, witness)) { - listener.getLogger() - .println(GitHubConsoleNote.create( - System.currentTimeMillis(), - String.format( - "%d repositories were processed (query completed)", - witness.getCount()))); + String.format("Error while processing repository %s", repo.getName()))); + Functions.printStackTrace(e, listener.getLogger()); } } listener.getLogger() @@ -1117,48 +1128,60 @@ public void visitSources(SCMSourceObserver observer) throws IOException, Interru repositories = org.listRepositories(100); } for (GHRepository repo : repositories) { - if (repo.isArchived() && gitHubSCMNavigatorContext.isExcludeArchivedRepositories()) { - // exclude archived repositories - witness.record(repo.getName(), false); - listener.getLogger() - .println(GitHubConsoleNote.create( - System.currentTimeMillis(), - String.format( - "Skipping repository %s because it is archived", repo.getName()))); - } else if (!topicMatches(gitHubSCMNavigatorContext, repo, listener.getLogger())) { - // exclude repositories which are missing one or more of the specified topics - witness.record(repo.getName(), false); - } else if (!repo.isPrivate() && gitHubSCMNavigatorContext.isExcludePublicRepositories()) { - witness.record(repo.getName(), false); - listener.getLogger() - .println(GitHubConsoleNote.create( - System.currentTimeMillis(), - String.format( - "Skipping repository %s because it is public", repo.getName()))); + try { + if (repo.isArchived() && gitHubSCMNavigatorContext.isExcludeArchivedRepositories()) { + // exclude archived repositories + witness.record(repo.getName(), false); + listener.getLogger() + .println(GitHubConsoleNote.create( + System.currentTimeMillis(), + String.format( + "Skipping repository %s because it is archived", + repo.getName()))); + } else if (!topicMatches(gitHubSCMNavigatorContext, repo, listener.getLogger())) { + // exclude repositories which are missing one or more of the specified topics + witness.record(repo.getName(), false); + } else if (!repo.isPrivate() && gitHubSCMNavigatorContext.isExcludePublicRepositories()) { + witness.record(repo.getName(), false); + listener.getLogger() + .println(GitHubConsoleNote.create( + System.currentTimeMillis(), + String.format( + "Skipping repository %s because it is public", + repo.getName()))); - } else if (repo.isPrivate() && gitHubSCMNavigatorContext.isExcludePrivateRepositories()) { - witness.record(repo.getName(), false); - listener.getLogger() - .println(GitHubConsoleNote.create( - System.currentTimeMillis(), - String.format( - "Skipping repository %s because it is private", repo.getName()))); + } else if (repo.isPrivate() && gitHubSCMNavigatorContext.isExcludePrivateRepositories()) { + witness.record(repo.getName(), false); + listener.getLogger() + .println(GitHubConsoleNote.create( + System.currentTimeMillis(), + String.format( + "Skipping repository %s because it is private", + repo.getName()))); - } else if (gitHubSCMNavigatorContext.isExcludeForkedRepositories() - && repo.getSource() != null) { - witness.record(repo.getName(), false); - listener.getLogger() - .println(GitHubConsoleNote.create( - System.currentTimeMillis(), - String.format( - "Skipping repository %s because it is a fork", repo.getName()))); - } else if (request.process(repo.getName(), sourceFactory, null, witness)) { + } else if (gitHubSCMNavigatorContext.isExcludeForkedRepositories() + && repo.getSource() != null) { + witness.record(repo.getName(), false); + listener.getLogger() + .println(GitHubConsoleNote.create( + System.currentTimeMillis(), + String.format( + "Skipping repository %s because it is a fork", + repo.getName()))); + } else if (request.process(repo.getName(), sourceFactory, null, witness)) { + listener.getLogger() + .println(GitHubConsoleNote.create( + System.currentTimeMillis(), + String.format( + "%d repositories were processed (query completed)", + witness.getCount()))); + } + } catch (Exception e) { listener.getLogger() .println(GitHubConsoleNote.create( System.currentTimeMillis(), - String.format( - "%d repositories were processed (query completed)", - witness.getCount()))); + String.format("Error while processing repository %s", repo.getName()))); + Functions.printStackTrace(e, listener.getLogger()); } } listener.getLogger() From b3c14ff31942fca96fe5bd8dec919f9861ab0788 Mon Sep 17 00:00:00 2001 From: Allan Burdajewicz Date: Thu, 27 Mar 2025 13:19:06 +1000 Subject: [PATCH 07/23] [JENKINS-75471] Catch IOException --- .../plugins/github_branch_source/GitHubSCMNavigator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java index bac837f40..9f6aa8f58 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java @@ -1083,7 +1083,7 @@ public void visitSources(SCMSourceObserver observer) throws IOException, Interru "%d repositories were processed (query completed)", witness.getCount()))); } - } catch (Exception e) { + } catch (IOException e) { listener.getLogger() .println(GitHubConsoleNote.create( System.currentTimeMillis(), @@ -1176,7 +1176,7 @@ public void visitSources(SCMSourceObserver observer) throws IOException, Interru "%d repositories were processed (query completed)", witness.getCount()))); } - } catch (Exception e) { + } catch (IOException e) { listener.getLogger() .println(GitHubConsoleNote.create( System.currentTimeMillis(), From ffcfdcffada3605fe1971ad0e226c0920569b0b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 01:50:01 +0000 Subject: [PATCH 08/23] Bump org.jenkins-ci.plugins:plugin from 5.9 to 5.10 Bumps [org.jenkins-ci.plugins:plugin](https://github.com/jenkinsci/plugin-pom) from 5.9 to 5.10. - [Release notes](https://github.com/jenkinsci/plugin-pom/releases) - [Changelog](https://github.com/jenkinsci/plugin-pom/blob/master/CHANGELOG.md) - [Commits](https://github.com/jenkinsci/plugin-pom/compare/plugin-5.9...plugin-5.10) --- updated-dependencies: - dependency-name: org.jenkins-ci.plugins:plugin dependency-version: '5.10' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 849ed6654..68b07df8a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jenkins-ci.plugins plugin - 5.9 + 5.10 From 29c728685d2142186c433bd6aa5b20dfb789a39a Mon Sep 17 00:00:00 2001 From: strangelookingnerd <49242855+strangelookingnerd@users.noreply.github.com> Date: Wed, 9 Apr 2025 17:26:06 +0200 Subject: [PATCH 09/23] Migrate from com.github.tomakehurst to org.wiremock --- pom.xml | 12 ++++++------ .../github_branch_source/GitHubSCMProbeTest.java | 7 ++----- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 849ed6654..c583d23a9 100644 --- a/pom.xml +++ b/pom.xml @@ -85,12 +85,6 @@ org.jenkins-ci.plugins.workflow workflow-support - - com.github.tomakehurst - wiremock-jre8-standalone - 2.35.2 - test - io.jenkins configuration-as-code @@ -139,6 +133,12 @@ mockito-core test + + org.wiremock + wiremock-standalone + 3.12.1 + test + diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMProbeTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMProbeTest.java index 63917dacd..545600ddc 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMProbeTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMProbeTest.java @@ -4,7 +4,6 @@ import static org.junit.Assert.*; import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer; import com.github.tomakehurst.wiremock.http.RequestMethod; import com.github.tomakehurst.wiremock.junit.WireMockRule; import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder; @@ -32,10 +31,8 @@ public class GitHubSCMProbeTest { public WireMockRule githubApi = factory.getRule(WireMockConfiguration.options() .dynamicPort() .usingFilesUnderClasspath("cache_failure") - .extensions(ResponseTemplateTransformer.builder() - .global(true) - .maxCacheEntries(0L) - .build())); + .globalTemplating(true) + .withMaxTemplateCacheEntries(0L)); private GitHubSCMProbe probe; From fa7d4120f9c2f7b600fe3f3f8e477b7587a42e0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 17:00:55 +0200 Subject: [PATCH 10/23] Bump org.jenkins-ci.plugins:plugin from 5.10 to 5.12 (#849) Bumps [org.jenkins-ci.plugins:plugin](https://github.com/jenkinsci/plugin-pom) from 5.10 to 5.12. - [Release notes](https://github.com/jenkinsci/plugin-pom/releases) - [Changelog](https://github.com/jenkinsci/plugin-pom/blob/master/CHANGELOG.md) - [Commits](https://github.com/jenkinsci/plugin-pom/compare/plugin-5.10...plugin-5.12) --- updated-dependencies: - dependency-name: org.jenkins-ci.plugins:plugin dependency-version: '5.12' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f74b67e59..cb7ebf2cf 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jenkins-ci.plugins plugin - 5.10 + 5.12 From 8eca7762ccc2ad40c8ea7252aa579dc5a10105cb Mon Sep 17 00:00:00 2001 From: Vishal Wagh <169045855+vwagh-dev@users.noreply.github.com> Date: Thu, 29 May 2025 14:07:55 +0530 Subject: [PATCH 11/23] Fixed issue while validating the multibranch pipeline configuration on valid repo url --- .../plugins/github_branch_source/GitHubSCMSource.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java index 0a5570f69..9ec85f1b8 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java @@ -2135,9 +2135,9 @@ public FormValidation doValidateRepositoryUrlAndCredentials( } catch (IllegalArgumentException e) { return FormValidation.error(e, e.getMessage()); } - + final String repoOwnerOrDefault = StringUtils.isBlank(repoOwner) ? info.getRepoOwner() : repoOwner; StandardCredentials credentials = - Connector.lookupScanCredentials(context, info.getApiUri(), credentialsId, repoOwner); + Connector.lookupScanCredentials(context, info.getApiUri(), credentialsId, repoOwnerOrDefault); StringBuilder sb = new StringBuilder(); try { GitHub github = Connector.connect(info.getApiUri(), credentials); From 86d11d6e9e78284ebcb75b5f28e61ba9faf19e59 Mon Sep 17 00:00:00 2001 From: Markus Winter Date: Thu, 5 Jun 2025 19:04:25 +0200 Subject: [PATCH 12/23] Use symbol for scm navigator The symbol ensures that command palette will show the symbol and not fall back to a default icon. --- .../plugins/github_branch_source/GitHubSCMNavigator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java index 9f6aa8f58..736cefa9b 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java @@ -1757,7 +1757,7 @@ public String getIconFilePathPattern() { /** {@inheritDoc} */ @Override public String getIconClassName() { - return "icon-github-scm-navigator"; + return "symbol-logo-github plugin-ionicons-api"; } /** {@inheritDoc} */ From 85cd48516c503fbdceac4fc93459c01969648641 Mon Sep 17 00:00:00 2001 From: strangelookingnerd Date: Wed, 22 Jan 2025 15:37:10 +0100 Subject: [PATCH 13/23] Remove useBeta property from pom.xml --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index cb7ebf2cf..e5ea43e07 100644 --- a/pom.xml +++ b/pom.xml @@ -35,8 +35,8 @@ 2.2.0 2.479 - ${jenkins.baseline}.1 - true + + 2.494-rc35897.1f8edd4c1651 false From 9c755584ed865d6b5868527c862431bf9ba2ec57 Mon Sep 17 00:00:00 2001 From: strangelookingnerd <49242855+strangelookingnerd@users.noreply.github.com> Date: Wed, 29 Jan 2025 09:36:55 +0100 Subject: [PATCH 14/23] Bump jenkins.version to 2.495 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e5ea43e07..ac0c2be1f 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ 2.479 - 2.494-rc35897.1f8edd4c1651 + 2.495 false From be6cae19995b3827073a6e9c6786890687d1950a Mon Sep 17 00:00:00 2001 From: strangelookingnerd <49242855+strangelookingnerd@users.noreply.github.com> Date: Thu, 26 Jun 2025 14:32:34 +0200 Subject: [PATCH 15/23] Bump baseline and bom --- pom.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index ac0c2be1f..97e387cb1 100644 --- a/pom.xml +++ b/pom.xml @@ -34,9 +34,8 @@ jenkinsci/${project.artifactId}-plugin 2.2.0 - 2.479 - - 2.495 + 2.504 + ${jenkins.baseline}.1 false @@ -45,7 +44,7 @@ io.jenkins.tools.bom bom-${jenkins.baseline}.x - 3893.v213a_42768d35 + 4948.vcf1d17350668 pom import From 185c89831662e46958f301089fe81c26a42a24a5 Mon Sep 17 00:00:00 2001 From: Allan Burdajewicz Date: Fri, 18 Jul 2025 13:22:35 +1000 Subject: [PATCH 16/23] [JENKINS-73791] Prevent PR 404 on details to break Branches scan (#811) * [JENKINS-73791] Adap test for Branch exclude merge scenario * [JENKINS-73791] Validate PR earlier to prevent branch scan interruptions --- .../github_branch_source/GitHubSCMSource.java | 28 +++++++++---------- .../GitHubSCMSourceTest.java | 5 ++++ 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java index 9ec85f1b8..dc6271e18 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java @@ -1053,6 +1053,19 @@ public GHPermissionType fetch(String username) throws IOException, InterruptedEx } }); + if (request.isFetchPRs()) { + // JENKINS-56996 / JENKINS-73791 + // PRs are one the most error prone areas for scans + // Branches and tags are contained only the current repo, PRs go across forks + // FileNotFoundException can occur in a number of situations + // When this happens, it is not ideal behavior but it is better to let the PR be + // orphaned + // and the orphan strategy control the result than for this error to stop scanning + // (For Org scanning this is particularly important.) + // If some more general IO exception is thrown, we will still fail. + validatePullRequests(request); + } + if (request.isFetchBranches() && !request.isComplete() && this.shouldRetrieve(observer, event, BranchSCMHead.class)) { @@ -1067,6 +1080,7 @@ public GHPermissionType fetch(String username) throws IOException, InterruptedEx HyperlinkNote.encodeTo( resolvedRepositoryUrl + "/tree/" + branchName, branchName)); BranchSCMHead head = new BranchSCMHead(branchName); + if (request.process( head, new SCMRevisionImpl(head, branch.getSHA1()), @@ -1081,8 +1095,6 @@ public SCMSourceCriteria.Probe create( } }, new CriteriaWitness(listener))) { - listener.getLogger() - .format("%n %d branches were processed (query completed)%n", count); break; } } @@ -1095,18 +1107,6 @@ public SCMSourceCriteria.Probe create( int count = 0; int errorCount = 0; Map> strategies = request.getPRStrategies(); - - // JENKINS-56996 - // PRs are one the most error prone areas for scans - // Branches and tags are contained only the current repo, PRs go across forks - // FileNotFoundException can occur in a number of situations - // When this happens, it is not ideal behavior but it is better to let the PR be - // orphaned - // and the orphan strategy control the result than for this error to stop scanning - // (For Org scanning this is particularly important.) - // If some more general IO exception is thrown, we will still fail. - - validatePullRequests(request); for (final GHPullRequest pr : request.getPullRequests()) { int number = pr.getNumber(); try { diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java index 1a58db43e..77666a076 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java @@ -375,6 +375,11 @@ public boolean isHead(@NonNull Probe probe, @NonNull TaskListener listener) thro @Test public void fetchSmokes_badUser() throws Exception { + source.setTraits(Arrays.asList( + new BranchDiscoveryTrait(true, false), + new ForkPullRequestDiscoveryTrait( + EnumSet.of(ChangeRequestCheckoutStrategy.MERGE), + new ForkPullRequestDiscoveryTrait.TrustContributors()))); // make it so PR-2 returns a file not found for user githubApi.stubFor(get(urlMatching("(/api/v3)?/repos/cloudbeers/yolo/pulls/2")) .inScenario("Pull Request Merge Hash") From f4fba8aee1f6eff513d1708b976ee7f3f1029bfc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Jun 2025 01:52:02 +0000 Subject: [PATCH 17/23] Bump org.wiremock:wiremock-standalone from 3.12.1 to 3.13.1 Bumps [org.wiremock:wiremock-standalone](https://github.com/wiremock/wiremock) from 3.12.1 to 3.13.1. - [Release notes](https://github.com/wiremock/wiremock/releases) - [Commits](https://github.com/wiremock/wiremock/compare/3.12.1...3.13.1) --- updated-dependencies: - dependency-name: org.wiremock:wiremock-standalone dependency-version: 3.13.1 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 97e387cb1..807ef6273 100644 --- a/pom.xml +++ b/pom.xml @@ -135,7 +135,7 @@ org.wiremock wiremock-standalone - 3.12.1 + 3.13.1 test From 8146a4c89f8ef18bdc223787f80fa69da4bc9d36 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Jul 2025 05:10:41 +0000 Subject: [PATCH 18/23] Bump org.jenkins-ci.plugins:plugin from 5.12 to 5.18 Bumps [org.jenkins-ci.plugins:plugin](https://github.com/jenkinsci/plugin-pom) from 5.12 to 5.18. - [Release notes](https://github.com/jenkinsci/plugin-pom/releases) - [Changelog](https://github.com/jenkinsci/plugin-pom/blob/master/CHANGELOG.md) - [Commits](https://github.com/jenkinsci/plugin-pom/compare/plugin-5.12...plugin-5.18) --- updated-dependencies: - dependency-name: org.jenkins-ci.plugins:plugin dependency-version: '5.18' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 807ef6273..8fe8a5b9a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jenkins-ci.plugins plugin - 5.12 + 5.18 From ce7905e1aa7e166a2c1fbd45bae521f7fc758e84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Jul 2025 03:36:59 +0000 Subject: [PATCH 19/23] Bump org.awaitility:awaitility from 4.2.2 to 4.3.0 Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.2.2 to 4.3.0. - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.2.2...awaitility-4.3.0) --- updated-dependencies: - dependency-name: org.awaitility:awaitility dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8fe8a5b9a..fbbb2c38b 100644 --- a/pom.xml +++ b/pom.xml @@ -102,7 +102,7 @@ org.awaitility awaitility - 4.2.2 + 4.3.0 test From 77b6542df5a8b10fe7d0ed6aa2b9a56dce8059ee Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Tue, 29 Jul 2025 20:04:26 -0700 Subject: [PATCH 20/23] Upgrade Commons Lang from 2 to 3 (#874) --- pom.xml | 4 ++++ .../plugins/github_branch_source/ApiRateLimitChecker.java | 2 +- .../jenkinsci/plugins/github_branch_source/Connector.java | 2 +- .../jenkinsci/plugins/github_branch_source/Endpoint.java | 2 +- .../plugins/github_branch_source/GitHubConfiguration.java | 2 +- .../github_branch_source/GitHubOrgMetadataAction.java | 2 +- .../plugins/github_branch_source/GitHubRepositoryInfo.java | 4 ++-- .../plugins/github_branch_source/GitHubSCMBuilder.java | 2 +- .../plugins/github_branch_source/GitHubSCMFileSystem.java | 2 +- .../plugins/github_branch_source/GitHubSCMNavigator.java | 2 +- .../plugins/github_branch_source/GitHubSCMSource.java | 6 +++--- .../github_branch_source/PullRequestSCMRevision.java | 2 +- .../plugins/github_branch_source/SSHCheckoutTrait.java | 2 +- 13 files changed, 19 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index fbbb2c38b..645d9f1e7 100644 --- a/pom.xml +++ b/pom.xml @@ -60,6 +60,10 @@ io.jenkins.plugins caffeine-api + + io.jenkins.plugins + commons-lang3-api + io.jenkins.plugins ionicons-api diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/ApiRateLimitChecker.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/ApiRateLimitChecker.java index 93c0c8de0..41f0deb8f 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/ApiRateLimitChecker.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/ApiRateLimitChecker.java @@ -11,7 +11,7 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.jenkinsci.plugins.github.config.GitHubServerConfig; import org.kohsuke.github.GHRateLimit; import org.kohsuke.github.GitHub; diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/Connector.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/Connector.java index 8bb1b338a..9915d2318 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/Connector.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/Connector.java @@ -75,7 +75,7 @@ import jenkins.util.SystemProperties; import okhttp3.Cache; import okhttp3.OkHttpClient; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.jenkinsci.plugins.gitclient.GitClient; import org.jenkinsci.plugins.github.config.GitHubServerConfig; import org.kohsuke.github.GHAppInstallationToken; diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/Endpoint.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/Endpoint.java index 8c6539002..0669a5444 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/Endpoint.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/Endpoint.java @@ -42,7 +42,7 @@ import java.util.logging.Logger; import jenkins.model.Jenkins; import jenkins.scm.api.SCMName; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.github.GitHub; diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubConfiguration.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubConfiguration.java index 54bd14fda..f06c109b2 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubConfiguration.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubConfiguration.java @@ -41,7 +41,7 @@ import jenkins.model.GlobalConfiguration; import jenkins.model.Jenkins; import net.sf.json.JSONObject; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.kohsuke.stapler.StaplerRequest2; @Extension diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubOrgMetadataAction.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubOrgMetadataAction.java index c2c88d89e..284f00f69 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubOrgMetadataAction.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubOrgMetadataAction.java @@ -32,7 +32,7 @@ import java.io.ObjectStreamException; import java.util.Objects; import jenkins.scm.api.metadata.AvatarMetadataAction; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.kohsuke.github.GHUser; import org.kohsuke.stapler.Stapler; diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubRepositoryInfo.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubRepositoryInfo.java index db74b0720..9302e863f 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubRepositoryInfo.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubRepositoryInfo.java @@ -24,13 +24,13 @@ package org.jenkinsci.plugins.github_branch_source; -import static org.apache.commons.lang.StringUtils.removeEnd; +import static org.apache.commons.lang3.StringUtils.removeEnd; import static org.jenkinsci.plugins.github_branch_source.GitHubSCMSource.GITHUB_COM; import edu.umd.cs.findbugs.annotations.NonNull; import java.net.MalformedURLException; import java.net.URL; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; /** * Used to compute values for GitHubSCMSource from a user-specified repository URL. diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMBuilder.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMBuilder.java index b677f0aeb..962b9707e 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMBuilder.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMBuilder.java @@ -48,7 +48,7 @@ import jenkins.scm.api.SCMRevision; import jenkins.scm.api.SCMSourceOwner; import jenkins.scm.api.mixin.TagSCMHead; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.transport.RefSpec; import org.jenkinsci.plugins.github.config.GitHubServerConfig; diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMFileSystem.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMFileSystem.java index cdecf79ea..e3bd1a01e 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMFileSystem.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMFileSystem.java @@ -46,7 +46,7 @@ import jenkins.scm.api.SCMRevision; import jenkins.scm.api.SCMSource; import jenkins.scm.api.SCMSourceDescriptor; -import org.apache.commons.lang.time.FastDateFormat; +import org.apache.commons.lang3.time.FastDateFormat; import org.kohsuke.github.GHCommit; import org.kohsuke.github.GHRef; import org.kohsuke.github.GHRepository; diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java index 736cefa9b..1d065cc75 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMNavigator.java @@ -91,7 +91,7 @@ import jenkins.scm.impl.trait.WildcardSCMHeadFilterTrait; import jenkins.util.SystemProperties; import net.jcip.annotations.GuardedBy; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.jenkins.ui.icon.Icon; import org.jenkins.ui.icon.IconFormat; import org.jenkins.ui.icon.IconSet; diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java index dc6271e18..d04959b23 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java @@ -26,8 +26,8 @@ import static hudson.Functions.isWindows; import static hudson.model.Items.XSTREAM2; -import static org.apache.commons.lang.StringUtils.isBlank; -import static org.apache.commons.lang.StringUtils.removeEnd; +import static org.apache.commons.lang3.StringUtils.isBlank; +import static org.apache.commons.lang3.StringUtils.removeEnd; import static org.jenkinsci.plugins.github_branch_source.Connector.isCredentialValid; import static org.jenkinsci.plugins.github_branch_source.GitHubSCMBuilder.API_V3; import static org.jenkinsci.plugins.github_branch_source.GitHubSCMBuilder.HTTPS; @@ -117,7 +117,7 @@ import jenkins.scm.impl.trait.Selection; import jenkins.scm.impl.trait.WildcardSCMHeadFilterTrait; import jenkins.util.SystemProperties; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.eclipse.jgit.lib.Constants; import org.jenkinsci.Symbol; import org.jenkinsci.plugins.github.config.GitHubServerConfig; diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/PullRequestSCMRevision.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/PullRequestSCMRevision.java index 9c3cddfea..afce906e5 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/PullRequestSCMRevision.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/PullRequestSCMRevision.java @@ -32,7 +32,7 @@ import jenkins.scm.api.mixin.ChangeRequestCheckoutStrategy; import jenkins.scm.api.mixin.ChangeRequestSCMHead2; import jenkins.scm.api.mixin.ChangeRequestSCMRevision; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.kohsuke.stapler.export.Exported; /** Revision of a pull request. */ diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/SSHCheckoutTrait.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/SSHCheckoutTrait.java index 67ecdad4b..de6a6d00f 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/SSHCheckoutTrait.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/SSHCheckoutTrait.java @@ -47,7 +47,7 @@ import jenkins.scm.api.trait.SCMSourceContext; import jenkins.scm.api.trait.SCMSourceTrait; import jenkins.scm.api.trait.SCMSourceTraitDescriptor; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.jenkinsci.Symbol; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; From 857721ea74c652835e8e34e6fd1311a45877b9f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Garrido?= <63926082+IvanGasant@users.noreply.github.com> Date: Thu, 31 Jul 2025 18:54:33 +0200 Subject: [PATCH 21/23] [JENKINS-75704] Fix Copilot user null name/email handling (#864) --- .../github_branch_source/GitHubSCMSource.java | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java index d04959b23..550cb4146 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java @@ -2572,17 +2572,24 @@ public void observe(GHPullRequest pr) { GHUser user = null; try { user = pr.getUser(); - if (users.containsKey(user.getLogin())) { - // looked up this user already - user = users.get(user.getLogin()); + String login = user.getLogin(); + if ("copilot".equalsIgnoreCase(login)) { + ContributorMetadataAction contributor = + new ContributorMetadataAction("copilot", "copilot", "copilot@unknown.user"); + pullRequestContributorCache.put(number, contributor); + users.put("copilot", user); + } else { + if (users.containsKey(login)) { + // looked up this user already + user = users.get(login); + } + ContributorMetadataAction contributor = + new ContributorMetadataAction(login, user.getName(), user.getEmail()); + // store the populated user record now that we have it + pullRequestContributorCache.put(number, contributor); + users.put(login, user); } - ContributorMetadataAction contributor = - new ContributorMetadataAction(user.getLogin(), user.getName(), user.getEmail()); - pullRequestContributorCache.put(number, contributor); - // store the populated user record now that we have it - users.put(user.getLogin(), user); } catch (FileNotFoundException e) { - // If file not found for user, warn but keep going request.listener() .getLogger() .format( From 68f4865ed2cf26f92848ffbfa444c0f2135c5d3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 01:30:53 +0000 Subject: [PATCH 22/23] Bump org.jenkins-ci.plugins:plugin from 5.18 to 5.19 Bumps [org.jenkins-ci.plugins:plugin](https://github.com/jenkinsci/plugin-pom) from 5.18 to 5.19. - [Release notes](https://github.com/jenkinsci/plugin-pom/releases) - [Changelog](https://github.com/jenkinsci/plugin-pom/blob/master/CHANGELOG.md) - [Commits](https://github.com/jenkinsci/plugin-pom/compare/plugin-5.18...plugin-5.19) --- updated-dependencies: - dependency-name: org.jenkins-ci.plugins:plugin dependency-version: '5.19' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 645d9f1e7..515b630a4 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jenkins-ci.plugins plugin - 5.18 + 5.19 From f7e0ff13626ec01620b8a559c75eb8f570dd9106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Pochat?= Date: Tue, 19 Aug 2025 13:53:47 +0200 Subject: [PATCH 23/23] Suppressing unnecessary annotation --- .../plugins/github_branch_source/GitHubAppCredentials.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubAppCredentials.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubAppCredentials.java index 4dc65d3f8..d2a2886e3 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubAppCredentials.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubAppCredentials.java @@ -103,7 +103,6 @@ public class GitHubAppCredentials extends BaseStandardCredentials implements Sta private String apiUri; - @SuppressFBWarnings(value = "IS2_INCONSISTENT_SYNC", justification = "#withOwner locking only for #byOwner") @Deprecated private String owner;