diff --git a/pom.xml b/pom.xml index 01922606..483b633c 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ 999999-SNAPSHOT - 2.361.4 + 2.440.3 true @@ -41,11 +41,17 @@ io.jenkins.tools.bom - bom-2.361.x - 2102.v854b_fec19c92 + bom-2.440.x + 3276.vcd71db_867fb_2 import pom + + + org.jenkins-ci.plugins + github-branch-source + 1797.v86fdb_4d57d43 + diff --git a/src/main/java/io/jenkins/plugins/checks/github/GitHubChecksContext.java b/src/main/java/io/jenkins/plugins/checks/github/GitHubChecksContext.java index ff6ac580..2844ef01 100644 --- a/src/main/java/io/jenkins/plugins/checks/github/GitHubChecksContext.java +++ b/src/main/java/io/jenkins/plugins/checks/github/GitHubChecksContext.java @@ -8,7 +8,6 @@ import edu.hm.hafner.util.FilteredLog; import edu.umd.cs.findbugs.annotations.CheckForNull; -import org.jenkinsci.plugins.github_branch_source.GitHubAppCredentials; import hudson.model.Job; import hudson.model.Run; diff --git a/src/main/java/io/jenkins/plugins/checks/github/GitHubChecksPublisher.java b/src/main/java/io/jenkins/plugins/checks/github/GitHubChecksPublisher.java index 72665956..64f3c411 100644 --- a/src/main/java/io/jenkins/plugins/checks/github/GitHubChecksPublisher.java +++ b/src/main/java/io/jenkins/plugins/checks/github/GitHubChecksPublisher.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import edu.hm.hafner.util.VisibleForTesting; +import edu.umd.cs.findbugs.annotations.Nullable; import org.kohsuke.github.GHCheckRun; import org.kohsuke.github.GHCheckRunBuilder; @@ -35,6 +36,9 @@ public class GitHubChecksPublisher extends ChecksPublisher { private final PluginLogger buildLogger; private final String gitHubUrl; + @Nullable + private StandardUsernameCredentials credentials; + /** * Creates a new instance of GitHubChecksPublisher. * @@ -63,9 +67,8 @@ public GitHubChecksPublisher(final GitHubChecksContext context, final PluginLogg @Override public void publish(final ChecksDetails details) { try { - StandardUsernameCredentials credentials = context.getCredentials(); // Prevent publication with unsupported credential types - switch (credentials.getClass().getSimpleName()) { + switch (getCredentials().getClass().getSimpleName()) { case "GitHubAppCredentials": case "VaultUsernamePasswordCredentialImpl": break; @@ -74,12 +77,12 @@ public void publish(final ChecksDetails details) { } String apiUri = null; - if (credentials instanceof GitHubAppCredentials) { - apiUri = ((GitHubAppCredentials) credentials).getApiUri(); + if (getCredentials() instanceof GitHubAppCredentials) { + apiUri = ((GitHubAppCredentials) getCredentials()).getApiUri(); } GitHub gitHub = Connector.connect(StringUtils.defaultIfBlank(apiUri, gitHubUrl), - credentials); + getCredentials()); GitHubChecksDetails gitHubDetails = new GitHubChecksDetails(details); @@ -124,12 +127,27 @@ GHCheckRunBuilder getUpdater(final GitHub github, final GitHubChecksDetails deta @VisibleForTesting GHCheckRunBuilder getCreator(final GitHub gitHub, final GitHubChecksDetails details) throws IOException { GHCheckRunBuilder builder = gitHub.getRepository(context.getRepository()) - .createCheckRun(details.getName(), context.getHeadSha()) - .withStartedAt(details.getStartedAt().orElse(Date.from(Instant.now()))); + .createCheckRun(details.getName(), context.getHeadSha()) + .withStartedAt(details.getStartedAt().orElse(Date.from(Instant.now()))); return applyDetails(builder, details); } + @VisibleForTesting + StandardUsernameCredentials getCredentials() { + if (credentials == null) { + credentials = context.getCredentials(); + if (credentials instanceof GitHubAppCredentials) { + final var gitHubAppCredentials = (GitHubAppCredentials) credentials; + if (context instanceof GitHubSCMSourceChecksContext) { + final var gitHubSCMSourceChecksContext = (GitHubSCMSourceChecksContext) context; + credentials = gitHubAppCredentials.withOwner(gitHubSCMSourceChecksContext.getOwner()); + } + } + } + return credentials; + } + private GHCheckRunBuilder applyDetails(final GHCheckRunBuilder builder, final GitHubChecksDetails details) { builder .withStatus(details.getStatus()) diff --git a/src/main/java/io/jenkins/plugins/checks/github/GitHubSCMSourceChecksContext.java b/src/main/java/io/jenkins/plugins/checks/github/GitHubSCMSourceChecksContext.java index afc31c72..f6cedef0 100644 --- a/src/main/java/io/jenkins/plugins/checks/github/GitHubSCMSourceChecksContext.java +++ b/src/main/java/io/jenkins/plugins/checks/github/GitHubSCMSourceChecksContext.java @@ -66,6 +66,10 @@ public String getRepository() { } } + String getOwner() { + return Optional.ofNullable(resolveSource()).map(GitHubSCMSource::getRepoOwner).orElse(null); + } + @Override public boolean isValid(final FilteredLog logger) { logger.logError("Trying to resolve checks parameters from GitHub SCM..."); diff --git a/src/test/java/io/jenkins/plugins/checks/github/GitHubChecksPublisherITest.java b/src/test/java/io/jenkins/plugins/checks/github/GitHubChecksPublisherITest.java index b09a00c8..344a758b 100644 --- a/src/test/java/io/jenkins/plugins/checks/github/GitHubChecksPublisherITest.java +++ b/src/test/java/io/jenkins/plugins/checks/github/GitHubChecksPublisherITest.java @@ -66,6 +66,9 @@ import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.*; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; /** @@ -325,6 +328,15 @@ public void testChecksPublisherUpdatesCorrectly() throws Exception { "https://github.example.com/" ); + // Check that the owner is passed from context to credentials + if (context instanceof GitHubSCMSourceChecksContext) { + var credentials = publisher.getCredentials(); + if (credentials instanceof GitHubAppCredentials) { + var gitHubAppCredentials = (GitHubAppCredentials) credentials; + assertThat(gitHubAppCredentials.getOwner()).isEqualTo("XiongKezhi"); + } + } + assertThat(context.getId(checksName1)).isNotPresent(); assertThat(context.getId(checksName2)).isNotPresent();