@Override public WorkflowJob setBranch(WorkflowJob project, Branch branch) { project.setDefinition(createDefinition()); BranchJobProperty property = project.getProperty(BranchJobProperty.class); try { if (property == null) { project.addProperty(new BranchJobProperty(branch)); } else { // TODO may add equality check if https://github.com/jenkinsci/branch-api-plugin/pull/36 or equivalent is implemented property.setBranch(branch); project.save(); } } catch (IOException x) { LOGGER.log(Level.WARNING, null, x); } return project; }
@Override public WorkflowJob setBranch(WorkflowJob project, Branch branch) { project.setDefinition(createDefinition()); BranchJobProperty property = project.getProperty(BranchJobProperty.class); try { if (property == null) { project.addProperty(new BranchJobProperty(branch)); } else { // TODO may add equality check if https://github.com/jenkinsci/branch-api-plugin/pull/36 or equivalent is implemented property.setBranch(branch); project.save(); } } catch (IOException x) { LOGGER.log(Level.WARNING, null, x); } return project; }
/** * Main entry point invoked by the setup module */ public int run(Bootstrap bootstrap) throws Exception { Jenkins j = Jenkins.getInstance(); WorkflowJob w = j.createProject(WorkflowJob.class, "job"); w.addProperty(new DurabilityHintJobProperty(FlowDurabilityHint.PERFORMANCE_OPTIMIZED)); w.setDefinition(new CpsScmFlowDefinition( new FileSystemSCM(bootstrap.jenkinsfile.getParent()), bootstrap.jenkinsfile.getName())); QueueTaskFuture<WorkflowRun> f = w.scheduleBuild2(0, new SetJenkinsfileLocation(bootstrap.jenkinsfile)); b = f.getStartCondition().get(); writeLogTo(System.out); f.get(); // wait for the completion return b.getResult().ordinal; }
/** * Main entry point invoked by the setup module */ public int run(Bootstrap bootstrap) throws Exception { Jenkins j = Jenkins.getInstance(); WorkflowJob w = j.createProject(WorkflowJob.class, "job"); w.addProperty(new DurabilityHintJobProperty(FlowDurabilityHint.PERFORMANCE_OPTIMIZED)); w.setDefinition(new CpsScmFlowDefinition( new FileSystemSCM(bootstrap.jenkinsfile.getParent()), bootstrap.jenkinsfile.getName())); QueueTaskFuture<WorkflowRun> f = w.scheduleBuild2(0, new SetJenkinsfileLocation(bootstrap.jenkinsfile)); b = f.getStartCondition().get(); writeLogTo(System.out); f.get(); // wait for the completion return b.getResult().ordinal; }
public void setConcurrentBuild(boolean b) throws IOException { concurrentBuild = null; boolean propertyExists = getProperty(DisableConcurrentBuildsJobProperty.class) != null; // If the property exists, concurrent builds are disabled. So if the argument here is true and the // property exists, we need to remove the property, while if the argument is false and the property // does not exist, we need to add the property. Yay for flipping boolean values around! if (propertyExists == b) { BulkChange bc = new BulkChange(this); try { removeProperty(DisableConcurrentBuildsJobProperty.class); if (!b) { addProperty(new DisableConcurrentBuildsJobProperty()); } bc.commit(); } finally { bc.abort(); } } }
/** Sets up a running build that is waiting on input. */ private static WorkflowRun runBasicPauseOnInput(JenkinsRule j, String jobName, int[] jobIdNumber, FlowDurabilityHint durabilityHint) throws Exception { WorkflowJob job = j.jenkins.createProject(WorkflowJob.class, jobName); job.setDefinition(new CpsFlowDefinition("input 'pause'", true)); job.addProperty(new DurabilityHintJobProperty(durabilityHint)); WorkflowRun run = job.scheduleBuild2(0).getStartCondition().get(); ListenableFuture<FlowExecution> listener = run.getExecutionPromise(); FlowExecution exec = listener.get(); while(exec.getCurrentHeads().isEmpty() || (exec.getCurrentHeads().get(0) instanceof FlowStartNode)) { // Wait until input step starts System.out.println("Waiting for input step to begin"); Thread.sleep(50); } while(run.getAction(InputAction.class) == null) { // Wait until input step starts System.out.println("Waiting for input action to get attached to run"); Thread.sleep(50); } Thread.sleep(100L); // A little extra buffer for persistence etc jobIdNumber[0] = run.getNumber(); return run; }
public void setTriggers(List<Trigger<?>> inputTriggers) throws IOException { triggers = null; BulkChange bc = new BulkChange(this); try { PipelineTriggersJobProperty originalProp = getTriggersJobProperty(); removeProperty(PipelineTriggersJobProperty.class); PipelineTriggersJobProperty triggerProp = new PipelineTriggersJobProperty(null); triggerProp.setTriggers(inputTriggers); addProperty(triggerProp); bc.commit(); originalProp.stopTriggers(); // No longer need to start triggers here - that's done by when we add the property. } finally { bc.abort(); } }
public void addTrigger(Trigger trigger) throws IOException { BulkChange bc = new BulkChange(this); try { PipelineTriggersJobProperty originalProp = getTriggersJobProperty(); Trigger old = originalProp.getTriggerForDescriptor(trigger.getDescriptor()); if (old != null) { originalProp.removeTrigger(old); old.stop(); } originalProp.addTrigger(trigger); removeProperty(PipelineTriggersJobProperty.class); addProperty(originalProp); bc.commit(); } finally { bc.abort(); } }
/** Create and run a basic build before we mangle its persisted contents. Stores job number to jobIdNumber index 0. */ private static WorkflowRun runBasicBuild(JenkinsRule j, String jobName, int[] jobIdNumber, FlowDurabilityHint hint) throws Exception { WorkflowJob job = j.jenkins.createProject(WorkflowJob.class, jobName); job.setDefinition(new CpsFlowDefinition("echo 'doSomething'", true)); job.addProperty(new DurabilityHintJobProperty(hint)); WorkflowRun run = j.buildAndAssertSuccess(job); jobIdNumber[0] = run.getNumber(); assertCompletedCleanly(run); return run; }
@Issue("JENKINS-44621") @Test public void externalTriggersNotRemoved() throws Exception { WorkflowRun b = getAndStartNonRepoBuild("simpleTriggers"); j.assertBuildStatusSuccess(j.waitForCompletion(b)); WorkflowJob job = b.getParent(); PipelineTriggersJobProperty triggersJobProperty = job.getProperty(PipelineTriggersJobProperty.class); assertNotNull(triggersJobProperty); assertEquals(1, triggersJobProperty.getTriggers().size()); List<Trigger> newTriggers = new ArrayList<>(); newTriggers.addAll(triggersJobProperty.getTriggers()); newTriggers.add(new SCMTrigger("1 1 1 * *")); job.removeProperty(triggersJobProperty); job.addProperty(new PipelineTriggersJobProperty(newTriggers)); job.setDefinition(new CpsFlowDefinition(pipelineSourceFromResources("propsTriggersParamsRemoved"), true)); j.buildAndAssertSuccess(job); PipelineTriggersJobProperty newProp = job.getProperty(PipelineTriggersJobProperty.class); assertNotNull(newProp); assertEquals(1, newProp.getTriggers().size()); Trigger t = newProp.getTriggers().get(0); assertNotNull(t); assertTrue(t instanceof SCMTrigger); }
@Issue("JENKINS-44621") @Test public void externalParamsNotRemoved() throws Exception { WorkflowRun b = getAndStartNonRepoBuild("simpleParameters"); j.assertBuildStatusSuccess(j.waitForCompletion(b)); WorkflowJob job = b.getParent(); ParametersDefinitionProperty paramProp = job.getProperty(ParametersDefinitionProperty.class); assertNotNull(paramProp); assertEquals(1, paramProp.getParameterDefinitions().size()); List<ParameterDefinition> newParams = new ArrayList<>(); newParams.addAll(paramProp.getParameterDefinitions()); newParams.add(new StringParameterDefinition("DO_NOT_DELETE", "something")); job.removeProperty(paramProp); job.addProperty(new ParametersDefinitionProperty(newParams)); job.setDefinition(new CpsFlowDefinition(pipelineSourceFromResources("propsTriggersParamsRemoved"), true)); j.buildAndAssertSuccess(job); ParametersDefinitionProperty newProp = job.getProperty(ParametersDefinitionProperty.class); assertNotNull(newProp); assertEquals(1, newProp.getParameterDefinitions().size()); ParameterDefinition paramDef = newProp.getParameterDefinition("DO_NOT_DELETE"); assertNotNull(paramDef); } }
@Override public void evaluate() throws Throwable { WorkflowJob p = story.j.jenkins.createProject(WorkflowJob.class, "p"); p.addProperty(new ParametersDefinitionProperty(new StringParameterDefinition("param", ""))); p.setDefinition(new CpsFlowDefinition("echo \"run with ${param}\"", true)); WorkflowRun b1 = story.j.assertBuildStatusSuccess(p.scheduleBuild2(0, new ParametersAction(new StringParameterValue("param", "some value")))); story.j.assertLogContains("run with some value", b1); // When we replay a parameterized build, we expect the original parameter values to be set. WorkflowRun b2 = (WorkflowRun) b1.getAction(ReplayAction.class).run("echo \"run again with ${param}\"", Collections.<String,String>emptyMap()).get(); story.j.assertLogContains("run again with some value", story.j.assertBuildStatusSuccess(b2)); } });
assertTrue(action2.getParameters().isEmpty()); job.addProperty(new DisableConcurrentBuildsJobProperty()); job.addProperty(new DisableConcurrentBuildsJobProperty()); job.addProperty(new DisableConcurrentBuildsJobProperty());
@Issue("JENKINS-42836") @Test public void usingParameterInScriptPath() throws Exception { sampleRepo.init(); sampleRepo.write("flow.groovy", "echo 'version one'"); sampleRepo.git("add", "flow.groovy"); sampleRepo.write("otherFlow.groovy", "echo 'version two'"); sampleRepo.git("add", "otherFlow.groovy"); sampleRepo.git("commit", "--all", "--message=commits"); WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); CpsScmFlowDefinition def = new CpsScmFlowDefinition(new GitSCM(Collections.singletonList(new UserRemoteConfig(sampleRepo.fileUrl(), null, null, null)), Collections.singletonList(new BranchSpec("master")), false, Collections.<SubmoduleConfig>emptyList(), null, null, Collections.<GitSCMExtension>emptyList()), "${SCRIPT_PATH}"); p.setDefinition(def); p.addProperty(new ParametersDefinitionProperty(new StringParameterDefinition("SCRIPT_PATH", "flow.groovy"))); r.assertLogContains("version one", r.assertBuildStatusSuccess(p.scheduleBuild2(0))); r.assertLogContains("version two", r.assertBuildStatusSuccess(p.scheduleBuild2(0, new ParametersAction(new StringParameterValue("SCRIPT_PATH", "otherFlow.groovy"))))); } }
@Issue("JENKINS-42367") @Test public void nullValue() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("echo(/TEXT=${params.TEXT}/)",true)); p.addProperty(new ParametersDefinitionProperty(new StringParameterDefinition("TEXT", ""))); r.assertLogContains("TEXT=null", r.assertBuildStatusSuccess(p.scheduleBuild2(0, new ParametersAction(new StringParameterValue("TEXT", /* not possible via UI, but to simulate other ParameterValue impls */null))))); }
@Issue("JENKINS-28447") @Test public void usingParameter() throws Exception { sampleRepo.init(); sampleRepo.write("flow.groovy", "echo 'version one'"); sampleRepo.git("add", "flow.groovy"); sampleRepo.git("commit", "--message=one"); sampleRepo.git("tag", "one"); sampleRepo.write("flow.groovy", "echo 'version two'"); sampleRepo.git("commit", "--all", "--message=two"); WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); CpsScmFlowDefinition def = new CpsScmFlowDefinition(new GitSCM(Collections.singletonList(new UserRemoteConfig(sampleRepo.fileUrl(), null, null, null)), Collections.singletonList(new BranchSpec("${VERSION}")), false, Collections.<SubmoduleConfig>emptyList(), null, null, Collections.<GitSCMExtension>emptyList()), "flow.groovy"); def.setLightweight(false); // TODO SCMFileSystem.of cannot pick up build parameters p.setDefinition(def); p.addProperty(new ParametersDefinitionProperty(new StringParameterDefinition("VERSION", "master"))); r.assertLogContains("version two", r.assertBuildStatusSuccess(p.scheduleBuild2(0))); r.assertLogContains("version one", r.assertBuildStatusSuccess(p.scheduleBuild2(0, new ParametersAction(new StringParameterValue("VERSION", "one"))))); }
@LocalData @Test public void trackerPropertyUpgrade() throws Exception { WorkflowJob p = j.jenkins.getItemByFullName("trackerPropertyUpgrade", WorkflowJob.class); assertNotNull(p); WorkflowRun b1 = p.getLastBuild(); assertNotNull(b1); assertNotNull(b1.getAction(DeclarativeJobPropertyTrackerAction.class)); assertNull(p.getAction(DeclarativeJobPropertyTrackerAction.class)); p.addProperty(new DisableConcurrentBuildsJobProperty()); p.setDefinition(new CpsFlowDefinition(pipelineSourceFromResources("simpleParameters"), true)); WorkflowRun b2 = j.buildAndAssertSuccess(p); assertNull(b2.getAction(DeclarativeJobPropertyTrackerAction.class)); assertNull(p.getProperty(BuildDiscarderProperty.class)); ParametersDefinitionProperty parameters = p.getProperty(ParametersDefinitionProperty.class); assertNotNull(parameters); assertNotNull(parameters.getParameterDefinition("flag")); DeclarativeJobPropertyTrackerAction action2 = p.getAction(DeclarativeJobPropertyTrackerAction.class); assertNotNull(action2); assertFalse(action2.getParameters().isEmpty()); assertEquals("flag", action2.getParameters().iterator().next()); p.setDefinition(new CpsFlowDefinition(pipelineSourceFromResources("propsTriggersParamsRemoved"), true)); WorkflowRun b3 = j.buildAndAssertSuccess(p); assertNull(b3.getAction(DeclarativeJobPropertyTrackerAction.class)); assertNull(p.getProperty(BuildDiscarderProperty.class)); assertNull(p.getProperty(ParametersDefinitionProperty.class)); DeclarativeJobPropertyTrackerAction action3 = p.getAction(DeclarativeJobPropertyTrackerAction.class); assertNotNull(action3); assertTrue(action3.getParameters().isEmpty()); }
@Issue("JENKINS-44848") @Test public void onlyRemoveJenkinsfileProperties() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.addProperty(new DisableConcurrentBuildsJobProperty()); // Base case - not calling the properties step p.setDefinition(new CpsFlowDefinition("echo 'Not doing anything'", true)); r.buildAndAssertSuccess(p); assertNotNull(p.getProperty(DisableConcurrentBuildsJobProperty.class)); assertNull(p.getAction(JobPropertyTrackerAction.class)); // Adding a property, make sure the predefined one is still there. // TODO Jenkins 2.x use symbols p.setDefinition(new CpsFlowDefinition("properties([buildDiscarder(logRotator(numToKeepStr: '1'))])", true)); r.buildAndAssertSuccess(p); assertNotNull(p.getProperty(DisableConcurrentBuildsJobProperty.class)); assertNotNull(p.getProperty(BuildDiscarderProperty.class)); JobPropertyTrackerAction action2 = p.getAction(JobPropertyTrackerAction.class); assertNotNull(action2); assertEquals(1, action2.getJobPropertyDescriptors().size()); assertEquals(Collections.singleton(r.jenkins.getDescriptor(BuildDiscarderProperty.class).getId()), action2.getJobPropertyDescriptors()); // Make sure the predefined property is still there after we remove the properties-step-defined property. p.setDefinition(new CpsFlowDefinition("properties([])", true)); r.buildAndAssertSuccess(p); assertNotNull(p.getProperty(DisableConcurrentBuildsJobProperty.class)); assertNull(p.getProperty(BuildDiscarderProperty.class)); JobPropertyTrackerAction action3 = p.getAction(JobPropertyTrackerAction.class); assertNotNull(action3); assertTrue(action3.getJobPropertyDescriptors().isEmpty()); }
@Issue("JENKINS-27295") @Test public void smokes() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition("echo(/TEXT=${params.TEXT} FLAG=${params.FLAG ? 'yes' : 'no'} PASS=${params.PASS}/)",true)); p.addProperty(new ParametersDefinitionProperty( new StringParameterDefinition("TEXT", ""), new BooleanParameterDefinition("FLAG", false, null), new PasswordParameterDefinition("PASS", "", null))); WorkflowRun b = r.assertBuildStatusSuccess(p.scheduleBuild2(0, new ParametersAction( new StringParameterValue("TEXT", "hello"), new BooleanParameterValue("FLAG", true), new PasswordParameterValue("PASS", "s3cr3t")))); r.assertLogContains("TEXT=hello", b); r.assertLogContains("FLAG=yes", b); r.assertLogContains("PASS=s3cr3t", b); }
@Issue("JENKINS-44621") @Test public void externalPropsNotRemoved() throws Exception { WorkflowRun b = getAndStartNonRepoBuild("simpleJobProperties"); j.assertBuildStatusSuccess(j.waitForCompletion(b)); WorkflowJob job = b.getParent(); assertNotNull(job.getProperty(BuildDiscarderProperty.class)); job.addProperty(new DisableConcurrentBuildsJobProperty()); job.setQuietPeriod(15); job.setDefinition(new CpsFlowDefinition(pipelineSourceFromResources("propsTriggersParamsRemoved"), true)); j.buildAndAssertSuccess(job); assertNull(job.getProperty(BuildDiscarderProperty.class)); assertNotNull(job.getProperty(DisableConcurrentBuildsJobProperty.class)); int externalPropCount = 0; for (JobProperty p : job.getAllProperties()) { if (p instanceof DisableConcurrentBuildsJobProperty) { externalPropCount++; } } assertEquals(1, externalPropCount); assertEquals(15, job.getQuietPeriod()); }