From 5fc600e471e80cd5f7d70375444a893e7a7ad3f5 Mon Sep 17 00:00:00 2001 From: aayushRedHat Date: Sun, 24 Dec 2023 21:32:38 +0530 Subject: [PATCH] Add Failing Build Probe --- .../scoring/probes/FailingBuildProbe.java | 78 +++++++++++++++++++ .../scoring/probes/FailingBuildProbeTest.java | 38 +++++++++ 2 files changed, 116 insertions(+) create mode 100644 core/src/main/java/io/jenkins/pluginhealth/scoring/probes/FailingBuildProbe.java create mode 100644 core/src/test/java/io/jenkins/pluginhealth/scoring/probes/FailingBuildProbeTest.java diff --git a/core/src/main/java/io/jenkins/pluginhealth/scoring/probes/FailingBuildProbe.java b/core/src/main/java/io/jenkins/pluginhealth/scoring/probes/FailingBuildProbe.java new file mode 100644 index 000000000..ca275d6a8 --- /dev/null +++ b/core/src/main/java/io/jenkins/pluginhealth/scoring/probes/FailingBuildProbe.java @@ -0,0 +1,78 @@ +package io.jenkins.pluginhealth.scoring.probes; + +import io.jenkins.pluginhealth.scoring.model.Plugin; +import io.jenkins.pluginhealth.scoring.model.ProbeResult; +import org.kohsuke.github.*; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.stream.Stream; + +@Component +@Order(FailingBuildProbe.ORDER) +public class FailingBuildProbe extends Probe{ + + public static final int ORDER = LastCommitDateProbe.ORDER + 100; + public static final String KEY = "failing-buildingProbe"; + + @Override + protected ProbeResult doApply(Plugin plugin, ProbeContext context){ + + if (context.getRepositoryName(plugin.getScm()).isPresent()) { + return ProbeResult.success(key(),"There is no local repository for plugin " + plugin.getName() + "."); + } + try { + if(repoContainsJenkins(context).equals("Jenkinsfile found")){ + + final GitHub gh = context.getGitHub(); + final GHRepository repository = gh.getRepository(context.getRepositoryName(plugin.getScm()).orElseThrow()); + repository.getDefaultBranch(); + + GHCommit commit = repository.getCommit(repository.getDefaultBranch()); + GHCheckRun checkRun = commit.getCheckRuns().iterator().next(); + GHCheckRun.Conclusion conclusion = checkRun.getConclusion(); + + if(conclusion == GHCheckRun.Conclusion.FAILURE){ + + return ProbeResult.success(key(),"Build Failed in Default Branch"); + } + else{ + return ProbeResult.success(key(),"Build is Success in Default Branch"); + } + } + else{ + + return ProbeResult.failure(key(),"No JenkinsFile found"); + } + }catch (IOException e) { + return ProbeResult.error(key(), "Could not get failingBuilding Check"); + } + + } + + public ProbeResult repoContainsJenkins(ProbeContext context){ + final Path repository = context.getScmRepository(); + try (Stream paths = Files.find(repository, 1, (file, $) -> + Files.isReadable(file) && "JenkinsFile".equals(file.getFileName().toString()))) { + return paths.findFirst() + .map(file -> ProbeResult.success (key(),"Jenkinsfile found")) + .orElseGet(() -> ProbeResult.failure(key(),"No Jenkinsfile found")); + } catch (IOException e) { + return ProbeResult.failure(key(),e.getMessage()); + } + } + @Override + public String key() { + return KEY; + } + + @Override + public String getDescription() { + return "Return whether the build is failed on default branch or not"; + } + + +} diff --git a/core/src/test/java/io/jenkins/pluginhealth/scoring/probes/FailingBuildProbeTest.java b/core/src/test/java/io/jenkins/pluginhealth/scoring/probes/FailingBuildProbeTest.java new file mode 100644 index 000000000..eb7970c0c --- /dev/null +++ b/core/src/test/java/io/jenkins/pluginhealth/scoring/probes/FailingBuildProbeTest.java @@ -0,0 +1,38 @@ +package io.jenkins.pluginhealth.scoring.probes; + +import io.jenkins.pluginhealth.scoring.model.Plugin; +import io.jenkins.pluginhealth.scoring.model.ProbeResult; +import io.jenkins.pluginhealth.scoring.model.ResultStatus; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.file.Files; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.when; + +public class FailingBuildProbeTest extends AbstractProbeTest { + + @Override + FailingBuildProbe getSpy() { + return spy(FailingBuildProbe.class); + } + + @Test + void shouldCorrectlyDetectMissingJenkinsfile() throws IOException { + final Plugin plugin = mock(Plugin.class); + final ProbeContext ctx = mock(ProbeContext.class); + final FailingBuildProbe probe = getSpy(); + + when(plugin.getDetails()).thenReturn(Map.of( + SCMLinkValidationProbe.KEY, ProbeResult.success(SCMLinkValidationProbe.KEY, ""), + LastCommitDateProbe.KEY, ProbeResult.success(LastCommitDateProbe.KEY, "") + )); + when(ctx.getScmRepository()).thenReturn( + Files.createTempDirectory("foo") + ); + assertThat(probe.apply(plugin, ctx).status()).isEqualTo(ResultStatus.FAILURE); + } +}