Skip to content

Commit

Permalink
[JENKINS-48816] Inserted combo to choose job status when analyse fail.
Browse files Browse the repository at this point in the history
  • Loading branch information
arkanjoms committed Feb 14, 2018
1 parent a3e3eb2 commit 94c560b
Show file tree
Hide file tree
Showing 15 changed files with 113 additions and 62 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Expand Up @@ -34,7 +34,7 @@

<artifactId>sonar-quality-gates</artifactId>
<name>Sonar Quality Gates Plugin</name>
<version>1.2.1-SNAPSHOT</version>
<version>1.3.0-SNAPSHOT</version>
<description>Fails the build whenever the Quality Gates criteria in the Sonar 5.6+ analysis aren't met (the project
Quality Gates status is different than "Passed")
</description>
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/org/quality/gates/jenkins/plugin/JobConfigData.java
@@ -1,5 +1,7 @@
package org.quality.gates.jenkins.plugin;

import org.quality.gates.jenkins.plugin.enumeration.BuildStatusEnum;

public class JobConfigData {

private String projectKey;
Expand All @@ -8,6 +10,8 @@ public class JobConfigData {

private int attemptsToRepeat;

private BuildStatusEnum buildStatus;

public String getProjectKey() {
return projectKey;
}
Expand All @@ -32,6 +36,14 @@ public void setAttemptsToRepeat(int attemptsToRepeat) {
this.attemptsToRepeat = attemptsToRepeat;
}

public BuildStatusEnum getBuildStatus() {
return buildStatus;
}

public void setBuildStatus(BuildStatusEnum buildStatus) {
this.buildStatus = buildStatus;
}

@Override
public boolean equals(Object o) {

Expand Down
Expand Up @@ -5,6 +5,7 @@
import hudson.model.BuildListener;
import hudson.util.ListBoxModel;
import net.sf.json.JSONObject;
import org.quality.gates.jenkins.plugin.enumeration.BuildStatusEnum;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
Expand Down Expand Up @@ -52,6 +53,7 @@ public JobConfigData createJobConfigData(JSONObject formData, GlobalConfig globa

firstInstanceJobConfigData.setProjectKey(projectKey);
firstInstanceJobConfigData.setSonarInstanceName(name);
firstInstanceJobConfigData.setBuildStatus(BuildStatusEnum.valueOf(formData.getString("buildStatus")));

return firstInstanceJobConfigData;
}
Expand Down Expand Up @@ -87,6 +89,7 @@ public JobConfigData checkProjectKeyIfVariable(JobConfigData jobConfigData, Abst
}

envVariableJobConfigData.setSonarInstanceName(jobConfigData.getSonarInstanceName());
envVariableJobConfigData.setBuildStatus(jobConfigData.getBuildStatus());

return envVariableJobConfigData;
}
Expand Down
12 changes: 9 additions & 3 deletions src/main/java/org/quality/gates/jenkins/plugin/QGBuilder.java
Expand Up @@ -3,8 +3,10 @@
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.BuildListener;
import hudson.model.Result;
import hudson.tasks.Builder;
import org.kohsuke.stapler.DataBoundConstructor;
import org.quality.gates.jenkins.plugin.enumeration.BuildStatusEnum;

public class QGBuilder extends Builder {

Expand Down Expand Up @@ -63,20 +65,24 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListener lis
e.printStackTrace(listener.getLogger());
}

boolean buildHasPassed;
boolean buildHasPassed = false;

try {
JobConfigData checkedJobConfigData = jobConfigurationService.checkProjectKeyIfVariable(jobConfigData, build, listener);
buildHasPassed = buildDecision.getStatus(globalConfigDataForSonarInstance, checkedJobConfigData, listener);
if ("".equals(jobConfigData.getSonarInstanceName()))
listener.getLogger().println(JobExecutionService.DEFAULT_CONFIGURATION_WARNING);
listener.getLogger().println("Build-Step: Quality Gates plugin build passed: " + String.valueOf(buildHasPassed).toUpperCase());
return buildHasPassed;

if (!buildHasPassed && BuildStatusEnum.UNSTABLE.equals(checkedJobConfigData.getBuildStatus())) {
build.setResult(Result.UNSTABLE);
return true;
}
} catch (QGException e) {
e.printStackTrace(listener.getLogger());
}

return false;
return buildHasPassed;
}

@Override
Expand Down
Expand Up @@ -9,8 +9,10 @@
import net.sf.json.JSONObject;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.quality.gates.jenkins.plugin.enumeration.BuildStatusEnum;

import javax.inject.Inject;
import java.util.Arrays;

@Extension
public final class QGBuilderDescriptor extends BuildStepDescriptor<Builder> {
Expand Down Expand Up @@ -39,6 +41,12 @@ public ListBoxModel doFillListOfGlobalConfigDataItems() {
return jobConfigurationService.getListOfSonarInstanceNames(jobExecutionService.getGlobalConfigData());
}

public ListBoxModel doFillBuildStatusItems() {
ListBoxModel items = new ListBoxModel();
Arrays.asList(BuildStatusEnum.values()).forEach(e -> items.add(e.toString()));
return items;
}

public FormValidation doCheckProjectKey(@QueryParameter String projectKey) {

if (projectKey.isEmpty()) {
Expand Down
14 changes: 9 additions & 5 deletions src/main/java/org/quality/gates/jenkins/plugin/QGPublisher.java
Expand Up @@ -7,6 +7,7 @@
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Recorder;
import org.kohsuke.stapler.DataBoundConstructor;
import org.quality.gates.jenkins.plugin.enumeration.BuildStatusEnum;

public class QGPublisher extends Recorder {

Expand Down Expand Up @@ -77,23 +78,26 @@ public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListen
return false;
}

boolean buildPassed;
boolean buildHasPassed = false;

try {
JobConfigData checkedJobConfigData = jobConfigurationService.checkProjectKeyIfVariable(jobConfigData, build, listener);
buildPassed = buildDecision.getStatus(globalConfigDataForSonarInstance, checkedJobConfigData, listener);
buildHasPassed = buildDecision.getStatus(globalConfigDataForSonarInstance, checkedJobConfigData, listener);

if ("".equals(jobConfigData.getSonarInstanceName())) {
listener.getLogger().println(JobExecutionService.DEFAULT_CONFIGURATION_WARNING);
}

listener.getLogger().println("PostBuild-Step: Quality Gates plugin build passed: " + String.valueOf(buildPassed).toUpperCase());
listener.getLogger().println("PostBuild-Step: Quality Gates plugin build passed: " + String.valueOf(buildHasPassed).toUpperCase());

return buildPassed;
if (!buildHasPassed && BuildStatusEnum.UNSTABLE.equals(checkedJobConfigData.getBuildStatus())) {
build.setResult(Result.UNSTABLE);
return true;
}
} catch (QGException e) {
e.printStackTrace(listener.getLogger());
}

return false;
return buildHasPassed;
}
}
Expand Up @@ -9,8 +9,10 @@
import net.sf.json.JSONObject;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.quality.gates.jenkins.plugin.enumeration.BuildStatusEnum;

import javax.inject.Inject;
import java.util.Arrays;

@Extension
public final class QGPublisherDescriptor extends BuildStepDescriptor<Publisher> {
Expand Down Expand Up @@ -51,6 +53,12 @@ public FormValidation doCheckProjectKey(@QueryParameter String projectKey) {
return FormValidation.ok();
}

public ListBoxModel doFillBuildStatusItems() {
ListBoxModel items = new ListBoxModel();
Arrays.asList(BuildStatusEnum.values()).forEach(e -> items.add(e.toString()));
return items;
}

@Override
public boolean isApplicable(Class<? extends AbstractProject> jobType) {
return true;
Expand Down
@@ -0,0 +1,5 @@
package org.quality.gates.jenkins.plugin.enumeration;

public enum BuildStatusEnum {
FAILED, UNSTABLE
}
Expand Up @@ -28,25 +28,29 @@
</f:section>
</j:if>
<j:if test="${descriptor.jobExecutionService.getGlobalConfigData().listOfGlobalConfigData.size() == 1}">
<f:section>
<f:entry field="jobConfigData" description="Enter your project key.">
<f:entry title="Project Key" field="projectKey">
<f:textbox name="projectKey" value="${instance.jobConfigData.projectKey}" />
</f:entry>
</f:entry>
</f:section>
<f:section>
<f:entry title="Project Key" field="projectKey">
<f:textbox name="projectKey" value="${instance.jobConfigData.projectKey}" />
</f:entry>

<f:entry title="Job status when analysis fails" field="buildStatus">
<f:select name="buildStatus" value="${instance.jobConfigData.buildStatus}" />
</f:entry>
</f:section>
</j:if>
<j:if test="${descriptor.jobExecutionService.getGlobalConfigData().listOfGlobalConfigData.size() >= 2}">
<f:section>
<f:entry field="listOfGlobalConfigData" title="Sonar instance 'Name'" description="Choose sonar instance">
<f:select name="sonarInstancesName" value="${instance.jobConfigData.sonarInstanceName}"/>
</f:entry>
<f:entry field="listOfGlobalConfigData" title="Sonar instance 'Name'">
<f:select name="sonarInstancesName" value="${instance.jobConfigData.sonarInstanceName}"/>
</f:entry>

<f:entry title="Project Key" field="projectKey">
<f:textbox name="projectKey" value="${instance.jobConfigData.projectKey}" />
</f:entry>

<f:entry field="jobConfigData" description="Enter your project key.">
<f:entry title="Project Key" field="projectKey">
<f:textbox name="projectKey" value="${instance.jobConfigData.projectKey}" />
</f:entry>
</f:entry>
<f:entry title="Job status when analysis fails" field="buildStatus">
<f:select name="buildStatus" value="${instance.jobConfigData.buildStatus}" />
</f:entry>
</f:section>
</j:if>
</j:jelly>
@@ -0,0 +1,5 @@
<div align="left">
<ul style="list-style-type:none">
<li>Job status when analysis fails.</li>
</ul>
</div>
Expand Up @@ -28,25 +28,29 @@
</f:section>
</j:if>
<j:if test="${descriptor.jobExecutionService.getGlobalConfigData().listOfGlobalConfigData.size() == 1}">
<f:section>
<f:entry field="jobConfigData" description="Enter your project key.">
<f:entry title="Project Key" field="projectKey">
<f:textbox name="projectKey" value="${instance.jobConfigData.projectKey}" />
</f:entry>
</f:entry>
</f:section>
<f:section>
<f:entry title="Project Key" field="projectKey">
<f:textbox name="projectKey" value="${instance.jobConfigData.projectKey}" />
</f:entry>

<f:entry title="Job status when analysis fails" field="buildStatus">
<f:select name="buildStatus" value="${instance.jobConfigData.buildStatus}" />
</f:entry>
</f:section>
</j:if>
<j:if test="${descriptor.jobExecutionService.getGlobalConfigData().listOfGlobalConfigData.size() >= 2}">
<f:section>
<f:entry field="listOfGlobalConfigData" title="Sonar instance 'Name'" description="Choose sonar instance">
<f:select name="sonarInstancesName" value="${instance.jobConfigData.sonarInstanceName}"/>
</f:entry>
<f:entry field="listOfGlobalConfigData" title="Sonar instance 'Name'">
<f:select name="sonarInstancesName" value="${instance.jobConfigData.sonarInstanceName}"/>
</f:entry>

<f:entry title="Project Key" field="projectKey">
<f:textbox name="projectKey" value="${instance.jobConfigData.projectKey}" />
</f:entry>

<f:entry field="jobConfigData" description="Enter your project key.">
<f:entry title="Project Key" field="projectKey">
<f:textbox name="projectKey" value="${instance.jobConfigData.projectKey}" />
</f:entry>
</f:entry>
<f:entry title="Job status when analysis fails" field="buildStatus">
<f:select name="buildStatus" value="${instance.jobConfigData.buildStatus}" />
</f:entry>
</f:section>
</j:if>
</j:jelly>
@@ -0,0 +1,5 @@
<div align="left">
<ul style="list-style-type:none">
<li>Job status when analysis fails.</li>
</ul>
</div>
Expand Up @@ -9,11 +9,7 @@
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.quality.gates.jenkins.plugin.GlobalConfig;
import org.quality.gates.jenkins.plugin.GlobalConfigDataForSonarInstance;
import org.quality.gates.jenkins.plugin.JobConfigData;
import org.quality.gates.jenkins.plugin.JobConfigurationService;
import org.quality.gates.jenkins.plugin.QGException;
import org.quality.gates.jenkins.plugin.enumeration.BuildStatusEnum;

import java.io.IOException;
import java.io.InterruptedIOException;
Expand Down Expand Up @@ -59,6 +55,7 @@ public void setUp() {
jobConfigurationService = new JobConfigurationService();
formData = new JSONObject();
formData.put("projectKey", "TestKey");
formData.put("buildStatus", BuildStatusEnum.FAILED.toString());
}

@Test
Expand Down Expand Up @@ -100,6 +97,7 @@ public void testNewInstanceSizeGreaterThanZeroAndDoesNotContainKey() {
jobConfigData = new JobConfigData();
jobConfigData.setProjectKey("TestKey");
jobConfigData.setSonarInstanceName("TestName");
jobConfigData.setBuildStatus(BuildStatusEnum.FAILED);
doReturn(globalConfigDataForSonarInstances).when(globalConfig).fetchListOfGlobalConfigData();
int greaterThanZero = 1;
doReturn(greaterThanZero).when(globalConfigDataForSonarInstances).size();
Expand Down
Expand Up @@ -7,14 +7,7 @@
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.quality.gates.jenkins.plugin.BuildDecision;
import org.quality.gates.jenkins.plugin.GlobalConfig;
import org.quality.gates.jenkins.plugin.GlobalConfigDataForSonarInstance;
import org.quality.gates.jenkins.plugin.JobConfigData;
import org.quality.gates.jenkins.plugin.JobConfigurationService;
import org.quality.gates.jenkins.plugin.JobExecutionService;
import org.quality.gates.jenkins.plugin.QGBuilder;
import org.quality.gates.jenkins.plugin.QGException;
import org.quality.gates.jenkins.plugin.enumeration.BuildStatusEnum;

import java.io.PrintStream;
import java.io.PrintWriter;
Expand Down Expand Up @@ -67,6 +60,8 @@ public class QGBuilderTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
builder = new QGBuilder(jobConfigData, buildDecision, jobExecutionService, jobConfigurationService, globalConfigDataForSonarInstance);
when(jobConfigurationService.checkProjectKeyIfVariable(any(), any(), any())).thenReturn(jobConfigData);
when(jobConfigData.getBuildStatus()).thenReturn(BuildStatusEnum.FAILED);
doReturn(printStream).when(buildListener).getLogger();
doReturn(printWriter).when(buildListener).error(anyString(), anyObject());
}
Expand Down
Expand Up @@ -8,22 +8,14 @@
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.quality.gates.jenkins.plugin.BuildDecision;
import org.quality.gates.jenkins.plugin.GlobalConfig;
import org.quality.gates.jenkins.plugin.GlobalConfigDataForSonarInstance;
import org.quality.gates.jenkins.plugin.JobConfigData;
import org.quality.gates.jenkins.plugin.JobConfigurationService;
import org.quality.gates.jenkins.plugin.JobExecutionService;
import org.quality.gates.jenkins.plugin.QGException;
import org.quality.gates.jenkins.plugin.QGPublisher;
import org.quality.gates.jenkins.plugin.enumeration.BuildStatusEnum;

import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.List;

import static org.junit.Assert.assertFalse;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyObject;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
Expand Down Expand Up @@ -76,8 +68,10 @@ public class QGPublisherTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
publisher = new QGPublisher(jobConfigData, buildDecision, jobExecutionService, jobConfigurationService, globalConfigDataForSonarInstance);
when(jobConfigurationService.checkProjectKeyIfVariable(any(), any(), any())).thenReturn(jobConfigData);
when(jobConfigData.getBuildStatus()).thenReturn(BuildStatusEnum.FAILED);
doReturn(printStream).when(buildListener).getLogger();
doReturn(printWriter).when(buildListener).error(anyString(), anyObject());
doReturn(printWriter).when(buildListener).error(anyString(), any());
}

@Test
Expand Down

0 comments on commit 94c560b

Please sign in to comment.