@Override public void evaluate() throws Throwable { WorkflowJob p = story.j.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("echo(/before VAR=$VAR/); " + EnvAdder.class.getCanonicalName() + ".value = 'after'; echo(/after VAR=$VAR/)", false)); WorkflowRun b = story.j.buildAndAssertSuccess(p); story.j.assertLogContains("buildEnvironmentFor #1", b); story.j.assertLogContains("before VAR=before", b); story.j.assertLogContains("buildEnvironmentFor #2", b); story.j.assertLogContains("after VAR=after", b); } });
@Override public void evaluate() throws Throwable { WorkflowJob p = rr.j.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("for (x in 'a;b'.split(';')) {sleep 1; echo(/running in $x/)}", true)); rr.j.assertLogContains("running in b", rr.j.buildAndAssertSuccess(p)); } });
/** * Tests the "URL@HEAD" format in the SVN URL */ @Test public void headRevisionCheckout() throws Exception { File testRepo = new CopyExisting(getClass().getResource("two-revisions.zip")).allocate(); SubversionSCM scm = new SubversionSCM("file://" + testRepo.toURI().toURL().getPath() + "@HEAD"); FreeStyleProject p = r.createFreeStyleProject(); p.setScm(scm); FreeStyleBuild b = p.scheduleBuild2(0, new Cause.UserIdCause()).get(); System.out.println(b.getLog(LOG_LIMIT)); r.assertLogContains("At revision 2", b); r.assertBuildStatus(Result.SUCCESS,b); }
@Test public void ambiguousStepsRespectOrdinal() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("ambiguousEcho 'HeLlO'\n", true)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("HELLO", b); r.assertLogContains("Warning: Invoking ambiguous Pipeline Step", b); r.assertLogContains("any of the following steps: [" + AmbiguousEchoUpperStep.class.getName() + ", " + AmbiguousEchoLowerStep.class.getName() + "]", b); }
@Issue("JENKINS-45455") @Test public void stashAndRestart() throws Exception { WorkflowRun original = expect(Result.FAILURE, "restart", "stashAndRestart").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("Even numbered build, success", b2); j.assertLogContains("Stage \"pre-restart\" skipped due to this build restarting at stage \"restart\"", b2); j.assertLogContains("someFile is some text", b2); }
@Test public void quotedStep() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("'echo' 'Hello1'\n" + "\"echo\" 'Hello2'", true)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("Hello1", b); r.assertLogContains("Hello2", b); }
@Issue("JENKINS-29922") @Test public void nonexistentFunctions() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("nonexistent()", true)); WorkflowRun b = r.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0)); r.assertLogContains("nonexistent", b); r.assertLogContains("wrapInCurve", b); r.assertLogContains("polygon", b); }
@Test public void basics() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition( "node {\n" + " writeFile text: 'println(21*2)', file: 'test.groovy'\n" + " println 'something printed'\n" +// make sure that 'println' in groovy script works " load 'test.groovy'\n" + "}", true)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("something printed", b); r.assertLogContains("42", b); }
@Test public void overrideFunction() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("echo 'this came from a step'", true)); r.assertLogContains("this came from a step", r.assertBuildStatusSuccess(p.scheduleBuild2(0))); p.setDefinition(new CpsFlowDefinition("def echo(s) {println s.toUpperCase()}\necho 'this came from my own function'\nsteps.echo 'but this is still from a step'", true)); WorkflowRun b2 = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("THIS CAME FROM MY OWN FUNCTION", b2); r.assertLogContains("but this is still from a step", b2); }
@Issue("JENKINS-29922") @Test public void runMetaBlockStep() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("circle {echo 'interior is a disk'}", true)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("wrapping in a circle", b); r.assertLogContains("interior is a disk", b); p.setDefinition(new CpsFlowDefinition("polygon(17) {echo 'constructible with compass and straightedge'}", true)); b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("wrapping in a 17-gon", b); r.assertLogContains("constructible with compass and straightedge", b); }
/** * Tests the ability to execute a user defined closure with no arguments */ @Test public void userDefinedClosure0ArgsExecution() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("binding.setVariable(\"my_closure\", { echo \"my closure!\" })\n my_closure() ", false)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("my closure!", b); }
/** * Tests the ability to execute a user defined closure with one arguments */ @Test public void userDefinedClosure1ArgInvocationExecution() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("my_closure = { String message -> \n" + " echo message \n" + "}\n" + "my_closure(\"my message!\") ", false)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("my message!", b); }
/** * Tests untyped arguments */ @Test public void userDefinedClosureUntypedArgInvocationExecution() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("my_closure = { a , b -> \n" + " echo \"my message is ${a} and ${b}\" \n" + "}\n" + "my_closure(\"string1\" ,2)",false)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("my message is string1 and 2", b); }
/** * Tests the ability to execute a step with an unnamed monomorphic list argument. */ @Issue("JENKINS-29711") @Test public void monomorphicList() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "monList"); p.setDefinition(new CpsFlowDefinition("monomorphListStep([[firstArg:'one', secondArg:'two'], [firstArg:'three', secondArg:'four']])", true)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("First arg: one, second arg: two", b); r.assertLogContains("First arg: three, second arg: four", b); }
@Issue("JENKINS-29711") @Test public void monomorphicListWithSymbol() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "monListSymbol"); p.setDefinition(new CpsFlowDefinition("monomorphListSymbolStep([monomorphSymbol(firstArg: 'one', secondArg: 'two'), monomorphSymbol(firstArg: 'three', secondArg: 'four')])", true)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("First arg: one, second arg: two", b); r.assertLogContains("First arg: three, second arg: four", b); }
@Issue("JENKINS-38037") @Test public void metaStepSyntaxForDataBoundSetters() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "metaStepSyntaxForDataBoundSetters"); p.setDefinition(new CpsFlowDefinition("multiShape(count: 2, name: 'pentagon') { echo 'Multiple shapes' }", true)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("wrapping in a group of 2 instances of pentagon", b); r.assertLogContains("Multiple shapes", 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); }
/** * Tests the ability to execute a user defined closure with 2 arguments */ @Test public void userDefinedClosure2ArgInvocationExecution() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("my_closure = { String message1, String message2 -> \n" + " echo \"my message is ${message1} and ${message2}\" \n" + "}\n" + "my_closure(\"string1\", \"string2\") ", false)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("my message is string1 and string2", b); }
@Test public void fullyQualifiedStep() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("'org.jenkinsci.plugins.workflow.steps.EchoStep' 'Hello, world!'", true)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("Hello, world!", b); }
/** * Tests the ability to execute a user defined closure */ @Test public void userDefinedClosureInvocationExecution() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("binding[\"my_closure\"] = { \n" + " sleep 1 \n" + " echo \"my closure!\" \n" + "}\n" + "my_closure() ", false)); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); r.assertLogContains("my closure!", b); }