Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,41 @@ public class JiraEnvironmentContributingAction extends InvisibleAction implement

private final String issuesList;

private final Integer issuesSize;

private final String jiraUrl;

private final String issuesSizeVariableName;

public String getIssuesList() {
return issuesList;
}

public Integer getNumberOfIssues() {
return issuesSize;
}

public String getJiraUrl() {
return jiraUrl;
}

public JiraEnvironmentContributingAction(String issuesList, String jiraUrl) {
public String getIssuesSizeVariableName() {
return issuesSizeVariableName;
}

public JiraEnvironmentContributingAction(
String issuesList, int issuesSize, String jiraUrl, String issuesSizeVariableName) {
this.issuesList = issuesList;
this.issuesSize = issuesSize;
this.jiraUrl = jiraUrl;
this.issuesSizeVariableName = issuesSizeVariableName;
}

@Override
public void buildEnvVars(AbstractBuild<?, ?> ab, EnvVars ev) {
if (ev != null) {
ev.put(ISSUES_VARIABLE_NAME, issuesList);
ev.put(getIssuesSizeVariableName(), getNumberOfIssues().toString());
ev.put(JIRA_URL_VARIABLE_NAME, getJiraUrl());
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package hudson.plugins.jira;

import hudson.AbortException;
import hudson.Extension;
import hudson.Launcher;
import hudson.model.AbstractBuild;
Expand All @@ -12,6 +11,7 @@
import hudson.tasks.Builder;
import java.io.IOException;
import java.util.Set;
import jenkins.model.Jenkins;
import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;

Expand All @@ -21,10 +21,12 @@
public class JiraEnvironmentVariableBuilder extends Builder {

private AbstractIssueSelector issueSelector;
private final String issuesSizeVariableName;

@DataBoundConstructor
public JiraEnvironmentVariableBuilder(AbstractIssueSelector issueSelector) {
public JiraEnvironmentVariableBuilder(AbstractIssueSelector issueSelector, String issuesSizeVariableName) {
this.issueSelector = issueSelector;
this.issuesSizeVariableName = issuesSizeVariableName;
}

public AbstractIssueSelector getIssueSelector() {
Expand All @@ -35,6 +37,10 @@
return (this.issueSelector = uis);
}

String getIssuesSizeVariableName() {
return issuesSizeVariableName;
}

JiraSite getSiteForProject(AbstractProject<?, ?> project) {
return JiraSite.get(project);
}
Expand All @@ -46,18 +52,23 @@
JiraSite site = getSiteForProject(build.getProject());

if (site == null) {
throw new AbortException(Messages.JiraEnvironmentVariableBuilder_NoJiraSite());
listener.getLogger().println(Messages.JiraEnvironmentVariableBuilder_NoJiraSite());
return false;
}

Set<String> ids = getIssueSelector().findIssueIds(build, site, listener);

String idList = StringUtils.join(ids, ",");
Integer idListSize = ids != null ? ids.size() : null;

Check warning on line 62 in src/main/java/hudson/plugins/jira/JiraEnvironmentVariableBuilder.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 62 is only partially covered, one branch is missing

listener.getLogger()
.println(Messages.JiraEnvironmentVariableBuilder_Updating(
JiraEnvironmentContributingAction.ISSUES_VARIABLE_NAME, idList));
listener.getLogger()
.println(Messages.JiraEnvironmentVariableBuilder_Updating(getIssuesSizeVariableName(), idListSize));

build.addAction(new JiraEnvironmentContributingAction(idList, site.getName()));
build.addAction(
new JiraEnvironmentContributingAction(idList, idListSize, site.getName(), getIssuesSizeVariableName()));

Check warning on line 71 in src/main/java/hudson/plugins/jira/JiraEnvironmentVariableBuilder.java

View check run for this annotation

ci.jenkins.io / SpotBugs

NP_NULL_ON_SOME_PATH

NORMAL: Possible null pointer dereference of null in hudson.plugins.jira.JiraEnvironmentVariableBuilder.perform(AbstractBuild, Launcher, BuildListener)
Raw output
<p> There is a branch of statement that, <em>if executed,</em> guarantees that a null value will be dereferenced, which would generate a <code>NullPointerException</code> when the code is executed. Of course, the problem might be that the branch or statement is infeasible and that the null pointer exception can't ever be executed; deciding that is beyond the ability of SpotBugs. </p>

return true;
}
Expand All @@ -77,5 +88,9 @@
public String getDisplayName() {
return Messages.JiraEnvironmentVariableBuilder_DisplayName();
}

public boolean hasIssueSelectors() {
return Jenkins.get().getDescriptorList(AbstractIssueSelector.class).size() > 1;

Check warning on line 93 in src/main/java/hudson/plugins/jira/JiraEnvironmentVariableBuilder.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 93 is not covered by tests
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,10 @@
<j:jelly xmlns:j="jelly:core" xmlns:f="/lib/form">
<j:if test="${descriptor.hasIssueSelectors()}">
<f:dropdownDescriptorSelector field="issueSelector" title="${%Issue selector}"/>
</j:if>
</j:if>
<f:advanced>
<f:entry title="${%Issues size variable name}" field="issuesSizeVariableName">
<f:textbox default="JIRA_ISSUES_SIZE"/>
</f:entry>
</f:advanced>
</j:jelly>
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<div>Available variables:</div>
<ul>
<li>JIRA_ISSUES - A comma separated list of issues which are referenced in the version control system changelog</li>
<li>JIRA_ISSUES_SIZE - Size of the list described above</li>
<li>JIRA_URL - Primary URL for the Jira server </li>
</ul>
<p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,33 +15,40 @@ class JiraEnvironmentContributingActionTest {
private static final String JIRA_URL = "http://example.com";
private static final String JIRA_URL_PROPERTY_NAME = "JIRA_URL";
private static final String ISSUES_PROPERTY_NAME = "JIRA_ISSUES";
private static final String ISSUES_SIZE_PROPERTY_NAME = "JIRA_ISSUES_SIZE";
private static final String ISSUES_LIST = "ISS-1,ISS-2";
private static final Integer ISSUES_SIZE = 2;

@Test
void buildEnvVarsEnvIsNull() {
JiraEnvironmentContributingAction action = new JiraEnvironmentContributingAction(ISSUES_LIST, JIRA_URL);
public void buildEnvVarsEnvIsNull() {
JiraEnvironmentContributingAction action =
new JiraEnvironmentContributingAction(ISSUES_LIST, ISSUES_SIZE, JIRA_URL, ISSUES_SIZE_PROPERTY_NAME);
AbstractBuild build = mock(AbstractBuild.class);

action.buildEnvVars(build, null);
// just expecting no exception
}

@Test
void buildEnvVarsAddVariables() {
JiraEnvironmentContributingAction action = new JiraEnvironmentContributingAction(ISSUES_LIST, JIRA_URL);
public void buildEnvVarsAddVariables() {
JiraEnvironmentContributingAction action =
new JiraEnvironmentContributingAction(ISSUES_LIST, ISSUES_SIZE, JIRA_URL, ISSUES_SIZE_PROPERTY_NAME);
AbstractBuild build = mock(AbstractBuild.class);
EnvVars envVars = mock(EnvVars.class);

action.buildEnvVars(build, envVars);

ArgumentCaptor<String> keys = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<String> values = ArgumentCaptor.forClass(String.class);
verify(envVars, times(2)).put(keys.capture(), values.capture());
verify(envVars, times(3)).put(keys.capture(), values.capture());

assertThat(keys.getAllValues().get(0), is(ISSUES_PROPERTY_NAME));
assertThat(values.getAllValues().get(0), is(ISSUES_LIST));

assertThat(keys.getAllValues().get(1), is(JIRA_URL_PROPERTY_NAME));
assertThat(values.getAllValues().get(1), is(JIRA_URL));
assertThat(keys.getAllValues().get(1), is(ISSUES_SIZE_PROPERTY_NAME));
assertThat(values.getAllValues().get(1), is(ISSUES_SIZE.toString()));

assertThat(keys.getAllValues().get(2), is(JIRA_URL_PROPERTY_NAME));
assertThat(values.getAllValues().get(2), is(JIRA_URL));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,13 @@
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import hudson.AbortException;
import hudson.EnvVars;
import hudson.Launcher;
import hudson.model.AbstractBuild;
Expand All @@ -35,6 +34,7 @@ class JiraEnvironmentVariableBuilderTest {
private static final String JIRA_URL = "http://example.com";
private static final String JIRA_URL_PROPERTY_NAME = "JIRA_URL";
private static final String ISSUES_PROPERTY_NAME = "JIRA_ISSUES";
private static final String ISSUES_SIZE_PROPERTY_NAME = "JIRA_ISSUES_SIZE";
private static final String ISSUE_ID_1 = "ISS-1";
private static final String ISSUE_ID_2 = "ISS-2";

Expand Down Expand Up @@ -76,28 +76,36 @@ void createMocks() throws IOException, InterruptedException {
}

@Test
void issueSelectorDefaultsToDefault() {
final JiraEnvironmentVariableBuilder builder = new JiraEnvironmentVariableBuilder(null);
public void testIssueSelectorDefaultsToDefault() {
final JiraEnvironmentVariableBuilder builder = new JiraEnvironmentVariableBuilder(null, null);
assertThat(builder.getIssueSelector(), instanceOf(DefaultIssueSelector.class));
}

@Test
void setIssueSelectorPersists() {
final JiraEnvironmentVariableBuilder builder = new JiraEnvironmentVariableBuilder(issueSelector);
public void testSetIssueSelectorPersists() {
final JiraEnvironmentVariableBuilder builder = new JiraEnvironmentVariableBuilder(issueSelector, null);
assertThat(builder.getIssueSelector(), is(issueSelector));
}

@Test
void performWithNoSiteFailsBuild() {
JiraEnvironmentVariableBuilder builder = spy(new JiraEnvironmentVariableBuilder(issueSelector));
doReturn(null).when(builder).getSiteForProject(Mockito.any());
assertThrows(AbortException.class, () -> builder.perform(build, launcher, listener));
public void testSetIssuesSizeVariableNamePersists() {
final JiraEnvironmentVariableBuilder builder =
new JiraEnvironmentVariableBuilder(issueSelector, ISSUES_SIZE_PROPERTY_NAME);
assertThat(builder.getIssuesSizeVariableName(), is(ISSUES_SIZE_PROPERTY_NAME));
}

@Test
void performAddsAction() throws InterruptedException, IOException {
JiraEnvironmentVariableBuilder builder = spy(new JiraEnvironmentVariableBuilder(issueSelector));
doReturn(site).when(builder).getSiteForProject(Mockito.any());
public void testPerformWithNoSiteFailsBuild() throws InterruptedException, IOException {
JiraEnvironmentVariableBuilder builder = spy(new JiraEnvironmentVariableBuilder(issueSelector, null));
doReturn(null).when(builder).getSiteForProject((AbstractProject<?, ?>) Mockito.any());
assertThat(builder.perform(build, launcher, listener), is(false));
verify(logger, times(1)).println(Messages.JiraEnvironmentVariableBuilder_NoJiraSite());
}

@Test
public void testPerformAddsAction() throws InterruptedException, IOException {
JiraEnvironmentVariableBuilder builder = spy(new JiraEnvironmentVariableBuilder(issueSelector, null));
doReturn(site).when(builder).getSiteForProject((AbstractProject<?, ?>) Mockito.any());

boolean result = builder.perform(build, launcher, listener);

Expand Down
Loading