use of org.jenkinsci.plugins.workflow.job.WorkflowRun in project blueocean-plugin by jenkinsci.
the class SseEventTest method multiBranchJobEvents.
@Test
public void multiBranchJobEvents() throws Exception {
setupScm();
final OneShotEvent success = new OneShotEvent();
// index: 0 QUEUED, index 1: ALLOCATED, index: 2 INDEXING, index: 3 COMPLETED
final boolean[] mbpStatus = { false, false, false, false };
// index: 0 created, index: 1 QUEUED, index 2: ALLOCATED, index: 3 RUNNING, index: 4 SUCCESS
final boolean[] masterBranchStatus = { false, false, false, false, false };
final boolean[] feature1BranchStatus = { false, false, false, false, false };
final boolean[] masterBranchPipelineEvent = { false };
final boolean[] feature1BranchPipelineEvent = { false };
final boolean[] masterBranchNodeBlockEvent = { false };
final boolean[] feature1BranchNodeBlockEvent = { false };
final AssertionHelper assertionHelper = new AssertionHelper();
SSEConnection con = new SSEConnection(j.getURL(), "me", new ChannelSubscriber() {
@Override
public void onMessage(@Nonnull Message message) {
System.out.println(message);
if ("job".equals(message.get(jenkins_channel))) {
if ("org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject".equals(message.get(jenkins_object_type))) {
assertionHelper.isEquals("/blue/rest/organizations/jenkins/pipelines/pipeline1/", message.get(blueocean_job_rest_url));
// assertEquals("/blue/rest/organizations/jenkins/pipelines/pipeline1/", message.get(blueocean_job_rest_url));
assertionHelper.isEquals("pipeline1", message.get(blueocean_job_pipeline_name));
assertionHelper.isEquals("job", message.get(jenkins_channel));
assertionHelper.isEquals("jenkins", message.get(jenkins_org));
assertionHelper.isEquals("true", message.get(job_ismultibranch));
assertionHelper.isEquals("pipeline1", message.get(job_name));
assertionHelper.isNull(message.get(job_orgfolder_indexing_status));
assertionHelper.isNull(message.get(job_orgfolder_indexing_result));
if ("QUEUED".equals(message.get(job_run_status))) {
// queued
mbpStatus[0] = true;
}
if ("ALLOCATED".equals(message.get(job_run_status))) {
// allocated or left queue
mbpStatus[1] = true;
}
if ("INDEXING".equals(message.get(job_multibranch_indexing_status))) {
// indexing started
mbpStatus[2] = true;
assertionHelper.isNotNull(message.get(job_run_queueId));
}
if ("SUCCESS".equals(message.get(job_multibranch_indexing_result)) || ("COMPLETED".equals(message.get(job_multibranch_indexing_status)) && "job_run_queue_task_complete".equals(message.get(jenkins_event)))) {
// indexing completed
mbpStatus[3] = true;
}
} else if ("org.jenkinsci.plugins.workflow.job.WorkflowJob".equals(message.get(jenkins_object_type))) {
assertionHelper.isEquals("pipeline1", message.get(blueocean_job_pipeline_name));
if ("pipeline1/master".equals(message.get(job_name))) {
System.out.println("job_run_status::::: " + message.get(job_run_status));
assertionHelper.isEquals("/blue/rest/organizations/jenkins/pipelines/pipeline1/branches/master/", message.get(blueocean_job_rest_url));
assertionHelper.isEquals("master", message.get(blueocean_job_branch_name));
if ("job_crud_created".equals(message.get(jenkins_event))) {
masterBranchStatus[0] = true;
}
if ("QUEUED".equals(message.get(job_run_status))) {
masterBranchStatus[1] = true;
} else if ("ALLOCATED".equals(message.get(job_run_status))) {
masterBranchStatus[2] = true;
} else if ("RUNNING".equals(message.get(job_run_status))) {
System.out.println("in master running.....");
assertionHelper.isEquals("1", message.get(blueocean_queue_item_expected_build_number));
masterBranchStatus[3] = true;
}
if ("SUCCESS".equals(message.get(job_run_status)) || "job_run_queue_task_complete".equals(message.get(jenkins_event))) {
masterBranchStatus[4] = true;
}
} else if ("pipeline1/feature%2Fux-1".equals(message.get(job_name))) {
assertionHelper.isEquals("/blue/rest/organizations/jenkins/pipelines/pipeline1/branches/feature%252Fux-1/", message.get(blueocean_job_rest_url));
assertionHelper.isEquals("feature%2Fux-1", message.get(blueocean_job_branch_name));
if ("job_crud_created".equals(message.get(jenkins_event))) {
feature1BranchStatus[0] = true;
}
System.out.println("job_run_status::::: " + message.get(job_run_status));
if ("QUEUED".equals(message.get(job_run_status))) {
feature1BranchStatus[1] = true;
} else if ("ALLOCATED".equals(message.get(job_run_status))) {
feature1BranchStatus[2] = true;
}
if ("SUCCESS".equals(message.get(job_run_status)) || "job_run_queue_task_complete".equals(message.get(jenkins_event))) {
feature1BranchStatus[4] = true;
}
}
} else if ("org.jenkinsci.plugins.workflow.job.WorkflowRun".equals(message.get(jenkins_object_type))) {
if ("pipeline1/master".equals(message.get(job_name))) {
if ("RUNNING".equals(message.get(job_run_status))) {
assertionHelper.isEquals("1", message.get(blueocean_queue_item_expected_build_number));
masterBranchStatus[3] = true;
}
} else if ("pipeline1/feature%2Fux-1".equals(message.get(job_name))) {
if ("RUNNING".equals(message.get(job_run_status))) {
assertionHelper.isEquals("1", message.get(blueocean_queue_item_expected_build_number));
feature1BranchStatus[3] = true;
}
}
}
// all completed
if (mbpStatus[3] && masterBranchStatus[4] && feature1BranchStatus[4]) {
success.signal();
}
} else if ("pipeline".equals(message.get(jenkins_channel))) {
if ("pipeline1/master".equals(message.get(pipeline_job_name))) {
assertionHelper.isEquals("1", message.get(pipeline_run_id));
masterBranchPipelineEvent[0] = true;
if ("pipeline_step".equals(message.get(jenkins_event)) && "node".equals(message.get(pipeline_step_name))) {
masterBranchNodeBlockEvent[0] = true;
}
} else if ("pipeline1/feature%2Fux-1".equals(message.get(pipeline_job_name))) {
feature1BranchPipelineEvent[0] = true;
assertionHelper.isEquals("1", message.get(pipeline_run_id));
if ("pipeline_step".equals(message.get(jenkins_event)) && "node".equals(message.get(pipeline_step_name))) {
feature1BranchNodeBlockEvent[0] = true;
}
}
if ("pipeline_stage".equals(message.get(jenkins_event))) {
assertionHelper.isNotNull(message.get(pipeline_step_stage_name));
assertionHelper.isEquals("build", message.get(pipeline_step_stage_name));
assertionHelper.isNotNull(message.get(pipeline_step_flownode_id));
} else if ("pipeline_step".equals(message.get(jenkins_event))) {
assertionHelper.isNotNull(message.get(pipeline_step_flownode_id));
assertionHelper.isEquals("false", message.get(pipeline_step_is_paused));
}
}
}
});
con.subscribe("pipeline");
con.subscribe("job");
final WorkflowMultiBranchProject mp = j.jenkins.createProject(WorkflowMultiBranchProject.class, "pipeline1");
mp.getSourcesList().add(new BranchSource(new GitSCMSource(null, sampleRepo.toString(), "", "*", "", false), new DefaultBranchPropertyStrategy(new BranchProperty[0])));
for (SCMSource source : mp.getSCMSources()) {
assertEquals(mp, source.getOwner());
}
mp.scheduleBuild2(0).getFuture().get();
WorkflowJob p = mp.getItem("master");
if (p == null) {
mp.getIndexing().writeWholeLogTo(System.out);
fail("master project not found");
}
j.waitUntilNoActivity();
WorkflowRun b1 = p.getLastBuild();
assertEquals(1, b1.getNumber());
assertEquals(2, mp.getItems().size());
success.block(5000);
con.close();
if (success.isSignaled()) {
assertTrue(masterBranchPipelineEvent[0]);
assertTrue(feature1BranchPipelineEvent[0]);
assertTrue(masterBranchNodeBlockEvent[0]);
assertTrue(feature1BranchNodeBlockEvent[0]);
assertArrayEquals(mbpStatus, new boolean[] { true, true, true, true });
assertArrayEquals(masterBranchStatus, new boolean[] { true, true, true, true, true });
assertArrayEquals(feature1BranchStatus, new boolean[] { true, true, true, true, true });
}
if (assertionHelper.totalErrors() > 0) {
fail("There were errors: " + assertionHelper.totalErrors());
}
}
use of org.jenkinsci.plugins.workflow.job.WorkflowRun in project blueocean-plugin by jenkinsci.
the class SseEventTest method pipelineWithInput.
@Test
public void pipelineWithInput() throws IOException, ExecutionException, InterruptedException, TimeoutException {
final OneShotEvent success = new OneShotEvent();
String script = "node {\n" + " stage(\"build\"){\n" + " echo \"running\"\n" + " input message: 'Please input branch to test against', parameters: [[$class: 'StringParameterDefinition', defaultValue: 'master', description: '', name: 'branch']]\n" + " }\n" + "}";
final boolean[] wasPaused = { false };
final boolean[] wasUnPaused = { false };
final AssertionHelper assertionHelper = new AssertionHelper();
SSEConnection con = new SSEConnection(j.getURL(), "me", new ChannelSubscriber() {
@Override
public void onMessage(@Nonnull Message message) {
System.out.println(message);
if ("job".equals(message.get(jenkins_channel))) {
assertionHelper.isEquals("/blue/rest/organizations/jenkins/pipelines/pipeline1/", message.get(blueocean_job_rest_url));
assertionHelper.isEquals("pipeline1", message.get(blueocean_job_pipeline_name));
if (message.get(jenkins_event).equals(Events.JobChannel.job_run_queue_left.name())) {
assertionHelper.isEquals("1", message.get(blueocean_queue_item_expected_build_number));
assertionHelper.isNotNull(message.get(Job.job_run_queueId));
assertionHelper.isNotNull(message.get(Job.job_run_status));
}
assertionHelper.isEquals("pipeline1", message.get(job_name));
assertionHelper.isEquals("job", message.get(jenkins_channel));
assertionHelper.isEquals("jenkins", message.get(jenkins_org));
assertionHelper.isNull(message.get(job_ismultibranch));
assertionHelper.isNull(message.get(job_multibranch_indexing_result));
assertionHelper.isNull(message.get(job_multibranch_indexing_status));
if ("job_run_unpaused".equals(message.get(jenkins_event))) {
wasUnPaused[0] = true;
}
} else if ("pipeline".equals(message.get(jenkins_channel))) {
assertionHelper.isEquals("1", message.get(pipeline_run_id));
if (message.get(jenkins_event).equals(pipeline_stage.name())) {
assertionHelper.isEquals("build", message.get(pipeline_step_stage_name));
}
if ("input".equals(message.get(pipeline_step_name))) {
wasPaused[0] = true;
assertionHelper.isEquals("true", message.get(pipeline_step_is_paused));
}
}
if (wasPaused[0] && wasUnPaused[0]) {
// signal finish only when both conditions are met
success.signal();
}
}
});
con.subscribe("pipeline");
con.subscribe("job");
WorkflowJob job1 = j.jenkins.createProject(WorkflowJob.class, "pipeline1");
job1.setDefinition(new CpsFlowDefinition(script, false));
QueueTaskFuture<WorkflowRun> buildTask = job1.scheduleBuild2(0);
WorkflowRun run = buildTask.getStartCondition().get();
CpsFlowExecution e = (CpsFlowExecution) run.getExecutionPromise().get();
while (run.getAction(InputAction.class) == null) {
e.waitForSuspension();
}
// Now that flow is paused, send a signal that it's un-paused
ExtensionList<PipelineEventListener.InputStepPublisher> inputStepPublisherList = ExtensionList.lookup(PipelineEventListener.InputStepPublisher.class);
assertFalse(inputStepPublisherList.isEmpty());
InputAction inputAction = run.getAction(InputAction.class);
List<InputStepExecution> executionList = inputAction.getExecutions();
assertFalse(executionList.isEmpty());
InputStep inputStep = executionList.get(0).getInput();
inputStepPublisherList.get(0).onStepContinue(inputStep, run);
success.block(5000);
con.close();
if (success.isSignaled()) {
assertTrue(wasPaused[0]);
assertTrue(wasUnPaused[0]);
}
if (assertionHelper.totalErrors() > 0) {
fail("There were errors: " + assertionHelper.totalErrors());
}
}
use of org.jenkinsci.plugins.workflow.job.WorkflowRun in project blueocean-plugin by jenkinsci.
the class PipelineStepImpl method submitInputStep.
@Override
public HttpResponse submitInputStep(StaplerRequest request) {
JSONObject body;
try {
body = JSONObject.fromObject(IOUtils.toString(request.getReader()));
} catch (IOException e) {
throw new ServiceException.UnexpectedErrorException(e.getMessage());
}
String id = body.getString(ID_ELEMENT);
if (id == null) {
throw new ServiceException.BadRequestException("id is required");
}
if (body.get(PARAMETERS_ELEMENT) == null && body.get(ABORT_ELEMENT) == null) {
throw new ServiceException.BadRequestException("parameters is required");
}
WorkflowRun run = node.getRun();
InputAction inputAction = run.getAction(InputAction.class);
if (inputAction == null) {
throw new ServiceException.BadRequestException("Error processing Input Submit request. This Run instance does not" + " have an InputAction.");
}
try {
InputStepExecution execution = inputAction.getExecution(id);
if (execution == null) {
throw new ServiceException.BadRequestException(String.format("Error processing Input Submit request. This Run instance does not" + " have an Input with an id of '%s'.", id));
}
// if abort, abort and return
if (body.get(ABORT_ELEMENT) != null && body.getBoolean(ABORT_ELEMENT)) {
return execution.doAbort();
}
try {
execution.preSubmissionCheck();
} catch (Failure f) {
throw new ServiceException.BadRequestException(f.getMessage());
}
Object o = parseValue(execution, JSONArray.fromObject(body.get(PARAMETERS_ELEMENT)), request);
HttpResponse response = execution.proceed(o);
for (PipelineInputStepListener listener : ExtensionList.lookup(PipelineInputStepListener.class)) {
listener.onStepContinue(execution.getInput(), run);
}
return response;
} catch (IOException | InterruptedException | TimeoutException e) {
throw new ServiceException.UnexpectedErrorException("Error processing Input Submit request." + e.getMessage());
}
}
use of org.jenkinsci.plugins.workflow.job.WorkflowRun in project blueocean-plugin by jenkinsci.
the class AbstractRunImplTest method replayRunTestMB.
// Disabled, see JENKINS-40084
@Test
@Ignore
public void replayRunTestMB() throws Exception {
j.createOnlineSlave(Label.get("remote"));
sampleRepo.write("Jenkinsfile", "node('remote') {\n" + " ws {\n" + " checkout scm\n" + " stage 'build'\n " + "node {echo 'Building'}\n" + " stage 'test'\nnode { echo 'Testing'}\n" + " stage 'deploy'\nnode { echo 'Deploying'}\n" + " }\n" + " }");
sampleRepo.git("add", "Jenkinsfile");
sampleRepo.git("commit", "--message=init");
WorkflowMultiBranchProject mp = j.jenkins.createProject(WorkflowMultiBranchProject.class, "p");
mp.getSourcesList().add(new BranchSource(new GitSCMSource(null, sampleRepo.toString(), "", "*", "", false), new DefaultBranchPropertyStrategy(new BranchProperty[0])));
for (SCMSource source : mp.getSCMSources()) {
assertEquals(mp, source.getOwner());
}
mp.scheduleBuild2(0).getFuture().get();
WorkflowJob job1 = mp.getItem("master");
WorkflowRun b1 = job1.scheduleBuild2(0).waitForStart();
j.waitForCompletion(b1);
j.assertBuildStatusSuccess(b1);
sampleRepo.write("file1", "");
sampleRepo.git("add", "file1");
sampleRepo.git("commit", "--message=init");
WorkflowRun b2 = job1.scheduleBuild2(0).get();
j.assertBuildStatusSuccess(b2);
Assert.assertNotEquals(new PipelineRunImpl(b1, null, null).getCommitId(), new PipelineRunImpl(b2, null, null).getCommitId());
Map replayBuild = request().post("/organizations/jenkins/pipelines/p/branches/master/runs/" + b1.getNumber() + "/replay").build(Map.class);
Queue.Item item = j.getInstance().getQueue().getItem(Long.parseLong((String) replayBuild.get("id")));
WorkflowRun replayedRun = (WorkflowRun) item.getFuture().get();
Map r = request().get("/organizations/jenkins/pipelines/p/branches/master/runs/" + replayedRun.getNumber() + "/").build(Map.class);
assertEquals(new PipelineRunImpl(b1, null, null).getCommitId(), r.get("commitId"));
}
use of org.jenkinsci.plugins.workflow.job.WorkflowRun in project blueocean-plugin by jenkinsci.
the class AbstractRunImplTest method disableDescription.
@Test
public void disableDescription() throws Exception {
WorkflowJob p = createWorkflowJobWithJenkinsfile(getClass(), "disableDescription.jenkinsfile");
WorkflowRun r = p.scheduleBuild2(0).waitForStart();
j.waitForCompletion(r);
// Description should be available to the pipeline
Map run = request().get(String.format("/organizations/jenkins/pipelines/%s/runs/1/", p.getName())).build(Map.class);
Assert.assertEquals("A cool pipeline", run.get("description"));
// Disable descriptions
System.setProperty(AbstractRunImpl.BLUEOCEAN_FEATURE_RUN_DESCRIPTION_ENABLED, "false");
run = request().get(String.format("/organizations/jenkins/pipelines/%s/runs/1/", p.getName())).build(Map.class);
Assert.assertEquals(null, run.get("description"));
}
Aggregations