@Test public void compilationErrorsCanBeSerialized() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition( "node {\n" + " writeFile text: 'bad, syntax', file: 'test.groovy'\n" + " try {\n" + " load('test.groovy')\n" + " } catch (e) {\n" + " sleep(time: 1, unit: 'MILLISECONDS')\n" + // Force the exception to be persisted. " throw e\n" + " }\n" + "}", true)); WorkflowRun b = r.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0)); r.assertLogNotContains(NotSerializableException.class.getName(), b); r.assertLogNotContains(MultipleCompilationErrorsException.class.getName(), b); r.assertLogContains(CpsCompilationErrorsException.class.getName(), b); r.assertLogContains("unexpected token: bad", b); }
/** * Split arguments between meta step and state, when argument is colliding */ @Issue("JENKINS-29922") @Test public void dollar_class_must_die_colliding_argument() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "die5"); p.setDefinition(new CpsFlowDefinition("newYork motto:'Empire', moderate:true", true)); WorkflowRun run = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); assertThat(JenkinsRule.getLog(run).replace("\r\n", "\n"), containsString("Introducing newYork\nThe Empire State")); r.assertLogNotContains("New York can be moderate in spring or fall", run); }
@Issue("JENKINS-46894") @Test public void BuildStatusWhenWithTimeTriggerSkipped() throws Exception { WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, "buildStatusWhenTimerTriggerSkipped"); p.setDefinition(new CpsFlowDefinition(pipelineSourceFromResources("buildStatusWhenSCMTrigger"), true)); // get the build going, and wait until workflow pauses WorkflowRun b = p.scheduleBuild2(0, new CauseAction(new TimerTriggerCause())) .getStartCondition().get(); j.waitForCompletion(b); j.assertLogContains("Stage \"Two\" skipped due to when conditional",b); j.assertLogNotContains("World", b); j.assertLogNotContains("Heal it", b); }
@Issue("JENKINS-46894") @Test public void BuildStatusWhenWithUserIdCauseShouldBeSkipped() throws Exception { WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, "buildStatusWhenUserIdCauseSkipped"); p.setDefinition(new CpsFlowDefinition(pipelineSourceFromResources("buildStatusWhenUserIdCause"), true)); // get the build going, and wait until workflow pauses WorkflowRun b = p.scheduleBuild2(0, new CauseAction(new UserIdCause("virginia")) ).getStartCondition().get(); j.waitForCompletion(b); j.assertLogContains("Stage \"Two\" skipped due to when conditional",b); j.assertLogNotContains("World", b); j.assertLogNotContains("Heal it", b); } @Issue("JENKINS-46894")
@Issue("JENKINS-46894") @Test public void BuildStatusWhenWithSCMTriggerSkipped() throws Exception { WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, "buildStatusWhenSCMTriggerSkipped"); p.setDefinition(new CpsFlowDefinition(pipelineSourceFromResources("buildStatusWhenTimerTrigger"), true)); // get the build going, and wait until workflow pauses WorkflowRun b = p.scheduleBuild2(0, new CauseAction(new SCMTriggerCause("polling")) ).getStartCondition().get(); j.waitForCompletion(b); j.assertLogContains("Stage \"Two\" skipped due to when conditional",b); j.assertLogNotContains("World", b); j.assertLogNotContains("Heal it", b); } @Issue("JENKINS-46894")
@Issue("JENKINS-50880") @Test public void whenBeforeInputFalse() throws Exception { String whenFile = "whenBeforeInputFalse"; WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, whenFile); p.setDefinition(new CpsFlowDefinition(pipelineSourceFromResources(whenFile), true)); // get the build going, and wait until workflow pauses QueueTaskFuture<WorkflowRun> q = p.scheduleBuild2(0); WorkflowRun b = q.getStartCondition().get(); CpsFlowExecution e = (CpsFlowExecution) b.getExecutionPromise().get(); j.assertBuildStatusSuccess(j.waitForCompletion(b)); j.assertLogNotContains("X-NO-SHOW-X", b); }
@Test public void fullyQualifiedAmbiguousStep() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition( "'org.jenkinsci.plugins.workflow.testMetaStep.AmbiguousEchoLowerStep' 'HeLlO'\n" + "'org.jenkinsci.plugins.workflow.testMetaStep.AmbiguousEchoUpperStep' 'GoOdByE'", true)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("hello", b); r.assertLogContains("GOODBYE", b); r.assertLogNotContains("Warning: Invoking ambiguous Pipeline Step", b); }
@Override public void evaluate() throws Throwable { WorkflowJob p = story.j.jenkins.getItemByFullName("p", WorkflowJob.class); WorkflowRun b3 = p.getLastBuild(); assertEquals(3, b3.getNumber()); // Resume #3, and verify that the build completes with the expected replacements. SemaphoreStep.success("wait/3", null); story.j.waitForCompletion(b3); story.j.assertLogNotContains("trying edits", b3); story.j.assertLogContains("new first part", b3); story.j.assertLogContains("newer second part", b3); } });
@Issue("SECURITY-1186") @Test public void finalizer() throws Exception { WorkflowJob p = jenkins.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("class Foo {\n" + " @Override public void finalize() {\n" + " }\n" + "}\n" + "echo 'Should never get here'", true)); WorkflowRun b = jenkins.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0)); jenkins.assertLogContains("Object.finalize()", b); jenkins.assertLogNotContains("Should never get here", b); }
/** * Tests the {@link GerritTriggerParameters.ParameterMode#NONE} setting * for {@link GerritTrigger#commentTextParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.CommentAdded} event. * * @throws Exception if so */ @Test public void testCommentTextParameterModeNone() throws Exception { trigger.setCommentTextParameterMode(GerritTriggerParameters.ParameterMode.NONE); trigger.getTriggerOnEvents().add(new PluginCommentAddedEvent("Code-Review", "1")); String expected = "Triggering comment"; CommentAdded event = Setup.createCommentAdded(); event.setComment(expected); PluginImpl.getHandler_().triggerEvent(event); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); j.assertLogNotContains(GerritTriggerParameters.GERRIT_EVENT_COMMENT_TEXT.name(), build); }
@Issue("JENKINS-33273") @Test public void lightweight() throws Exception { sampleRepo.init(); sampleRepo.write("flow.groovy", "echo 'version one'"); sampleRepo.git("add", "flow.groovy"); sampleRepo.git("commit", "--message=init"); WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); GitStep step = new GitStep(sampleRepo.toString()); CpsScmFlowDefinition def = new CpsScmFlowDefinition(step.createSCM(), "flow.groovy"); def.setLightweight(true); p.setDefinition(def); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogNotContains("Cloning the remote Git repository", b); r.assertLogNotContains("Retrying after 10 seconds", b); r.assertLogContains("Obtained flow.groovy from git " + sampleRepo, b); r.assertLogContains("version one", b); }
@Issue("JENKINS-46894") @Test public void BuildStatusWhenWithSCMTrigger() throws Exception { WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, "buildStatusWhenSCMTrigger"); p.setDefinition(new CpsFlowDefinition(pipelineSourceFromResources("buildStatusWhenSCMTrigger"), true)); // get the build going, and wait until workflow pauses WorkflowRun b = p.scheduleBuild2(0, new CauseAction(new SCMTriggerCause("polling")) ).getStartCondition().get(); j.waitForCompletion(b); j.assertLogNotContains("Stage \"Two\" skipped due to when conditional",b); j.assertLogContains("World", b); j.assertLogContains("Heal it", b); }
@Issue("JENKINS-46894") @Test public void BuildStatusWhenWithTimeTrigger() throws Exception { WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, "buildStatusWhenTimerTrigger"); p.setDefinition(new CpsFlowDefinition(pipelineSourceFromResources("buildStatusWhenTimerTrigger"), true)); // get the build going, and wait until workflow pauses WorkflowRun b = p.scheduleBuild2(0, new CauseAction(new TimerTriggerCause())) .getStartCondition().get(); j.waitForCompletion(b); j.assertLogNotContains("Stage \"Two\" skipped due to when conditional",b); j.assertLogContains("World", b); j.assertLogContains("Heal it", b); }
@Test public void stop() throws Exception { WorkflowJob p = r.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("unkillable()", true)); final WorkflowRun b = p.scheduleBuild2(0).waitForStart(); r.waitForMessage("unkillable", b); try (ACLContext context = ACL.as(Jenkins.ANONYMOUS)) { b.getExecutor().interrupt(); }; r.waitForCompletion(b); r.assertBuildStatus(Result.ABORTED, b); InterruptedBuildAction iba = b.getAction(InterruptedBuildAction.class); assertNotNull(iba); List<CauseOfInterruption> causes = iba.getCauses(); assertEquals(1, causes.size()); assertEquals(CauseOfInterruption.UserInterruption.class, causes.get(0).getClass()); r.waitForMessage("Finished: ABORTED", b); // TODO JENKINS-46076 WorkflowRun.isBuilding() can go to false before .finish has completed r.assertLogContains("never going to stop", b); r.assertLogNotContains("\tat ", b); }
/** * Tests the {@link GerritTriggerParameters.ParameterMode#NONE} setting * for {@link GerritTrigger#commitMessageParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated} event. * * @throws Exception if so */ @Test public void testCommitMessageParameterModeNone() throws Exception { trigger.setCommitMessageParameterMode(GerritTriggerParameters.ParameterMode.NONE); String expected = "A new commit has arrived!"; PatchsetCreated event = Setup.createPatchsetCreated(); event.getChange().setCommitMessage(expected); PluginImpl.getHandler_().triggerEvent(event); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); j.assertLogNotContains(GerritTriggerParameters.GERRIT_CHANGE_COMMIT_MESSAGE.name(), build); }
/** * Tests the {@link GerritTriggerParameters.ParameterMode#NONE} setting * for {@link GerritTrigger#changeSubjectParameterMode} when the build is triggered by a * {@link com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated} event. * * @throws Exception if so */ @Test public void testChangeSubjectParameterModeNone() throws Exception { trigger.setChangeSubjectParameterMode(GerritTriggerParameters.ParameterMode.NONE); String expected = "A new commit has arrived!"; PatchsetCreated event = Setup.createPatchsetCreated(); event.getChange().setSubject(expected); PluginImpl.getHandler_().triggerEvent(event); j.waitUntilNoActivity(); FreeStyleBuild build = job.getLastBuild(); j.assertLogNotContains(GerritTriggerParameters.GERRIT_CHANGE_SUBJECT.name(), build); }
@Issue("JENKINS-45455") @Test public void isRestartedRunCondition() throws Exception { WorkflowRun original = expect("restart", "isRestartedRunCondition") .logContains("This shouldn't show up on second run") .logNotContains("This should only run on restart") .go(); WorkflowJob p = original.getParent(); HtmlPage redirect = restartFromStageInUI(original, "restart"); assertNotNull(redirect); assertEquals(p.getAbsoluteUrl(), redirect.getUrl().toString()); j.waitUntilNoActivity(); WorkflowRun b2 = p.getBuildByNumber(2); assertNotNull(b2); j.assertBuildStatusSuccess(b2); j.assertLogContains("This should only run on restart", b2); j.assertLogNotContains("This shouldn't show up on second run", b2); }
@Issue("JENKINS-48752") @Test public void changedAndNotSuccess() throws Exception { WorkflowRun b = getAndStartNonRepoBuild("postOnChangeFailed"); j.assertBuildStatus(Result.FAILURE, j.waitForCompletion(b)); j.assertLogContains("[Pipeline] { (foo)", b); j.assertLogContains("I FAILED", b); WorkflowJob job = b.getParent(); job.setDefinition(new CpsFlowDefinition(pipelineSourceFromResources("postOnChangeUnstable"), true)); WorkflowRun b2 = j.assertBuildStatus(Result.UNSTABLE, j.waitForCompletion(job.scheduleBuild2(0).get())); j.assertLogContains("[Pipeline] { (foo)", b2); j.assertLogContains("hello", b2); j.assertLogContains("I CHANGED", b2); // Now make sure we don't get any alert this time. WorkflowRun b3 = j.assertBuildStatus(Result.UNSTABLE, j.waitForCompletion(job.scheduleBuild2(0).get())); j.assertLogContains("[Pipeline] { (foo)", b3); j.assertLogContains("hello", b3); j.assertLogNotContains("I CHANGED", b3); j.assertLogNotContains("I FAILED", b3); }
@Test public void basics() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); CpsScmFlowDefinition def = new CpsScmFlowDefinition(new SingleFileSCM("flow.groovy", "echo 'hello from SCM'"), "flow.groovy"); def.setLightweight(false); // currently the default, but just to be clear that we do rely on that in this test p.setDefinition(def); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); // TODO currently the log text is in Run.log, but not on FlowStartNode/LogAction, so not visible from Workflow Steps etc. r.assertLogContains("hello from SCM", b); r.assertLogContains("Staging flow.groovy", b); r.assertLogNotContains("Retrying after 10 seconds", b); FlowGraphWalker w = new FlowGraphWalker(b.getExecution()); int workspaces = 0; for (FlowNode n : w) { if (n.getAction(WorkspaceAction.class) != null) { workspaces++; } } assertEquals(1, workspaces); }
@Issue("JENKINS-29881") @Test public void emptyChangeLogEmptyChangeSets() throws Exception { sampleRepo.init(); sampleRepo.write("flow.groovy", "echo 'version one'"); sampleRepo.git("add", "flow.groovy"); sampleRepo.git("commit", "--message=init"); WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); CpsScmFlowDefinition def = new CpsScmFlowDefinition(new GitStep(sampleRepo.toString()).createSCM(), "flow.groovy"); def.setLightweight(false); p.setDefinition(def); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("Cloning the remote Git repository", b); r.assertLogContains("version one", b); r.assertLogNotContains("Retrying after 10 seconds", b); b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); assertEquals(2, b.number); List<ChangeLogSet<? extends ChangeLogSet.Entry>> changeSets = b.getChangeSets(); assertEquals(Collections.emptyList(), changeSets); }