diff --git a/src/main/java/org/jenkinsci/plugins/workflow/multibranch/ResolveScmStep.java b/src/main/java/org/jenkinsci/plugins/workflow/multibranch/ResolveScmStep.java index 11b70e8a..d724ab84 100644 --- a/src/main/java/org/jenkinsci/plugins/workflow/multibranch/ResolveScmStep.java +++ b/src/main/java/org/jenkinsci/plugins/workflow/multibranch/ResolveScmStep.java @@ -39,6 +39,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import jenkins.scm.api.SCMHead; import jenkins.scm.api.SCMHeadObserver; @@ -90,6 +91,10 @@ public class ResolveScmStep extends Step { @DataBoundConstructor public ResolveScmStep(@NonNull SCMSource source, @NonNull List targets) { this.source = source; + // JENKINS-67005: Pipeline passes null when targets is omitted from the step call. + Objects.requireNonNull( + targets, + "targets is required; provide candidate branch names, e.g. targets: [env.BRANCH_NAME, 'main']"); this.targets = new ArrayList<>(targets); } diff --git a/src/test/java/org/jenkinsci/plugins/workflow/multibranch/ResolveScmStepTest.java b/src/test/java/org/jenkinsci/plugins/workflow/multibranch/ResolveScmStepTest.java index b339ea9f..75120e7e 100644 --- a/src/test/java/org/jenkinsci/plugins/workflow/multibranch/ResolveScmStepTest.java +++ b/src/test/java/org/jenkinsci/plugins/workflow/multibranch/ResolveScmStepTest.java @@ -25,10 +25,12 @@ package org.jenkinsci.plugins.workflow.multibranch; +import hudson.model.Result; import hudson.model.TopLevelItem; import jenkins.scm.impl.mock.MockSCMController; import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; import org.jenkinsci.plugins.workflow.job.WorkflowJob; +import org.jenkinsci.plugins.workflow.job.WorkflowRun; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; @@ -121,4 +123,20 @@ public void given_nonExistingHeadName_when_invokedWithDefault_then_defaultReturn j.buildAndAssertSuccess(job); } } + + @Test + public void given_targetsOmitted_when_invoked_then_failsWithClearMessage() throws Exception { + try (MockSCMController c = MockSCMController.create()) { + c.createRepository("repo"); + WorkflowJob job = j.jenkins.createProject(WorkflowJob.class, "workflow"); + job.setDefinition(new CpsFlowDefinition("node {\n" + + " resolveScm source: mockScm(controllerId:'" + + c.getId() + + "', repository:'repo', traits: [discoverBranches()])\n" + + "}", true)); + WorkflowRun b = j.assertBuildStatus(Result.FAILURE, job.scheduleBuild2(0)); + j.assertLogContains("targets is required", b); + } + } + }