/** * Returns true if Hudson is building something or going to build something. */ public boolean isSomethingHappening() { if (!jenkins.getQueue().isEmpty()) return true; for (Computer n : jenkins.getComputers()) if (!n.isIdle()) return true; return false; }
/** * Returns true if Hudson is building something or going to build something. */ protected boolean isSomethingHappening() { if (!hudson.getQueue().isEmpty()) return true; for (Computer n : hudson.getComputers()) if (!n.isIdle()) return true; return false; }
/** * Returns true if Hudson is building something or going to build something. */ protected boolean isSomethingHappening() { if (!hudson.getQueue().isEmpty()) return true; for (Computer n : hudson.getComputers()) if (!n.isIdle()) return true; return false; }
/** * Returns true if Hudson is building something or going to build something. */ public boolean isSomethingHappening() { if (!jenkins.getQueue().isEmpty()) return true; for (Computer n : jenkins.getComputers()) if (!n.isIdle()) return true; return false; }
/** * Returns true if Hudson is building something or going to build something. */ protected boolean isSomethingHappening() { if (!jenkins.getQueue().isEmpty()) return true; for (Computer n : jenkins.getComputers()) if (!n.isIdle()) return true; return false; }
/** * Returns true if Hudson is building something or going to build something. */ public boolean isSomethingHappening() { if (!jenkins.getQueue().isEmpty()) return true; for (Computer n : jenkins.getComputers()) if (!n.isIdle()) return true; return false; }
/** * Returns true if Hudson is building something or going to build something. */ protected boolean isSomethingHappening() { if (!hudson.getQueue().isEmpty()) { return true; } for (Computer n : hudson.getComputers()) { if (!n.isIdle()) { return true; } } return false; }
@Override public void evaluate() throws Throwable { rebuildContext(story.j); assertThatWorkflowIsSuspended(); for (int i = 0; i < 600 && !Queue.getInstance().isEmpty(); i++) { Thread.sleep(100); } liveness(); SemaphoreStep.success("wait/1", null); story.j.assertBuildStatusSuccess(story.j.waitForCompletion(b)); } });
private static void assertNoTasksRunning(Jenkins j) { j.getQueue().maintain(); assert j.getQueue().isEmpty(); Computer[] computerList = j.getComputers(); for (Computer c : computerList) { List<Executor> executors = c.getExecutors(); for (Executor ex : executors) { if (ex.isBusy()) { Assert.fail("Computer "+c+" has an Executor "+ex+" still running a task: "+ex.getCurrentWorkUnit()); } } } }
/** Verifies all the assumptions about a cleanly finished build. */ static void assertCompletedCleanly(WorkflowRun run) throws Exception { while (run.isBuilding()) { Thread.sleep(100); // TODO seems to be unpredictable } Assert.assertNotNull(run.getResult()); FlowExecution fe = run.getExecution(); FlowExecutionList.get().forEach(f -> { if (fe != null && f == fe) { Assert.fail("FlowExecution still in FlowExecutionList!"); } }); Assert.assertTrue("Queue not empty after completion!", Queue.getInstance().isEmpty()); if (fe instanceof CpsFlowExecution) { CpsFlowExecution cpsExec = (CpsFlowExecution)fe; Assert.assertTrue(cpsExec.isComplete()); Assert.assertEquals(Boolean.TRUE, cpsExec.done); Assert.assertEquals(1, cpsExec.getCurrentHeads().size()); Assert.assertTrue(cpsExec.isComplete()); Assert.assertTrue(cpsExec.getCurrentHeads().get(0) instanceof FlowEndNode); Assert.assertTrue(cpsExec.startNodes == null || cpsExec.startNodes.isEmpty()); while (cpsExec.blocksRestart()) { Thread.sleep(100); // TODO ditto } } else { System.out.println("WARNING: no FlowExecutionForBuild"); } }
/** * Tests that event is properly removed if only one project is triggered * which is cancelled while in the queue. * * @throws Exception if something goes wrong */ @Test public void testCancelledQueueItemIsOnlyTriggeredProject() throws Exception { FreeStyleProject project = jenkinsRule.createFreeStyleProject(); PatchsetCreated event = Setup.createPatchsetCreated(); final GerritCause gerritCause = new GerritCause(event, false); ToGerritRunListener runListener = ToGerritRunListener.getInstance(); runListener.onTriggered(project, event); project.scheduleBuild2(QUIET_PERIOD, gerritCause); Item item = waitForBlockedItem(project, TIMEOUT_SECONDS); Queue queue = jenkinsRule.getInstance().getQueue(); queue.doCancelItem(item.getId()); assertThat(queue.isEmpty(), equalTo(true)); assertThat(project.getBuilds().size(), equalTo(0)); assertThat(runListener.isBuilding(event), equalTo(false)); }
/** * Returns true if Hudson is building something or going to build something. */ public boolean isSomethingHappeningIgnoringThreadDeath() { if (!r.jenkins.getQueue().isEmpty()) { return true; } for (Computer n : r.jenkins.getComputers()) { for (OneOffExecutor e : n.getOneOffExecutors()) { if (e.getCauseOfDeath() == null && e.isBusy()) { return true; } } for (Executor e : n.getExecutors()) { if (e.getCauseOfDeath() == null && e.isBusy()) { return true; } } } return false; }
/** * Tests that event is properly removed if only two different projects are triggered * and one of them is cancelled while in the queue. * * @throws Exception if something goes wrong */ @Test public void testCancelledOneQueueItemOfTwo() throws Exception { FreeStyleProject project = jenkinsRule.createFreeStyleProject(); FreeStyleProject project2 = jenkinsRule.createFreeStyleProject(); PatchsetCreated event = Setup.createPatchsetCreated(); final GerritCause gerritCause = new GerritCause(event, false); ToGerritRunListener runListener = ToGerritRunListener.getInstance(); runListener.onTriggered(project, event); runListener.onTriggered(project2, event); project.scheduleBuild2(QUIET_PERIOD, gerritCause); QueueTaskFuture<FreeStyleBuild> future2 = project2.scheduleBuild2(QUIET_PERIOD, gerritCause); Item item = waitForBlockedItem(project, TIMEOUT_SECONDS); Queue queue = jenkinsRule.getInstance().getQueue(); queue.doCancelItem(item.getId()); FreeStyleBuild build = future2.get(); assertThat(queue.isEmpty(), equalTo(true)); assertThat(project.getBuilds().size(), equalTo(0)); assertThat(project2.getBuilds().size(), equalTo(1)); assertThat(runListener.isBuilding(event), equalTo(false)); }
/** * Verify that we kill endlessly recursive NonCPS code cleanly and don't leave remnants. * This is a bit of extra caution to go along with {@link #endlessRecursion()} to ensure * we don't trigger other forms of failure with the StackOverflowError. */ @Test @Ignore /** Intermittent failures because triggers a longstanding unrelated SandboxResolvingClassloader bug resolved in https://github.com/jenkinsci/script-security-plugin/pull/160 */ public void endlessRecursionNonCPS() throws Exception { Assume.assumeTrue(!Functions.isWindows()); // Sidestep false failures specific to a few Windows build environments. String script = "@NonCPS def getThing(){return thing == null}; \n" + "node { echo getThing(); } "; WorkflowJob job = jenkins.jenkins.createProject(WorkflowJob.class, "recursion"); job.setDefinition(new CpsFlowDefinition(script, true)); // Should have failed with error about excessive recursion depth WorkflowRun r = jenkins.assertBuildStatus(Result.FAILURE, job.scheduleBuild2(0).get()); Assert.assertTrue("No queued FlyWeightTask for job should remain after failure", jenkins.jenkins.getQueue().isEmpty()); for (Computer c : jenkins.jenkins.getComputers()) { for (Executor ex : c.getExecutors()) { if (ex.isBusy()) { fail(ex.getCurrentExecutable().toString()); } } } }
/** * Verify that we kill endlessly recursive CPS code cleanly. */ @Test @Ignore /** Intermittent failures because triggers a longstanding unrelated SandboxResolvingClassloader bug resolved in https://github.com/jenkinsci/script-security-plugin/pull/160 */ public void endlessRecursion() throws Exception { Assume.assumeTrue(!Functions.isWindows()); // Sidestep false failures specific to a few Windows build environments. String script = "def getThing(){return thing == null}; \n" + "node { echo getThing(); } "; WorkflowJob job = jenkins.jenkins.createProject(WorkflowJob.class, "recursion"); job.setDefinition(new CpsFlowDefinition(script, true)); // Should have failed with error about excessive recursion depth WorkflowRun r = jenkins.assertBuildStatus(Result.FAILURE, job.scheduleBuild2(0).get()); jenkins.assertLogContains("look for unbounded recursion", r); Assert.assertTrue("No queued FlyWeightTask for job should remain after failure", jenkins.jenkins.getQueue().isEmpty()); for (Computer c : jenkins.jenkins.getComputers()) { for (Executor ex : c.getExecutors()) { if (ex.isBusy()) { fail(ex.getCurrentExecutable().toString()); } } } }