Search in sources :

Example 56 with WorkflowRun

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());
    }
}
Also used : Message(org.jenkinsci.plugins.pubsub.Message) ChannelSubscriber(org.jenkinsci.plugins.pubsub.ChannelSubscriber) GitSCMSource(jenkins.plugins.git.GitSCMSource) SCMSource(jenkins.scm.api.SCMSource) GitSCMSource(jenkins.plugins.git.GitSCMSource) BranchSource(jenkins.branch.BranchSource) SSEConnection(io.jenkins.blueocean.events.sse.SSEConnection) WorkflowRun(org.jenkinsci.plugins.workflow.job.WorkflowRun) WorkflowMultiBranchProject(org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject) WorkflowJob(org.jenkinsci.plugins.workflow.job.WorkflowJob) DefaultBranchPropertyStrategy(jenkins.branch.DefaultBranchPropertyStrategy) OneShotEvent(hudson.util.OneShotEvent) Test(org.junit.Test)

Example 57 with WorkflowRun

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());
    }
}
Also used : Message(org.jenkinsci.plugins.pubsub.Message) InputAction(org.jenkinsci.plugins.workflow.support.steps.input.InputAction) ChannelSubscriber(org.jenkinsci.plugins.pubsub.ChannelSubscriber) SSEConnection(io.jenkins.blueocean.events.sse.SSEConnection) WorkflowRun(org.jenkinsci.plugins.workflow.job.WorkflowRun) CpsFlowExecution(org.jenkinsci.plugins.workflow.cps.CpsFlowExecution) InputStepExecution(org.jenkinsci.plugins.workflow.support.steps.input.InputStepExecution) CpsFlowDefinition(org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition) InputStep(org.jenkinsci.plugins.workflow.support.steps.input.InputStep) WorkflowJob(org.jenkinsci.plugins.workflow.job.WorkflowJob) OneShotEvent(hudson.util.OneShotEvent) Test(org.junit.Test)

Example 58 with WorkflowRun

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());
    }
}
Also used : InputAction(org.jenkinsci.plugins.workflow.support.steps.input.InputAction) HttpResponse(org.kohsuke.stapler.HttpResponse) IOException(java.io.IOException) WorkflowRun(org.jenkinsci.plugins.workflow.job.WorkflowRun) InputStepExecution(org.jenkinsci.plugins.workflow.support.steps.input.InputStepExecution) JSONObject(net.sf.json.JSONObject) ServiceException(io.jenkins.blueocean.commons.ServiceException) JSONObject(net.sf.json.JSONObject) Failure(hudson.model.Failure) TimeoutException(java.util.concurrent.TimeoutException)

Example 59 with WorkflowRun

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"));
}
Also used : WorkflowMultiBranchProject(org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject) GitSCMSource(jenkins.plugins.git.GitSCMSource) SCMSource(jenkins.scm.api.SCMSource) GitSCMSource(jenkins.plugins.git.GitSCMSource) BranchSource(jenkins.branch.BranchSource) WorkflowJob(org.jenkinsci.plugins.workflow.job.WorkflowJob) DefaultBranchPropertyStrategy(jenkins.branch.DefaultBranchPropertyStrategy) Map(java.util.Map) Queue(hudson.model.Queue) WorkflowRun(org.jenkinsci.plugins.workflow.job.WorkflowRun) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 60 with WorkflowRun

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"));
}
Also used : WorkflowJob(org.jenkinsci.plugins.workflow.job.WorkflowJob) Map(java.util.Map) WorkflowRun(org.jenkinsci.plugins.workflow.job.WorkflowRun) Test(org.junit.Test)

Aggregations

WorkflowRun (org.jenkinsci.plugins.workflow.job.WorkflowRun)77 WorkflowJob (org.jenkinsci.plugins.workflow.job.WorkflowJob)72 Test (org.junit.Test)70 Map (java.util.Map)58 CpsFlowDefinition (org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition)53 ImmutableMap (com.google.common.collect.ImmutableMap)45 List (java.util.List)22 ImmutableList (com.google.common.collect.ImmutableList)20 FlowNode (org.jenkinsci.plugins.workflow.graph.FlowNode)19 RunList (hudson.util.RunList)18 BranchSource (jenkins.branch.BranchSource)12 GitSCMSource (jenkins.plugins.git.GitSCMSource)12 WorkflowMultiBranchProject (org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject)12 SCMSource (jenkins.scm.api.SCMSource)11 DefaultBranchPropertyStrategy (jenkins.branch.DefaultBranchPropertyStrategy)8 CpsFlowExecution (org.jenkinsci.plugins.workflow.cps.CpsFlowExecution)7 InputAction (org.jenkinsci.plugins.workflow.support.steps.input.InputAction)6 Issue (org.jvnet.hudson.test.Issue)6 Run (hudson.model.Run)4 JSONObject (net.sf.json.JSONObject)4