private WorkflowJob createWorkflowJob(Folder folder) throws IOException { if (folder == null) { return j.createProject(WorkflowJob.class); } else { return folder.createProject(WorkflowJob.class, "test" + (folder.getItems().size() + 1)); } }
@Test public void dgm() throws Exception { WorkflowJob j = r.createProject(WorkflowJob.class, testName); j.setDefinition(new CpsFlowDefinition(testCode, true)); r.buildAndAssertSuccess(j); } }
@Test public void eachMatch() throws Exception { WorkflowJob j = r.createProject(WorkflowJob.class, "eachMatch"); j.setDefinition(new CpsFlowDefinition("int c = 0\n" + "'foobarfoooobar'.eachMatch('foo') { c++ }\n" + "assert c == 2\n", true)); r.buildAndAssertSuccess(j); }
@Test public void replaceFirst() throws Exception { WorkflowJob j = r.createProject(WorkflowJob.class, "replaceFirst"); j.setDefinition(new CpsFlowDefinition("assert 'foobarfoobarfoo'.replaceFirst('foo') {\n" + " it.reverse()\n" + "} == 'oofbarfoobarfoo'\n", true)); r.buildAndAssertSuccess(j); }
@Test public void takeWhile() throws Exception { WorkflowJob j = r.createProject(WorkflowJob.class, "takeWhile"); j.setDefinition(new CpsFlowDefinition("assert 'Groovy'.takeWhile {\n" + " it != 'v'\n" + "} == 'Groo'\n", true)); r.buildAndAssertSuccess(j); } }
@Test public void find() throws Exception { WorkflowJob j = r.createProject(WorkflowJob.class, "find"); j.setDefinition(new CpsFlowDefinition("assert 'foobar'.find('foo') { it.reverse() } == 'oof'", true)); r.buildAndAssertSuccess(j); }
@Test public void findAll() throws Exception { WorkflowJob j = r.createProject(WorkflowJob.class, "findAll"); j.setDefinition(new CpsFlowDefinition("assert 'foobarfoobarfoo'.findAll('foo') {\n" + " it.reverse()\n" + "} == ['oof', 'oof', 'oof']\n", true)); r.buildAndAssertSuccess(j); }
@Test public void replaceAll() throws Exception { WorkflowJob j = r.createProject(WorkflowJob.class, "replaceAll"); j.setDefinition(new CpsFlowDefinition("assert 'foobarfoobarfoo'.replaceAll('foo') {\n" + " it.reverse()\n" + "} == 'oofbaroofbaroof'\n", true)); r.buildAndAssertSuccess(j); }
@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)); } });
@Override public void evaluate() throws Throwable { WorkflowJob p = rr.j.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("pipeline {agent any; stages {stage('x') {steps {script {semaphore 'wait'}}}}}", true)); WorkflowRun b = p.scheduleBuild2(0).waitForStart(); SemaphoreStep.waitForStart("wait/1", b); } });
/** * V1 files shouldn't be affected */ @Test public void v1() throws Exception { WorkflowJob job = j.createProject(WorkflowJob.class); // still a syntactically valid groovy code but no stage name job.setDefinition(new CpsFlowDefinition("node { echo 'hello' }")); j.assertBuildStatusSuccess(job.scheduleBuild2(0)); } }
@Override public void evaluate() throws Throwable { WorkflowJob p = rr.j.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("block {semaphore 'wait'}", true)); WorkflowRun b = p.scheduleBuild2(0).waitForStart(); SemaphoreStep.waitForStart("wait/1", b); } });
@Issue("JENKINS-28321") @Test public void whitelistedMethodPointer() throws Exception { WorkflowJob job = jenkins.createProject(WorkflowJob.class, "p"); job.setDefinition(new CpsFlowDefinition("def foo = 'lowercase'\n" + "def bar = foo.&toUpperCase\n" + "echo bar.call()\n", true)); WorkflowRun b = jenkins.buildAndAssertSuccess(job); jenkins.assertLogContains("LOWERCASE", b); }
@Override public void evaluate() throws Throwable { WorkflowJob p = rr.j.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition( "def arr = []; arr += 'one'; arr += 'two'\n" + "for (int i = 0; i < arr.size(); i++) {def elt = arr[i]; echo \"running C-style loop on ${elt}\"; semaphore \"C-${elt}\"}\n" + "for (def elt : arr) {echo \"running new-style loop on ${elt}\"; semaphore \"new-${elt}\"}" , true)); WorkflowRun b = p.scheduleBuild2(0).waitForStart(); SemaphoreStep.waitForStart("C-one/1", b); rr.j.waitForMessage("running C-style loop on one", b); } });
@Override public void evaluate() throws Throwable { WorkflowJob p = rr.j.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition( "def map = [one: 1, two: 2]\n" + "@NonCPS def entrySet(m) {m.collect {k, v -> [key: k, value: v]}}; for (def e in entrySet(map)) {echo \"running flattened loop on ${e.key} -> ${e.value}\"; semaphore \"C-${e.key}\"}\n" + "for (def e : map.entrySet()) {echo \"running new-style loop on ${e.key} -> ${e.value}\"; semaphore \"new-${e.key}\"}" , true)); WorkflowRun b = p.scheduleBuild2(0).waitForStart(); SemaphoreStep.waitForStart("C-one/1", b); rr.j.waitForMessage("running flattened loop on one -> 1", b); } });
@Before public void setUp() throws Exception { repo = tmp.getRoot(); createPretendSlave("slave_one"); createPretendSlave("slave_two"); matrixProject = j.createProject(MatrixProject.class, "matrix_test"); matrixProject.setScm(new MercurialSCM(null, repo.getPath(), null, null, null, null, false)); matrixProject.setAxes(new AxisList(new LabelAxis("label", Arrays.asList("slave_one", "slave_two")))); // TODO switch to MercurialContainer m.hg(repo, "init"); m.touchAndCommit(repo, "a"); }
@Issue("JENKINS-46252") @Test public void declarativeJobAction() throws Exception { WorkflowRun r1 = expect("simplePipeline").go(); WorkflowJob j1 = r1.getParent(); assertNotNull(j1.getAction(DeclarativeJobAction.class)); WorkflowJob j2 = j.createProject(WorkflowJob.class, "nonDeclarative"); j2.setDefinition(new CpsFlowDefinition("echo 'hi'", true)); j.buildAndAssertSuccess(j2); assertNull(j2.getAction(DeclarativeJobAction.class)); }
@Test public void directParent() throws Exception { Folder folder = j.createProject(Folder.class); getFolderStore(folder).addCredentials(Domain.global(), folderCred); folder.addProperty(new FolderConfig("folder_docker", "https://folder.registry", folderCred.getId())); expect("declarativeDockerConfig") .inFolder(folder) .runFromRepo(false) .logContains("Docker Label is: folder_docker", "Registry URL is: https://folder.registry", "Registry Creds ID is: " + folderCred.getId()).go(); }
@Test public void grandParent() throws Exception { Folder grandParent = j.createProject(Folder.class); getFolderStore(grandParent).addCredentials(Domain.global(), grandParentCred); grandParent.addProperty(new FolderConfig("parent_docker", "https://parent.registry", grandParentCred.getId())); Folder parent = grandParent.createProject(Folder.class, "testParent"); //Can be static since grandParent should be unique expect("declarativeDockerConfig") .inFolder(parent) .runFromRepo(false) .logContains("Docker Label is: parent_docker", "Registry URL is: https://parent.registry", "Registry Creds ID is: " + grandParentCred.getId()).go(); }
@Test public void withDefaults() throws Exception { Folder folder = j.createProject(Folder.class); getFolderStore(folder).addCredentials(Domain.global(), folderCred); getFolderStore(folder).addCredentials(Domain.global(), grandParentCred); folder.addProperty(new FolderConfig("folder_docker", "https://folder.registry", folderCred.getId())); expect("declarativeDockerConfigWithOverride") .inFolder(folder) .runFromRepo(false) .logContains("Docker Label is: other-label", "Registry URL is: https://other.registry", "Registry Creds ID is: " + grandParentCred.getId()).go(); }