/** * Bare-minimum configuration mechanism to change the update center. */ @RequirePOST public HttpResponse doSiteConfigure(@QueryParameter String site) throws IOException { Jenkins hudson = Jenkins.getInstance(); hudson.checkPermission(CONFIGURE_UPDATECENTER); UpdateCenter uc = hudson.getUpdateCenter(); PersistedList<UpdateSite> sites = uc.getSites(); for (UpdateSite s : sites) { if (s.getId().equals(UpdateCenter.ID_DEFAULT)) sites.remove(s); } sites.add(new UpdateSite(UpdateCenter.ID_DEFAULT, site)); return new HttpRedirect("advanced"); }
protected int run() throws Exception { Jenkins h = Jenkins.getActiveInstance(); h.checkPermission(PluginManager.UPLOAD_PLUGINS); PluginManager pm = h.getPluginManager(); if (h.getUpdateCenter().getSites().isEmpty()) { stdout.println(Messages.InstallPluginCommand_NoUpdateCenterDefined()); } else {
private Object readResolve() { collapsed.setOwner(this); return this; }
if(file.exists()) { try { sites.replaceBy(((PersistedList)file.unmarshal(sites)).toList()); } catch (IOException e) { LOGGER.log(Level.WARNING, "Failed to load "+file, e); sites.remove(site); } else if (ID_DEFAULT.equals(site.getId())) { defaultSiteExists = true; sites.add(createDefaultUpdateSite()); if (sites.isEmpty()) { sites.add(createDefaultUpdateSite());
public void sameCheckoutMultibranch() throws Exception { prepRepoWithJenkinsfile("restart", "sameCheckoutMultibranch"); WorkflowMultiBranchProject mp = j.jenkins.createProject(WorkflowMultiBranchProject.class, "sameCheckoutParent"); mp.getSourcesList().add(new BranchSource(new GitSCMSource(null, sampleRepo.toString(), "", "*", "", false))); WorkflowJob p = WorkflowMultiBranchProjectTest.scheduleAndFindBranchProject(mp, "master"); j.waitUntilNoActivity(); WorkflowRun b1 = p.getLastBuild(); assertNotNull(b1); assertEquals(1, b1.getNumber()); j.assertBuildStatus(Result.FAILURE, b1); assertEquals(p.getAbsoluteUrl(), redirect.getUrl().toString()); j.waitUntilNoActivity(); WorkflowRun b2 = p.getBuildByNumber(2); assertNotNull(b2); j.assertBuildStatusSuccess(b2);
@Issue("JENKINS-40521") @Test public void deletedBranch() throws Exception { r.jenkins.setSecurityRealm(r.createDummySecurityRealm()); sampleGitRepo.init(); sampleGitRepo.git("add", "somefile"); sampleGitRepo.git("commit", "--all", "--message=tweaked"); WorkflowMultiBranchProject mp = r.jenkins.createProject(WorkflowMultiBranchProject.class, "p"); mp.getSourcesList().add(new BranchSource(new GitSCMSource(null, sampleGitRepo.toString(), "", "*", "", false))); mp.setOrphanedItemStrategy(new DefaultOrphanedItemStrategy(false, "", "")); WorkflowJob p = WorkflowMultiBranchProjectTest.scheduleAndFindBranchProject(mp, "feature"); assertEquals(2, mp.getItems().size()); r.waitUntilNoActivity(); WorkflowRun b1 = p.getLastBuild(); assertEquals(1, b1.getNumber()); Authentication auth = User.get("dev").impersonate(); assertFalse(p.getACL().hasPermission(auth, Item.DELETE)); assertTrue(p.isBuildable()); sampleGitRepo.git("checkout", "master"); sampleGitRepo.git("branch", "-D", "feature"); Util.deleteRecursive(new File(r.jenkins.getRootDir(), "caches")); WorkflowRun b2 = r.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); r.assertLogContains("nondeterministic checkout", b2); // SCMBinder r.assertLogContains("Could not determine exact tip revision of feature", b2); // SCMVar
sampleSvnRepo.svnkit("add", sampleSvnRepo.wc() + "/Jenkinsfile"); sampleSvnRepo.svnkit("commit", "--message=flow", sampleSvnRepo.wc()); WorkflowMultiBranchProject mp = r.jenkins.createProject(WorkflowMultiBranchProject.class, "p"); mp.getSourcesList().add(new BranchSource(new SubversionSCMSource(null, sampleSvnRepo.prjUrl()))); WorkflowJob p = WorkflowMultiBranchProjectTest.scheduleAndFindBranchProject(mp, "trunk"); SemaphoreStep.waitForStart("wait/1", null); WorkflowRun b1 = p.getLastBuild(); assertNotNull(b1); assertEquals(1, b1.getNumber()); sampleSvnRepo.write("Jenkinsfile", "node {checkout scm; echo readFile('file').toUpperCase()}"); sampleSvnRepo.write("file", "subsequent content"); sampleSvnRepo.svnkit("commit", "--message=tweaked", sampleSvnRepo.wc()); SemaphoreStep.success("wait/1", null); WorkflowRun b2 = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); assertEquals(2, b2.getNumber()); r.assertLogContains("initial content", r.waitForCompletion(b1)); r.assertLogContains("SUBSEQUENT CONTENT", b2); List<ChangeLogSet<? extends ChangeLogSet.Entry>> changeSets = b2.getChangeSets();
public void changelogChangesetAndRestart() throws Exception { prepRepoWithJenkinsfile("restart", "changelogChangesetAndRestart"); WorkflowMultiBranchProject mp = j.jenkins.createProject(WorkflowMultiBranchProject.class, "changelogChangesetParent"); mp.getSourcesList().add(new BranchSource(new GitSCMSource(null, sampleRepo.toString(), "", "*", "", false))); WorkflowJob p = WorkflowMultiBranchProjectTest.scheduleAndFindBranchProject(mp, "master"); j.waitUntilNoActivity(); WorkflowRun original = p.getLastSuccessfulBuild(); assertNotNull(original); sampleRepo.git("commit", "--message=tada"); WorkflowRun failing = p.scheduleBuild2(0).waitForStart(); j.assertBuildStatus(Result.FAILURE, j.waitForCompletion(failing)); assertNotNull(failing.getChangeSets()); assertFalse(failing.getChangeSets().isEmpty()); assertEquals(1, failing.getChangeSets().size()); ChangeLogSet<? extends ChangeLogSet.Entry> failingChanges = failing.getChangeSets().get(0); assertEquals(1, failingChanges.getItems().length); assertEquals(p.getAbsoluteUrl(), redirect.getUrl().toString()); j.waitUntilNoActivity();
@Test public void deletedJenkinsfile() throws Exception { sampleGitRepo.init(); sampleGitRepo.write("Jenkinsfile", "node { echo 'Hello World' }"); sampleGitRepo.git("add", "Jenkinsfile"); sampleGitRepo.git("commit", "--all", "--message=flow"); WorkflowMultiBranchProject mp = r.jenkins.createProject(WorkflowMultiBranchProject.class, "p"); mp.getSourcesList().add(new BranchSource(new GitSCMSource(null, sampleGitRepo.toString(), "", "*", "", false))); WorkflowJob p = WorkflowMultiBranchProjectTest.scheduleAndFindBranchProject(mp, "master"); assertEquals(1, mp.getItems().size()); r.waitUntilNoActivity(); WorkflowRun b1 = p.getLastBuild(); assertEquals(1, b1.getNumber()); sampleGitRepo.git("rm", "Jenkinsfile"); sampleGitRepo.git("commit", "--all", "--message=remove"); WorkflowRun b2 = r.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); r.assertLogContains("Jenkinsfile not found", b2); }
@SuppressWarnings("deprecation") // RunList.size @Test public void useBuildDiscarder() throws Exception { sampleRepo.init(); sampleRepo.write("Jenkinsfile", "properties([buildDiscarder(logRotator(numToKeepStr: '1'))])"); sampleRepo.git("add", "Jenkinsfile"); sampleRepo.git("commit", "--all", "--message=flow"); WorkflowMultiBranchProject mp = r.jenkins.createProject(WorkflowMultiBranchProject.class, "p"); mp.getSourcesList().add(new BranchSource(new GitSCMSource(null, sampleRepo.toString(), "", "*", "", false))); WorkflowJob p = scheduleAndFindBranchProject(mp, "master"); assertEquals(1, mp.getItems().size()); r.waitUntilNoActivity(); // #1 built automatically assertEquals(1, p.getBuilds().size()); r.assertBuildStatusSuccess(p.scheduleBuild2(0)); // #2 assertEquals(1, p.getBuilds().size()); r.assertBuildStatusSuccess(p.scheduleBuild2(0)); // #3 assertEquals(1, p.getBuilds().size()); WorkflowRun b3 = p.getLastBuild(); assertEquals(3, b3.getNumber()); assertNull(b3.getPreviousBuild()); }
sampleRepo.git("commit", "--message=init"); WorkflowMultiBranchProject p = r.jenkins.createProject(WorkflowMultiBranchProject.class, "p"); BranchSource branchSource = new BranchSource(new GitSCMSource("source-id", sampleRepo.toString(), "", "*", "", false)); p.getSourcesList().add(branchSource); r.waitUntilNoActivity(); r.assertBuildStatusSuccess(master.getBuildByNumber(1)); assertEquals(2, master.getNextBuildNumber()); assertNotNull(master.getProperty(OverrideIndexTriggersJobProperty.class)); assertFalse(master.getProperty(OverrideIndexTriggersJobProperty.class).getEnableTriggers()); WorkflowRun secondBuild = r.assertBuildStatusSuccess(master.scheduleBuild2(0)); assertNotNull(secondBuild); assertEquals(2, secondBuild.getNumber()); assertEquals(3, master.getNextBuildNumber()); assertNull(master.getProperty(OverrideIndexTriggersJobProperty.class));
@Test public void durabilityHintByPropertyStep() throws Exception { sampleRepo.init(); sampleRepo.write("Jenkinsfile", "properties([durabilityHint('" + FlowDurabilityHint.SURVIVABLE_NONATOMIC.getName()+"')])\n"+ "echo 'whynot'"); sampleRepo.git("add", "Jenkinsfile"); sampleRepo.git("commit", "--all", "--message=flow"); WorkflowMultiBranchProject mp = r.jenkins.createProject(WorkflowMultiBranchProject.class, "p"); mp.getSourcesList().add(new BranchSource(new GitSCMSource(null, sampleRepo.toString(), "", "*", "", false))); WorkflowJob p = scheduleAndFindBranchProject(mp, "master"); r.waitUntilNoActivity(); WorkflowRun b1 = p.getLastBuild(); Assert.assertEquals(Result.SUCCESS, b1.getResult()); DurabilityHintJobProperty prop = p.getProperty(DurabilityHintJobProperty.class); Assert.assertEquals(FlowDurabilityHint.SURVIVABLE_NONATOMIC, prop.getHint()); }
@Issue("JENKINS-37005") @Test public void noPropertiesWarnings() throws Exception { sampleRepo.init(); sampleRepo.write("Jenkinsfile", "echo \"branch=${env.BRANCH_NAME}\"\n" + "properties([disableConcurrentBuilds()])"); sampleRepo.write("file", "initial content"); sampleRepo.git("add", "Jenkinsfile"); sampleRepo.git("commit", "--all", "--message=flow"); WorkflowMultiBranchProject mp = r.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()); } WorkflowJob p = scheduleAndFindBranchProject(mp, "master"); assertEquals(new GitBranchSCMHead("master"), SCMHead.HeadByItem.findHead(p)); assertEquals(1, mp.getItems().size()); r.waitUntilNoActivity(); WorkflowRun b1 = p.getLastBuild(); assertEquals(1, b1.getNumber()); // Now verify that we don't get any messages about removing properties when a property actually gets removed as // we add a new one. sampleRepo.write("Jenkinsfile", "echo \"branch=${env.BRANCH_NAME}\"\n" + "properties([buildDiscarder(logRotator(numToKeepStr: '1'))])"); sampleRepo.git("add", "Jenkinsfile"); sampleRepo.git("commit", "--all", "--message=flow"); r.assertBuildStatusSuccess(p.scheduleBuild2(0)); }
sampleGitRepo.git("add", "Jenkinsfile"); sampleGitRepo.git("commit", "--all", "--message=flow"); WorkflowMultiBranchProject mp = r.jenkins.createProject(WorkflowMultiBranchProject.class, "p"); mp.getSourcesList().add(new BranchSource(new GitSCMSource(null, sampleGitRepo.toString(), "", "*", "", false))); WorkflowJob p = WorkflowMultiBranchProjectTest.scheduleAndFindBranchProject(mp, "master"); SemaphoreStep.waitForStart("wait/1", null); WorkflowRun b1 = p.getLastBuild(); assertNotNull(b1); assertEquals(1, b1.getNumber()); assertRevisionAction(b1); r.assertLogContains("Obtained Jenkinsfile from ", b1); sampleGitRepo.write("Jenkinsfile", "node {checkout scm; echo readFile('file').toUpperCase()}"); sampleGitRepo.write("file", "subsequent content"); SemaphoreStep.success("wait/1", null); sampleGitRepo.notifyCommit(r); WorkflowRun b2 = p.getLastBuild(); assertEquals(2, b2.getNumber()); r.assertLogContains("initial content", r.waitForCompletion(b1)); r.assertLogContains("SUBSEQUENT CONTENT", b2); assertRevisionAction(b2); WorkflowMultiBranchProjectTest.showIndexing(mp); List<ChangeLogSet<? extends ChangeLogSet.Entry>> changeSets = b2.getChangeSets(); assertEquals(1, changeSets.size()); ChangeLogSet<? extends ChangeLogSet.Entry> changeSet = changeSets.get(0);
@Issue("JENKINS-30206") @Test public void singleRepo() throws Exception { round1(); WorkflowMultiBranchProject p = r.jenkins.createProject(WorkflowMultiBranchProject.class, "p"); BranchSource branchSource = new BranchSource(new GitSCMSource("source-id", sampleRepo.toString(), "", "*", "", false)); branchSource.setStrategy(new NamedExceptionsBranchPropertyStrategy(new BranchProperty[0], new NamedExceptionsBranchPropertyStrategy.Named[] { new NamedExceptionsBranchPropertyStrategy.Named("release*", new BranchProperty[] {new NoTriggerBranchProperty()}) })); p.getSourcesList().add(branchSource); QueueTaskFuture<WorkflowRun> releaseBuild = release.scheduleBuild2(0); assertNotNull(releaseBuild); assertEquals(1, releaseBuild.get().getNumber()); assertEquals(2, release.getNextBuildNumber()); new NamedExceptionsBranchPropertyStrategy.Named("master", new BranchProperty[] {new NoTriggerBranchProperty()}) })); p.getSourcesList().clear(); p.getSourcesList().add(branchSource); round3(); WorkflowMultiBranchProjectTest.showIndexing(p);
sampleGitRepo.git("commit", "--all", "--message=flow"); WorkflowMultiBranchProject mp = story.j.jenkins.createProject(WorkflowMultiBranchProject.class, "p"); mp.getSourcesList().add(new BranchSource(new GitSCMSource(null, sampleGitRepo.toString(), "", "*", "", false), new DefaultBranchPropertyStrategy(new BranchProperty[0]))); WorkflowJob p = WorkflowMultiBranchProjectTest.scheduleAndFindBranchProject(mp, "master"); WorkflowRun b = story.j.assertBuildStatusSuccess(p.scheduleBuild2(0)); story.j.assertLogContains("loaded resource content", b);
@Issue("JENKINS-32179") @Test public void conflictingBranches() throws Exception { sampleRepo.init(); sampleRepo.write("Jenkinsfile", ""); sampleRepo.git("add", "Jenkinsfile"); sampleRepo.git("commit", "--all", "--message=flow"); WorkflowMultiBranchProject mp = r.jenkins.createProject(WorkflowMultiBranchProject.class, "p"); mp.getSourcesList().add(new BranchSource(new GitSCMSource(null, sampleRepo.toString(), "", "*", "", false), new DefaultBranchPropertyStrategy(new BranchProperty[0]))); mp.getSourcesList().add(new BranchSource(new GitSCMSource(null, sampleRepo.toString(), "", "*", "", false), new DefaultBranchPropertyStrategy(new BranchProperty[0]))); WorkflowJob p = scheduleAndFindBranchProject(mp, "master"); mp.getIndexing().writeWholeLogTo(System.out); assertEquals(1, mp.getItems().size()); r.waitForCompletion(p.getLastBuild()); Thread.sleep(1000); assert !p.isBuilding(); WorkflowRun b1 = p.getLastBuild(); assertEquals(1, b1.getNumber()); Queue.Item it = mp.scheduleBuild2(0); Thread.sleep(100); if (it != null) { System.out.println("indexing"); } it.getFuture().waitForStart(); it.getFuture().get(); // mp.scheduleBuild2(0).getFuture().get(); // mp.getIndexing().writeWholeLogTo(System.out); // assertEquals("[p, p/master]", ExtensionList.lookup(Listener.class).get(0).names.toString()); } @TestExtension("conflictingBranches") public static class Listener extends ItemListener {
@Test public void configRoundtrip() throws Exception { WorkflowMultiBranchProject mp = r.jenkins.createProject(WorkflowMultiBranchProject.class, "p"); BranchSource bs = new BranchSource(new GitSCMSource(null, sampleRepo.toString(), "", "*", "", false)); mp.getSourcesList().add(bs); bs.setStrategy(new DefaultBranchPropertyStrategy(new BranchProperty[]{new DurabilityHintBranchProperty(FlowDurabilityHint.SURVIVABLE_NONATOMIC)})); r.configRoundtrip(mp); DefaultBranchPropertyStrategy strat = (DefaultBranchPropertyStrategy)(mp.getBranchPropertyStrategy(mp.getSCMSources().get(0))); DurabilityHintBranchProperty prop = null; for (BranchProperty bp : strat.getProps()) { if (bp instanceof DurabilityHintBranchProperty) { prop = (DurabilityHintBranchProperty)bp; break; } } Assert.assertNotNull(prop); Assert.assertEquals(FlowDurabilityHint.SURVIVABLE_NONATOMIC, prop.getHint()); }
@Override public void evaluate() throws Throwable { sampleGitRepo.init(); sampleGitRepo.write("Jenkinsfile", "def _scm = scm; semaphore 'wait'; node {checkout _scm; echo readFile('file')}"); sampleGitRepo.write("file", "initial content"); sampleGitRepo.git("add", "Jenkinsfile"); sampleGitRepo.git("commit", "--all", "--message=flow"); WorkflowMultiBranchProject mp = story.j.jenkins.createProject(WorkflowMultiBranchProject.class, "p"); mp.getSourcesList().add(new BranchSource(new GitSCMSource(null, sampleGitRepo.toString(), "", "*", "", false), new DefaultBranchPropertyStrategy(new BranchProperty[0]))); WorkflowJob p = WorkflowMultiBranchProjectTest.scheduleAndFindBranchProject(mp, "master"); SemaphoreStep.waitForStart("wait/1", null); WorkflowRun b1 = p.getLastBuild(); assertNotNull(b1); } });